我理解延迟分配(使用=
分配事物而不是:=
),并且我理解如何使用#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
)而变化。我可以为每个需要变体的varable定义VAR
和VAR_STATIC
,但我想让它保持一个全局切换。
踢球者是一些子制造商定义除了没有的规则之外还必须动态编译必须的规则。因此,只有少数规则需要忽略该标志。这就是为什么我希望能够在同一个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
答案 0 :(得分:2)
如果我正确理解了这个问题,它就是条件,延迟和每个目标的组合。像这样:
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)