【问题标题】:GNU-make check if element exists in list/arrayGNU-make 检查元素是否存在于列表/数组中
【发布时间】:2015-02-04 05:59:13
【问题描述】:

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

在终端上:

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
}

【问题讨论】:

  • 你举的例子不够清楚。 make 有两个不同的地方可以使用这样的测试:您可能希望在目标的配方中进行该测试,或者您可能希望在 make 开始构建目标之前在任何配方之外进行测试。这两者的语法非常不同,因此您需要提供更多信息来说明您到底想要完成什么。
  • 我刚刚编辑了我的问题。

标签: arrays list element gnu-make exists


【解决方案1】:

您可以使用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 语句中真正要做什么,什么时候条件为真,什么时候条件为假。你要声明更多的变量吗?制定一些规则?还有什么?有很多方法可以做你想做的事,最干净的方法可能会有所不同,具体取决于你想做的事情。

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

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/

【讨论】:

  • 更进一步,有没有办法将此 ifneq 块包装在 foreach 块中?我想测试多个参数。我做了很多搜索,但找不到任何显示类似用法的示例。我已经用我想要的更新了我的问题。
  • 您的意思是,测试是否存在多个参数中的任何一个?您可以给filter 的第一个参数提供多个单词,它会返回任何匹配的单词:$(filter $(P1) $(P2) $(P3),$(PARAMS))
  • 我有很多参数,希望有一个 foreach 循环来遍历这个列表,而不是为每个参数编写一个 ifneq 块。一般来说,我也遇到过很多情况,我想在 for 循环中测试某些条件,但在任何地方都找不到任何指针。这是品牌的限制吗?
  • 这对我有用。除了eval,我什么都试过了。一个更新虽然 - info 语句需要两个'$'。我将通过您的帖子来更好地理解“制造”。非常感谢您抽出时间回答我的问题。
  • 哎呀,你是对的,我错过了一些双 $ 尽管这些是在这个特定示例中有所作为的唯一因素。为我提供无需测试即可打字的权利!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多