5

我正在尝试使用 etags 为大型软件项目生成 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

解决方案是改为以 etgas 模式并递归地运行Exuberant Ctags。您通过创建一个名为 etags 到 exuberant ctags 的链接来使 exuberant ctags 在 etags 模式下运行,它会检测到它是作为 etags 启动的并且行为适当:

电子标签-R。

或者 -e 表示 etags 模式:

ctags -e -R。

于 2011-11-28T20:29:05.473 回答