GNU Make动态创建变量名

时间:2017-09-29 07:38:37

标签: gnu-make dynamic-variables

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

JSON.stringify(myObj);

1 个答案:

答案 0 :(得分:0)

你疯了:)

Make 会在想要执行之前扩展配方。 此时 make 知道%对应的内容, 因此可以确保$*设置得恰当。 不幸的是,在读取makefile时评估ifndef ... endif对, 不是随着配方的扩展。

这表明了答案: 使用宏。 可能是$(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)。
  3. (如果 make 只接受--error-undefined-variables参数,这将会更加轻松, 只是为了匹配现有的--warn-undefined-variables参数。)