makefile 中的延迟条件赋值

Deferred conditional assignment in makefiles

我理解延迟赋值(使用 = 赋值而不是 :=),并且我理解如何使用 #ifneq 和类似的命令进行条件赋值。如何进行延迟条件赋值?

这是一个伪代码示例:

FOO = defined
BAR = $(defined(FOO) ? one : two)

test_1: $(BAR) #depends on one

FOO =

test_2: $(BAR) #depends on two

这样做的主要目的是为静态和动态构建动态配置我的链接器标志。由于循环依赖(除了 -fPIC 删除等),静态构建比动态构建更烦人。这样,几个变量根据STATIC(即make STATIC=y)的定义而变化。我可以为每个需要变体的变量定义 VARVAR_STATIC,但我想保持它有一个全局开关。

问题在于,一些 submake 定义了 必须 动态编译的规则以及不需要的规则。因此,只有 select 几条规则需要忽略该标志。这就是为什么我希望能够在同一个 Makefile 中打开和关闭它。

或者,当我需要切换标志时,我可以重新包含全局 Makefile,但这不是首选。

编辑:来自 Come Raczy 的解决方案,这是针对我的特定问题的特定语法:

#Makefile
all: test_1 test_2

CFLAGS = -Wfatal-errors -std=c++11 -Wall -Werror -O3
CFLAGS += $(if $(DSYM),-g,)
test_1: DSYM:=y
test_2: DSYM:=

test_%: test.cpp
    g++ $(CFLAGS) $< -o $@

clean: 
    rm -f test test_sym test_back

如果我理解正确的话,它是条件、延迟和按目标的组合。像这样:

BAR = $(if $(FOO), one, two)
all: test_1 test_2
FOO = defined
test_1: local_BAR:=$(BAR) #depends on one
FOO =
test_2: local_BAR:=$(BAR) #depends on two
test_%:
        echo $*: $(local_BAR)