Arrays GNU检查列表/数组中是否存在元素

Arrays GNU检查列表/数组中是否存在元素,arrays,list,element,gnu-make,exists,Arrays,List,Element,Gnu Make,Exists,我在make文件中定义了一个列表,用户应该设置一个环境变量,我需要在这个列表中找到它。有没有一种使用gnu make的方法可以做到这一点?在make开始建立任何目标之前,我想在任何配方之外做这件事。这是一个QA检查,以确保用户设置环境。变量设置为范围/列表内的值 在终端上: setenv ENV_PARAM x 在Makefile中: PARAMS := a b c if ${ENV_PARAM} exists in $(PARAMS) true else false endif

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

在终端上:

setenv ENV_PARAM x
在Makefile中:

PARAMS := a b c

if ${ENV_PARAM} exists in $(PARAMS)
  true
else
  false
endif
@科学家的答案是正确的。有没有办法用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
}

您可以使用
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'块”

更新

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

但是,一般解决方案包括使用
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中关于元编程的一组帖子感兴趣:

您给出的示例不够清楚。make中有两个不同的地方可以使用这样的测试:您可能希望在目标配方中进行测试,或者您可能希望在make开始构建目标之前在任何配方之外进行测试。这两个函数的语法非常不同,因此您需要提供更多有关您正试图实现的目标的信息。我刚刚编辑了我的问题。更进一步,是否有方法将此ifneq块包装到foreach块中?我想测试多个参数。我做了很多搜索,但找不到任何显示类似用法的示例。我已经用我想要的更新了我的问题。你的意思是,测试是否存在多个参数中的任何一个?您可以为
filter
的第一个参数指定多个单词,它将返回任何匹配的单词:
$(filter$(P1)$(P2)$(P3),$(PARAMS))
我有许多参数,希望有一个foreach循环来迭代此列表,而不是为每个参数编写一个ifneq块。一般来说,我也遇到过很多这样的情况:我想在for循环中测试一些条件,但在任何地方都找不到任何指针。这是make的限制吗?这对我很有效。除了评估,我什么都试过了。一个更新-info语句需要两个“$”。我将浏览你的帖子,以更好地理解“使”这个词。非常感谢你抽出时间来回答我的问题。哦,你是对的,我错过了一些双美元,尽管在这个特殊的例子中,这些是唯一起作用的。我不用测试就可以打字了!