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
)的定义而变化。我可以为每个需要变体的变量定义 VAR
和 VAR_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)
我理解延迟赋值(使用 =
赋值而不是 :=
),并且我理解如何使用 #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
)的定义而变化。我可以为每个需要变体的变量定义 VAR
和 VAR_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)