我正在编写一个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
答案 0 :(得分:0)
您的第二种方法更好。但是,如果您使用一致的命名方案并使用通配符目标,则不需要为每个组合指定目标:
.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