GNU Make 动态创建的变量名

GNU Make dynamically created variable name

这是我的制作方法,我传递的是 nonle 值 *,虽然 bamboo_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"

你这个疯子:)

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 )),$(error "" is undefined))

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

注意两点:

  1. 菜谱的整个一口气展开,before任意一行都执行。 这样做的结果是,在何处扩展 $(error) 断言并不重要。 我把它们放在最上面了。
  2. ifndef 也检测空变量,以及未定义的变量。您可能希望调整 die-if-undefined 以考虑到这一点(并将其重命名为 die-if-empty)。

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