Makefile,ifdef和计算变量

时间:2020-04-22 17:47:24

标签: makefile gnu-make

我正在尝试制作一些我认为不可能制造的东西。 我有一个共同的目标,它可能有几个先决条件,例如本例中的postbuild _%

TARGET_NAMES = release.target.1.1 debug.target.1.1 release.target.2.4 debug.target.2.4
BUILD_TARGET := $(addprefix build_,$(TARGET_NAMES))    
.PHONY: $(BUILD_TARGET)
$(BUILD_TARGET): build_%: prebuild_% % postbuild_%

我为每个目标使用变量的定义(由另一个makefile导出,该makefile调用带有规则的变量)来确定编译的某种行为。由于每个目标名称都不同(除了发布/调试名称),因此我为每个目标名称使用不同的变量。例如

.PHONY: %.target.1.1
%.target.1.1:
ifndef NO_target.1.1
    [something specific for %.target.1.1]
else
    @echo nothing to do
endif

现在我的问题是,即使在postbuild_%中,我也必须复制此内容,但是每个目标的配方始终相同,因此我试图找到一种使用计算变量来重新创建“ NO _ $ *”的方法“变量,以免复制整个食谱,就像这样

POSTBUILD_TARGET := $(addprefix postbuild_,$(TARGET_NAMES))
.PHONY: $(POSTBUILD_TARGET)
$(POSTBUILD_TARGET): postbuild_%:
ifndef $(addprefix NO_,$(subst $(whitespace),.,$(wordlist 2,4,$(subst ., ,$*))))
    [...]
else
    @echo Skipping $@
endif

这显然是行不通的:我在做什么错了?

谢谢您的帮助:)

1 个答案:

答案 0 :(得分:1)

首先使所有makefile解析为内部数据结构,然后运行规则。第一步将评估ifeq等。直到第二步,才会设置自动变量。

您不能使用诸如ifeq之类的make预处理程序语句来查询诸如$*之类的自动变量,这些预处理程序语句在读取makefile时会被解析为 。 >直到运行配方。

如果需要根据规则测试一些值,则必须使用shell条件,例如:

$(POSTBUILD_TARGET): postbuild_%:
        if [ -z '$(NO_$(subst $(whitespace),.,$(wordlist 2,4,$(subst ., ,$*))))' ]; then \
            [...]; \
        else \
            @echo Skipping $@; \
        fi