(Gnu)make:使用特殊编译器开关的多个目标

时间:2015-04-27 04:35:40

标签: design-patterns makefile bison flex-lexer

我在使用makefile时遇到问题。我有几个解析XML模式的解析器如下:

$(srcdir)/schema_1_parser.cpp: \
                 $(srcdir)/schema_1_parser.l \
                 $(srcdir)/schema_1_parser.tab.cpp
    $(LEX) -Pschema_1 -o$(srcdir)/schema_1_parser.cpp \
                        $(srcdir)/schema_1_parser.l

$(srcdir)/schema_1_parser.tab.cpp $(srcdir)/schema_1_parser.tab.hpp: \
                $(srcdir)/schema_1_parser.y
    $(YACC) -ldv -p schema_1 -o $(srcdir)/schema_1_parser.tab.cpp \
                                $(srcdir)/schema_1_parser.y

有多个这样的规则对,使用schema_2,schema_3等。如果可以,名称会遵循我想要利用的模式。 (目前我只有特殊规则。)

我添加了第二个目标$(srcdir)/schema_1_parser.tab.hpp,因为makefile错误"不知道如何制作schema_1_parser.tab.hpp",即使标题与.tab一起自动生成。 cpp文件。

现在,野牛解析器被调用了两次。我读到了这一点,并且我相信这是具有多个目标的特殊规则的预期行为,而我应该使用模式规则。但是,我有点不确定flex的命令行选项-Pschema_1和野牛的-p schema_1是什么。我可以使用这种模式来照顾这些吗? (我的经历是消极的,但我可能会遗漏其他东西。)

1 个答案:

答案 0 :(得分:0)

好吧,我们无法给你一个完整的答案,因为你没有向我们展示任何其他规则,所以我们不知道它们之间的模式部分是什么。但是,当然,有多种方法可以处理您描述的情况。如果您的解析器都匹配模式%_parser.y%_parser.l,您可以编写如下规则:

$(srcdir)/%_parser.cpp: \
             $(srcdir)/%_parser.l \
             $(srcdir)/%_parser.tab.cpp
        $(LEX) -P$* -o$@ $<

$(srcdir)/%_parser.tab.cpp $(srcdir)/%_parser.tab.hpp: \
            $(srcdir)/%_parser.y
        $(YACC) -ldv -p $* -o $(srcdir)/$*_parser.tab.cpp $<

因为$*扩展到模式的主干。

如果这不起作用,您可以使用递归变量:

NAME_schema_1_parser = schema_1

$(srcdir)/%.cpp: $(srcdir)/%.l $(srcdir)/%.tab.cpp
        $(LEX) -P$(NAME_$*) -o$@ $<

$(srcdir)/%.tab.cpp $(srcdir)/%.tab.hpp: $(srcdir)/%.y
        $(YACC) -ldv -p $(NAME_$*) -o $(srcdir)/$*_parser.tab.cpp $<

您也可以使用特定于目标或特定于模式的变量。