gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 21:39:36 25 4
gpt4 key购买 nike

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

在终端:

setenv ENV_PARAM x

在生成文件中:
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
}

最佳答案

您可以使用 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/

关于arrays - GNU-make 检查元素是否存在于列表/数组中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27326499/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com