在单个makefile中从同一源代码构建多个配置
我有一小部分C的源代码文件。我正试图为它们拼凑一个Makefile,从同一组源代码中构建几个不同的输出。每个输出都使用特定于目标的变量进行定制 (现实世界中的例子是在几个不同的电路板版本上运行的固件,但它是从相同的源代码构建的,并使用条件编译进行定制。) 下面是一个示例Makefile,说明了我遇到的问题:在单个makefile中从同一源代码构建多个配置,makefile,gnu-make,Makefile,Gnu Make,我有一小部分C的源代码文件。我正试图为它们拼凑一个Makefile,从同一组源代码中构建几个不同的输出。每个输出都使用特定于目标的变量进行定制 (现实世界中的例子是在几个不同的电路板版本上运行的固件,但它是从相同的源代码构建的,并使用条件编译进行定制。) 下面是一个示例Makefile,说明了我遇到的问题: CINPUTFILES = Testfile.c all: v12target v13target # the same source code is built several dif
CINPUTFILES = Testfile.c
all: v12target v13target
# the same source code is built several different ways depending on a
# list of preset configurations
v12target: lots_of_common_variables = hello
v12target: more_variables = v12_specific
v12target: Rev12Output.mycommontargets
v13target: lots_of_common_variables = hello
v13target: more_variables = v13_specific
v13target: Rev13Output.mycommontargets
# (more vXXtarget targets omitted)
# TODO: why is @echo required?
%.mycommontargets: %.hex %.elf
@echo
# TODO: why are these output files deleted?
%.elf: $(CINPUTFILES)
cp $< $@
%.hex: %.elf
cp $< $@
# TODO: correct way of adding the dummy mycommontargets to PHONY?
.PHONY : all clean
为什么会发生这种情况?我需要做些什么来摆脱它
@echo
保留在适当的位置,则生成将成功完成。但是make决定继续并删除输出
$ make
cp Testfile.c Rev12Output.elf
cp Rev12Output.elf Rev12Output.hex
cp Testfile.c Rev13Output.elf
cp Rev13Output.elf Rev13Output.hex
rm Rev12Output.hex Rev12Output.elf Rev13Output.hex Rev13Output.elf
为什么我们要这样做?什么决定了它何时会这样做,何时不这样做?我以前从未意识到make甚至有能力删除这样的文件;这与增量构建的整个理念背道而驰,我认为make应该帮助实现增量构建。我宁愿保留所有中间文件和输出文件mycommontargets
模式添加到.PHONY
的正确方法是什么@echo
留在原地,然后将每个目标添加到.PRECIOUS
。但是,尽管我对make没有太多经验,但我有一种强烈的感觉,如果我不得不使用像@echo
这样的黑客,并且使用像.PRECIOUS
这样更模糊的特殊目标,我就错了。只是感觉不对劲
(很抱歉在空白处为一个问题问了三个问题,但我感觉它们之间有着密切的联系……)
.SECONDARY
目标,即在某处添加一行,只说:
.中学:配置
的参数。让configure从中心源代码树为每个主机板生成一个生成树,并在这些生成树中生成
$ make
cp Testfile.c Rev12Output.elf
cp Rev12Output.elf Rev12Output.hex
cp Testfile.c Rev13Output.elf
cp Rev13Output.elf Rev13Output.hex
rm Rev12Output.hex Rev12Output.elf Rev13Output.hex Rev13Output.elf