【问题标题】:GNU Make dynamically created variable nameGNU Make 动态创建的变量名
【发布时间】:2017-09-29 07:38:37
【问题描述】:

这是我的制作配方,我正在传递 nonle 值 *,虽然竹子_nonle_password 变量有密码,但功能仍然失败

validatevar.%: $(if $(IS_BAMBOO),)
        @echo "\n################################################################################"
        @echo ">>> validatevar"
        @echo ">>> Start: Validate bamboo variables "
ifndef bamboo_$*_password
        @echo "Bamboo variable bamboo_$*_password is empty"
        exit 1
endif
ifndef bamboo_$*_server
        @echo "Bamboo variable bamboo_$*_server is empty"
        exit 1
endif
        @echo "<<< Done: validatevar"
        @echo "################################################################################\n\n"

【问题讨论】:

  • 为什么这里有这个额外的逗号,validatevar.%: $(if $(IS_BAMBOO),)?也许你可以有 1 或 0,这样你就可以像 IS_BAMBOO=1 那样做。
  • 是的,这也是可能的,无论如何它仍然有效,我将在我的代码中更改它。但真正的问题在于动态生成变量名,即生成bamboo_$*_password 变量名。

标签: gnu-make dynamic-variables


【解决方案1】:

你这个疯子:)

Make 将在它想要执行之前扩展配方。 此时make知道%对应的是什么, 因此可以确保$* 设置得当。 不幸的是,ifndefendif 对在读取 makefile 时被评估, 不是因为配方被扩展了。

这暗示了答案: 使用宏。 可能是$(origin …)$(flavor …) 之类的

validatevar.%:
    @echo 
    $(if $(filter undefined,$(origin bamboo_$*_password)),@echo "Bamboo variable bamboo_$*_password is undefined")
    $(if $(filter undefined,$(origin bamboo_$*_password)),exit 1)

当然,您可以稍微整理一下。 也许:

die-if-undefined = $(if $(filter undefined,$(origin $1)),$(error "$1" is undefined))

validatevar.%:
    $(call die-if-undefined,bamboo_$*_password)
    $(call die-if-undefined,bamboo_$*_server)
    @echo 
    @echo 

需要注意的两点:

  1. 配方的整个被一次性扩展,任何行被执行。 这样做的结果是,在哪里扩展 $(error) 断言并不重要。 我已将它们放在顶部。
  2. ifndef 还检测空变量以及未定义的变量。您可能希望调整 die-if-undefined 以考虑到这一点(并将其重命名为 die-if-empty)。

(如果 make 只采用--error-undefined-variables 参数,这一切都会容易得多, 只是为了匹配现有的--warn-undefined-variables 参数。)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-26
    • 2011-10-27
    • 2021-12-31
    • 2014-09-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多