【发布时间】:2011-10-28 14:31:09
【问题描述】:
我正在将构建过程转换为使用 automake/libtool,但我遇到了支持 .l/.y 集的障碍。
最初的构建过程做了这两个步骤:
flex -t -Pq_parser_yy ../../code/q_parser.l > q_parser.h
bison ../../code/q_parser.y -o q_parser.c
Flex:我不知道如何从 Makefile.am 重新创建 -P 选项。在我的 Makefile.am 中,我只列出 q_parser.l 并让 automake 弄清楚要做什么——但它输出的是 q_parser.c 而不是 q_parser.h。
q_parser.h 然后被 q_parser.y 包含,输出 q_parser.c。对于从未使用过 flex/bison 的人来说非常困惑!
那么它是如何从 automake 工作的:
.l.c:
$(am__skiplex) $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE)
q_parser.c: $(db_dir)/q_parser.l
$(am__skiplex) \
$(SHELL) $(YLWRAP) `test -f '$(db_dir)/q_parser.l' || echo '$(srcdir)/'`$(db_dir)/q_parser.l $(LEX_OUTPUT_ROOT).c q_parser.c -- $(LEX) $(LFLAGS) $(AM_LFLAGS)
.y.c:
$(am__skipyacc) $(SHELL) $(YLWRAP) $< y.tab.c $@ y.tab.h $*.h y.output $*.output -- $(YACCCOMPILE)
所以 automake 正在映射 .l -> .c 和 .y -> .c 所以我遇到了 gcc 试图读取 .l -> .c 输出并自行摔倒的错误。
我需要重写 automake 来执行 .l -> .h 然后我应该可以让它控制。有什么建议吗?
【问题讨论】:
-
名义上,Flex 部分将通过将
-t -P q_parser_yy添加到 LFLAGS 来实现。或者,您可以使用--header-file=q_parser.h选项代替-t选项。 -
感谢您指出 --header-file 选项。看来我将在这件事上继续与 automake 抗争,因为 --header-file 选项不受支持。构建过程假定文件名中的输出为 .c 而不是 .h。 lists.gnu.org/archive/html/automake/2011-06/msg00004.html
-
删除了 libtool 标签,因为它似乎与 libtool 没有太大关系。
标签: makefile bison flex-lexer automake