我如何 运行 两个 makefile 目标,以便第二个使用第一个的变量?

How can I run two makefile targets such that the second uses the first's variables?

我正在编写一个包含多个体系结构和构建类型目标的 makefile。当我调用 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

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

.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