我正在尝试使用 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 指令正确解释为与它们所在的文件相关?或者,我怎样才能轻松跳过这些麻烦的文件?