Makefile 中的 if-equals 语句作为单行语句

alk*_*fee 8 bash makefile

以下工作按预期进行:

branch := $(shell git rev-parse --abbrev-ref HEAD)

ifeq ($(branch), master)
    ami_regions = us-west-2
endif

show_regions:
    echo $(ami_regions)
Run Code Online (Sandbox Code Playgroud)

这条语句如何ifeq写成一行语句,如果条件通过则设置变量,否则将变量设置为另一个值或简单地将其保留为未设置?

Loe*_*ebl 9

那应该是可能的。尝试将第 8.4 章中的一个条件与手册第 8.2 章中的字符串搜索结合起来:

branch := $(shell git rev-parse --abbrev-ref HEAD)

ami_regions = $(if $(findstring master,$(branch)),us-west-2,)

show_regions:
    echo $(ami_regions)
Run Code Online (Sandbox Code Playgroud)

如果返回任何内容,该函数$if将从 then 分支返回值$findstring。如果包含字符串则$findstring返回。缺点是这也会匹配类似的东西。master$(branch)mastermaster-tests

为了使这个匹配完全掌握,你必须依赖 bash: $(shell if [ master = $(branch) ]; then echo "true"; fi )。但是您还必须注意$(branch)不要包含具有副作用的 shell 代码(通常不会)。

更新

Renaud Pacalet 和 MadScientist 在评论中给出了对使用的改进$findstring:使用$filter$patsubst。由于您正在搜索的字符串不是模式,因此也可以使用 simple$subst代替。$patsubst

$(if $(patsubst master,,$(branch)),,us-west-2)
Run Code Online (Sandbox Code Playgroud)

请注意,us-west-2已移至 else 分支,因为$patsubst/subst如果替换成功,则将找到的字符串替换为空字符串,从而导致错误条件。

$(if $(filter master,$(branch)),us-west-2,)
Run Code Online (Sandbox Code Playgroud)

$filter从输入中返回与提供的模式匹配的单词。由于模式是单个单词,因此在本例中它仅返回精确匹配。

所以基本上两种选择都会给出相似的结果。如果包含空格,则会出现差异 $branch:删除的单词之间的空格将由 返回$patsubst,而$filter仅返回匹配项。Git 不允许分支带有空格,这种情况不应该发生。

  • 要完全匹配,您可以使用“$(if $(patsubst master,,$(branch)),,us-west-2)”。 (2认同)
  • 更好的是使用 `$(if $(filter master,$(branch)),us-west-2,)` (2认同)