我正在尝试构建一个 Makefile,它可以通过指定目标而不是变量(例如make debug=1
,不太好)我这里有一个精简的简化示例,它模拟了我想要实现的目标:
ifdef debug
BINARY=my_binary_debug
MODULE_1_BIN=abc_debug
MODULE_2_BIN=xyz_debug
export DBG=1
else
BINARY=my_binary
MODULE_1_BIN=abc
MODULE_2_BIN=xyz
endif
FLAG=something
.PHONY: all debug clean
all: bin/$(BINARY).bin
bin/$(BINARY).bin: module_1/$(MODULE_1_BIN).bin module_2/$(MODULE_2_BIN).bin
cat module_1/$(MODULE_1_BIN).bin $(FLAG) module_2/$(MODULE_2_BIN).bin > $@
module_1/$(MODULE_1_BIN).bin:
$(MAKE) -C module_1
module_2/$(MODULE_2_BIN).bin:
$(MAKE) -C module_2
clean:
rm bin/*.bin
$(MAKE) -C module_1 clean
$(MAKE) -C module_2 clean
这个例子会让我使用make debug=1
但我不太喜欢它,并且觉得这个实现可以更好。一种方法是使用目标特定变量,但我不完全确定当构建调试目标时依赖项也需要更改其名称时如何使用它们。就像是:
debug: export DBG:=1
debug: bin/$(BINARY)_debug.bin
debug: module_1/$(MODULE_1_BIN)_debug.bin
debug: module_2/$(MODULE_2_BIN)_debug.bin
bin/$(BINARY).bin bin/$(BINARY)_debug.bin: module_1/$(MODULE_1_BIN).bin module_2/$(MODULE_2_BIN).bin
cat module_1/$(MODULE_1_BIN).bin module_2/$(MODULE_2_BIN).bin > $@
在这里,目标将正常工作,因为bin/$(BINARY).bin
当以下情况时不需要构建目标debug
正在构建。但我不知道如何处理依赖关系module_1/$(MODULE_1_BIN).bin
and module_2/$(MODULE_2_BIN).bin
在建造时的配方中debug
该答案的先前版本尝试使用特定于目标的变量,但它们的用途有限,因为它们在配方中使用,但在指定目标和先决条件时被忽略。
隐式规则利用图案,但同时捕获两者my_binary
and my_binary_debug
与隐式目标my_binary%
不起作用,因为模式与空字符串不匹配。
然而,在这种情况下,隐式规则起作用,因为所有目标和依赖项都有共同的结尾.bin
,它是非空的。匹配的字符串%
在自动变量中可用$*
。
所以这是我的解决方案:
.PHONY: all debug clean
FLAG=something
# Maybe still needed by subdirectory makefiles
debug: export DBG:=1
all: bin/my_binary.bin
debug: bin/my_binary_debug.bin
# % will match both ".bin" and "_debug.bin"
# It won’t match the empty string.
bin/my_binary%: module_1/abc% module_2/xyz%
cat module_1/abc$* $(FLAG) module_2/xyz$* > $@
# Maybe, by specifying the target in the sub-make commandline,
# you can get rid of the DBG variable altogether.
module_1/abc%:
$(MAKE) -C module_1 $@
module_2/xyz%:
$(MAKE) -C module_2 $@
clean:
rm bin/*.bin
$(MAKE) -C module_1 clean
$(MAKE) -C module_2 clean
如果配方要构建bin/my_binary.bin
可以用所有模块依次重写并且$(FLAG)
一开始,还可以进行一些简化:
.PHONY: all debug clean
MODULES = module_1/abc module_2/xyz
FLAG = something
# Maybe still needed by subdirectory makefiles
debug: export DBG:=1
all: bin/my_binary.bin
debug: bin/my_binary_debug.bin
bin/my_binary%: $(addsuffix %,$(MODULES))
cat $(FLAG) $^ > $@
module_1/abc%:
$(MAKE) -C module_1 $@
module_2/xyz%:
$(MAKE) -C module_2 $@
clean:
rm bin/*.bin
for m in $(MODULES); do $(MAKE) -C $$(dirname $$m) clean; done
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)