Makefile、ifdef 和计算变量

Makefiles, ifdef and computed variables

我正在尝试制作一些我认为在 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 导出)来确定编译的特定行为。由于每个目标名称都不同(release/debug 除外),我为每个目标使用不同的变量。例如

.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

其中有些地方显然不起作用:我做错了什么?

感谢您的帮助:)

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

您不能使用像 ifeq 这样的 make 预处理器语句,它们在 读取 makefile 时被解析 ,来查询像 $* 这样的自动变量,它未设置 直到配方 运行.

如果您需要测试每条规则的某些值,则必须使用 shell 条件,如下所示:

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