我想创建一个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 > $@
在这里,当构建debug
时,目标将正常工作,因为不需要构建bin/$(BINARY).bin
目标。但是我不确定如何在构建debug
时处理配方中的依赖项module_1/$(MODULE_1_BIN).bin
和module_2/$(MODULE_2_BIN).bin
make debug
时,BINARY似乎没有采用my_binary_debug的值。我在它们各自的Makefile中使用简单的ifdef
根据DBG更改子二进制文件的值,所以这两个人的值会改变。我在all debug
目标下添加了一个简单的echo,如@echo Building $@ : $<
,当我运行make debug
时,我看到Building debug : bin/my_binary.bin
。 - rookie