【问题标题】:Overriding build rules in make在make中覆盖构建规则
【发布时间】:2009-09-25 17:27:34
【问题描述】:
我正在使用 Makefile 来构建嵌入式项目。我从许多以前没有充分利用 Make 的开发人员那里继承了这个项目,我希望能够使用 build 命令上的定义在 makefile 中指定项目版本。但是,已经有一个构建规则可以构建所有对象 (.o) 文件。有什么方法可以覆盖特定目标文件的构建规则,以便我可以将 -D 标志添加到编译器?
我希望能够在 makefile 中指定项目版本的另一个原因是,我可以让它在构建过程生成的结果文件的名称中生成具有构建版本的工件。
【问题讨论】:
标签:
build-process
makefile
【解决方案1】:
- 是的,您可以覆盖模式规则(我敢打赌您的 .o 规则就是这样),只需使用特定规则(并且规则的顺序无关紧要):
%.o:
do_generic_things
x.o:
do_specific_things -Dproject_version
- 是的,您可以将构建版本放在文件名中。有不止一种方法可以做到——最好的可能是将它放在目标名称中:
%$(B_VERSION).o: %.c
$(CC) -c -DBUILD_VERSION=$(B_VERSION) -随便 $< -o $@
【解决方案2】:
如果您使用 GNU make 并且只想更改编译器选项,则可以使用 目标特定变量,如下所示:
x.o: CFLAGS += -DEXTRA_SYMBOL_FOR_X
这也可以递归工作,即 x.o 的特定于目标的值也对 x.o 依赖的所有目标有效,这意味着如果您在 makefile 中构建多个可执行文件,您可以在可执行文件上设置特定于目标的变量对所有目标文件都有效:
foo: CFLAGS += -DEXTRA_SYMBOL_FOR_FOO_APP