我在make文件中定义了一个列表,用户应该设置一个我需要在此列表中找到的环境变量.有没有办法使用gnu make来做到这一点?在开始构建任何目标之前,我想在任何配方之外执行此操作.这是一个QA检查,以确保用户设置env.变量到范围/列表中的值.
在终端上:
setenv ENV_PARAM x
在Makefile中:
PARAMS := a b c if ${ENV_PARAM} exists in $(PARAMS) true else false endif
@MadScientist的答案有效.有没有办法用foreach循环包装if块来测试多个参数?
KEYS := PARAMS FACTORS PARAMS := a b c FACTORS := x y z foreach v in ($(KEYS)) { ifneq ($(filter $(ENV_$(v)),$(v)),) $(info $(ENV_$(v)) exists in $(v)) else $(info $(ENV_$(v)) does not exist in $(v)) endif }
MadScientist.. 14
您可以使用此filter
功能执行此操作:
PARAMS := a b c ifneq ($(filter $(ENV_PARAM),$(PARAMS)),) $(info $(ENV_PARAM) exists in $(PARAMS)) else $(info $(ENV_PARAM) does not exist in $(PARAMS)) endif
读:"如果在PARAMS中搜索ENV_PARAM值的结果不为空,则运行'true'块,否则运行'false'块".
UPDATE
您提供的信息无法完全回答您的第二个问题.为了知道最好的方法,我们需要知道你在if语句中要做什么,当条件为真时和什么时候为假.你要宣布更多变量吗?制定一些规则?别的什么?有很多方法可以做你想要的,最干净的方法可能会有所不同,这取决于你想做什么.
但是,一般解决方案将涉及使用define
创建循环的内容,然后使用foreach
和eval
,如下所示:
KEYS := PARAMS FACTORS PARAMS := a b c FACTORS := x y z define LOOPBODY ifneq ($$(filter $$(ENV_$(v)),$(v)),) $$(info $$(ENV_$(v)) exists in $(v)) else $$(info $$(ENV_$(v)) does not exist in $(v)) endif endef $(foreach v,$(KEYS),$(eval $(LOOPBODY)))
你可能对我在GNU make中关于元编程的一组帖子感兴趣:http://make.mad-scientist.net/category/metaprogramming/
您可以使用此filter
功能执行此操作:
PARAMS := a b c ifneq ($(filter $(ENV_PARAM),$(PARAMS)),) $(info $(ENV_PARAM) exists in $(PARAMS)) else $(info $(ENV_PARAM) does not exist in $(PARAMS)) endif
读:"如果在PARAMS中搜索ENV_PARAM值的结果不为空,则运行'true'块,否则运行'false'块".
UPDATE
您提供的信息无法完全回答您的第二个问题.为了知道最好的方法,我们需要知道你在if语句中要做什么,当条件为真时和什么时候为假.你要宣布更多变量吗?制定一些规则?别的什么?有很多方法可以做你想要的,最干净的方法可能会有所不同,这取决于你想做什么.
但是,一般解决方案将涉及使用define
创建循环的内容,然后使用foreach
和eval
,如下所示:
KEYS := PARAMS FACTORS PARAMS := a b c FACTORS := x y z define LOOPBODY ifneq ($$(filter $$(ENV_$(v)),$(v)),) $$(info $$(ENV_$(v)) exists in $(v)) else $$(info $$(ENV_$(v)) does not exist in $(v)) endif endef $(foreach v,$(KEYS),$(eval $(LOOPBODY)))
你可能对我在GNU make中关于元编程的一组帖子感兴趣:http://make.mad-scientist.net/category/metaprogramming/