5

大規模なソフトウェア プロジェクトで etags を使用して TAGS テーブルを生成しようとしています。TAGS ファイルは、lex/yacc で生成された .c ファイルの #line ディレクティブが # の代わりに非修飾ファイル名を参照するため、サブディレクトリに存在するファイルではなく、最上位に存在しないファイルへのエントリを持つことになります。ファイルを含むサブディレクトリを含む行。

トップレベルのファイルとして解釈されるのではなく、サブディレクトリ内の既存のファイルに適切に解決されたこれらの #line ディレクティブを使用して TAGS テーブルを生成するにはどうすればよいですか?

最上位ディレクトリから次のような etags を実行します。

rm -f TAGS; find . \( -not -regex '.*include/.*' \)
                -a \( -name '*.h' -o -name '*.hh' -o -name '*.y' -o -name '*.l'
                   -o -name '*.cc' -o -name '*.cpp' -o -name '*.hpp' -o -name '*.c'
                   -o -name '*.inl' \)
             | xargs etags -o TAGS --append

しかし、生成されたファイルの途中に次の行を含むファイル act/Par.c があります。

#define T_NUM 274
#define T_STRING 275

#line 5 "Par.y"

#undef actCPMeshConfigIn_yywrap
#define actCPMeshConfigIn_YYMAXDEPTH 20000

その結果、次の TAGS テーブル エントリが生成されます。

act/Par.c,1160
[...]
#define T_NUM 92,2870
#define T_STRING 93,2888

Par.y,1320
#undef actCPMeshConfigIn_yywrap20,
#define actCPMeshConfigIn_YYMAXDEPTH 22,

しかし、ファイル Par.y は実際には act/Par.y にありますが、#line ディレクティブは現在のファイルに対して相対的ですが、TAGS はそれを生成された TAGS ファイルに対して相対的にします。

プロジェクトのビルド方法を変更せずに、TAGS ファイルを生成して、これらの #line ディレクティブが、それらが含まれるファイルに関連するものとして適切に解釈されるようにするにはどうすればよいですか? または、これらの面倒なファイルを簡単にスキップするにはどうすればよいですか?

4

1 に答える 1

0

解決策は、代わりにExuberant Ctagsを etgas モードで再帰的に実行することです。exuberant ctags への etags という名前のリンクを作成して、exuberant ctags を etags モードで実行すると、etags として起動されたことが検出され、適切に動作します。

etags -R .

または -e は etags モードを意味します。

ctags -e -R 。

于 2011-11-28T20:29:05.473 に答える