Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在单个makefile中从同一源代码构建多个配置_Makefile_Gnu Make - Fatal编程技术网

在单个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

我有一小部分C的源代码文件。我正试图为它们拼凑一个Makefile,从同一组源代码中构建几个不同的输出。每个输出都使用特定于目标的变量进行定制

(现实世界中的例子是在几个不同的电路板版本上运行的固件,但它是从相同的源代码构建的,并使用条件编译进行定制。)

下面是一个示例Makefile,说明了我遇到的问题:

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
    这样更模糊的特殊目标,我就错了。只是感觉不对劲

    (很抱歉在空白处为一个问题问了三个问题,但我感觉它们之间有着密切的联系……)

  • 问题是,每个非虚假目标都需要一个规则来确定。但是,您不能使模式规则的目标虚假。在您的情况下,我建议保留@echo(更好的方法是:用@true替换它以避免虚假的输出行)
  • 输出文件是中间文件,即Makefile中没有明确提到,但模式规则需要。默认情况下,make删除所有中间文件。在这里禁用自动删除的最简单方法是在没有先决条件的情况下提及
    .SECONDARY
    目标,即在某处添加一行,只说:

    .中学:

  • 如果你真的需要在这里做假,你必须生活在没有模式规则的环境中。这在你的布局中是很不受欢迎的,所以最好还是顺其自然吧

  • 总的来说,我建议这里的布局更为传统。通常,您会将交叉编译问题排除在Makefile之外,并将主机板(autotools术语:主机板是软件将在其上运行的板)作为
    配置
    的参数。让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