覆盖make中的构建规则

时间:2009-09-25 17:27:34

标签: build-process makefile

我正在使用Makefile来构建嵌入式项目。我从许多以前没有充分利用Make的开发人员那里继承了这个项目,我希望能够使用build命令中的define在makefile中指定项目版本。但是,已经有一个构建规则来构建所有对象(.o)文件。有没有办法覆盖特定对象文件的构建规则,以便我可以向编译器添加-D标志?

我希望能够在makefile中指定项目版本的另一个原因是,我可以让它在构建过程生成的结果文件的名称中使用构建版本生成工件。

2 个答案:

答案 0 :(得分:0)

  1. 是的,您可以覆盖模式规则(这是我打赌你的.o规则),只需要有一个特定的规则(并且规则的顺序无关紧要):
    %.o:
        do_generic_things
    x.o:
        do_specific_things -Dproject_version
    
  2. 是的,您可以将构建版本放在文件名中。有多种方法可以做到 - 最好的方法是把它放在目标名称中:
    %$(B_VERSION).o: %.c
        $(CC) -c -DBUILD_VERSION=$(B_VERSION) -Whatever $< -o $@
    

答案 1 :(得分:0)

如果您使用的是GNU make而您只想更改编译器选项,则可以使用特定于目标的变量,如下所示:

x.o: CFLAGS += -DEXTRA_SYMBOL_FOR_X

这也是递归工作的,即xo的特定于目标的值也对xo所依赖的所有目标都有效,这意味着如果在makefile中构建多个可执行文件,则可以在可执行文件上设置特定于目标的变量本身,它将对所有目标文件有效:

foo: CFLAGS += -DEXTRA_SYMBOL_FOR_FOO_APP