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

 -晴天2602926075 发布于 2022-12-07 15:18

我在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创建循环的内容,然后使用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/

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'块".

    UPDATE

    您提供的信息无法完全回答您的第二个问题.为了知道最好的方法,我们需要知道你在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/

    2022-12-11 02:08 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有