首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >GNU-make检查列表/数组中是否存在元素

GNU-make检查列表/数组中是否存在元素
EN

Stack Overflow用户
提问于 2014-12-06 07:46:07
回答 1查看 9.3K关注 0票数 13

我在make文件中定义了一个列表,用户应该设置一个我需要在该列表中查找的环境变量。有没有办法使用gnu make来做到这一点?在make开始构建任何目标之前,我想在任何配方之外做这件事。这是一项QA检查,以确保用户设置了环境。变量转换为范围/列表中的值。

在终端上:

代码语言:javascript
复制
setenv ENV_PARAM x

在Makefile中:

代码语言:javascript
复制
PARAMS := a b c

if ${ENV_PARAM} exists in $(PARAMS)
  true
else
  false
endif

@MadScientist的答案是有效的。有没有办法用foreach循环包装if块来测试多个参数?

代码语言:javascript
复制
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
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-12-07 03:18:13

您可以使用filter函数来执行此操作:

代码语言:javascript
复制
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

阅读:“如果在参数中搜索ENV_PARAM值的结果不为空,则运行'true‘块,否则运行'false’块”。

更新

你提供的信息真的不能完全回答你的第二个问题。为了知道最好的方法,我们需要知道在if语句中,当条件为真,当条件为假时,你真正要做什么。你会声明更多的变量吗?创建一些规则?还有别的吗?做你想做的事情有很多种方法,最干净的一种可能会因你想做什么而有所不同。

但是,一般的解决方案需要使用define创建循环内容,然后使用foreacheval,如下所示:

代码语言:javascript
复制
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/

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27326499

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档