【问题标题】:Using prefix option for flex in automake/flex/bison stack在 automake/flex/bison 堆栈中为 flex 使用前缀选项
【发布时间】: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


【解决方案1】:

你可以绕过所有这些整洁的东西,因为它会妨碍你:

q_parser.h : ../../code/q_parser.l
        $(LEX) $(LFLAGS) $(AM_LFLAGS) -Pq_parser_yy -o$@ $<
q_parser.c : ../../code/q_parser.y q_parser.h
        $(YACC) $(YFLAGS) $< -o $@

无论如何,POSIX 兼容性似乎不是您现在所追求的。

【讨论】:

  • 好点——我可以覆盖目标。你会认为这是一种构建气味吗?
  • 为什么会有异味?它只是在做你已经在做的事情,只是使用 make 来跟踪重建的时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 1970-01-01
  • 2012-09-27
  • 1970-01-01
  • 2013-10-24
相关资源
最近更新 更多