我正在转换构建过程以使用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.y包含q_parser.h,它输出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 - &gt; .c和.y - &gt; .c所以我遇到了gcc试图读取.l - &gt;的错误。 .c输出并自行摔倒。
我需要覆盖automake才能执行.l - &gt; .h然后我应该可以让它开轮。有什么提示吗?
答案 0 :(得分:2)
你可以绕过所有那些整洁的东西,因为它阻碍了你:
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兼容性无论如何都不是你想要的。