makefile中的延迟条件赋值
我了解延迟分配使用=而不是:=,并且我了解如何使用ifneq和类似命令进行条件分配。如何进行延迟条件赋值 以下是一个psuedo代码示例:makefile中的延迟条件赋值,makefile,Makefile,我了解延迟分配使用=而不是:=,并且我了解如何使用ifneq和类似命令进行条件分配。如何进行延迟条件赋值 以下是一个psuedo代码示例: FOO = defined BAR = $(defined(FOO) ? one : two) test_1: $(BAR) #depends on one FOO = test_2: $(BAR) #depends on two 其主要目的是为静态和动态构建动态配置我的链接器标志。静态构建比动态构建更烦人,因为除了-fPIC删除等,还存在循环依赖关
FOO = defined
BAR = $(defined(FOO) ? one : two)
test_1: $(BAR) #depends on one
FOO =
test_2: $(BAR) #depends on two
其主要目的是为静态和动态构建动态配置我的链接器标志。静态构建比动态构建更烦人,因为除了-fPIC删除等,还存在循环依赖关系。通过这种方式,一对变量根据STATIC的定义而变化,即使STATIC=y。我可以为每个需要变量的变量定义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
如果我理解正确,这是一个有条件的、延期的和按目标的组合。大概是这样的:
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)
GNU make手册的章节解释了哪些部分是即时的,哪些部分是延迟的。如果这是有用的。是每个目标还是每个子目标都必须有动态需求?在适当的子make调用工作之前,是否可以取消导出/取消设置STATIC?如果我理解您的问题,我希望是每个目标。@Aggieboy当可能的配置数量增加时,“$或…”函数也可以很方便地使用,就像我需要返回并读取所有可用的Makefile函数一样。谢谢你,先生!