【问题标题】:How can I run two makefile targets such that the second uses the first's variables?如何运行两个 makefile 目标,以便第二个使用第一个变量?
【发布时间】:2018-11-16 02:03:32
【问题描述】:

我正在编写一个生成文件,该文件具有多个针对体系结构和构建类型的目标。当我调用 make 时,我希望能够将两个目标传递给它,例如:

make x86 debug

架构目标设置构建目标使用的变量。架构目标可能如下所示:

.PHONY: x86
x86: NAME_PREFIX = x86_64_Linux
x86: TARGET_TRIPLE = x86_64-pc-linux-elf
x86: CC = gcc
x86: CFLAGS += -fomit-frame-pointer

第一个问题:如果我运行两个目标,make 会跳过第一个目标,因为它除了设置变量什么都不做。

$ make x86 debug
make: Nothing to be done for `x86'.

第二个问题:即使它会运行第一个目标,我的理解是当 make 开始运行第二个目标时,这些值不会被保留。

目前,我正在使用设置变量并在目标主体末尾添加构建类型目标作为先决条件的目标,但最终我需要为架构和构建类型的每种组合设置一个目标。

.PHONY: x86_debug
x86_debug: NAME_PREFIX = x86_64_Linux
x86_debug: TARGET_TRIPLE = x86_64-pc-linux-elf
x86_debug: CC = gcc
x86_debug: CFLAGS += -fomit-frame-pointer
x86_debug: debug

【问题讨论】:

    标签: makefile gnu-make


    【解决方案1】:

    您的第二种方法更好。但是,如果您使用一致的命名方案并使用通配符目标,则不需要为每个组合指定一个目标:

    .PHONY: x86_% arm_% # etc
    .PHONY: %_debug %_optimised # etc
    
    x86_%: NAME_PREFIX = x86_64_Linux
    x86_%: TARGET_TRIPLE = x86_64-pc-linux-elf
    x86_%: CC = gcc
    x86_%: CFLAGS += -fomit-frame-pointer
    
    arm_%: NAME_PREFIX = ARM_LINUX
    arm_%: TARGET_TRIPLE = arm-linux-eabi
    arm_%: CC = arm-linux-gcc
    
    
    %_debug: CFLAGS += -g
    
    %_optimised: CFLAGS += -O3
    

    【讨论】:

    • 我相应地修改了我的 makefile,但 make 似乎没有将 % 识别为通配符。我正在使用 GNU Make 3.82。
    • 我确定我以前做过类似的事情。你确实包含了一个带有规则的目标,对吧?
    • 是的,构建目标有规则。尽管有示例中的目标x86_% 和调用编译器的%_debug 目标,但我只是得到make: *** No rule to make target 'x86_debug'. Stop.
    • 我发现了问题所在。我有一个额外的目标clean,我将其更改为%_clean,因此我可以使用它来代替我的构建类型目标。我的%_debug 目标在编译之前运行clean,所以我将先决条件更改为_clean。问题是词干不能是零长度字符串,所以_clean 不匹配%_clean。我原以为 make 会给我一个更有帮助的错误,例如“没有规则使 %_debug 需要目标 _clean”或类似的东西。
    • 这样的错误没有多大意义。模式是关于构建目标的一种可能方式的提示。您可以拥有许多可用于构建相同目标的模式(将%.o 视为模式目标......!)所以如果给定的模式不匹配,make 不能说这是一个错误。它转到下一个。只有在没有模式匹配的情况下,才能断定不存在构建给定目标的规则。它不能为每个无法为每个匹配目标的模式规则构建的先决条件吐出错误。
    猜你喜欢
    • 1970-01-01
    • 2021-05-13
    • 1970-01-01
    • 2017-06-20
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    相关资源
    最近更新 更多