在makefile中使用if-equals语句作为一行代码

8
以下内容按预期工作:

以下内容按预期工作:

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

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

show_regions:
    echo $(ami_regions)

这个 ifeq 语句如何编写成一行代码,如果条件通过则设置变量,否则将变量设置为另一个值或仅保留未设置状态?
3个回答

9
那应该是可以的。尝试使用手册 第8.2章 中的字符串搜索结合 第8.4章 中的一个条件语句:
branch := $(shell git rev-parse --abbrev-ref HEAD)

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

show_regions:
    echo $(ami_regions)

函数$if将返回then分支的值,如果$findstring返回任何内容。如果$(branch)包含字符串master,则$findstring将返回master。缺点是这也会匹配像master-tests这样的东西。
要使其完全匹配master,您必须依靠bash:$(shell if [ master = $(branch) ]; then echo "true"; fi )。但是,您还必须注意$(branch)不包含具有副作用的shell代码(通常不包含)。
更新
Renaud Pacalet和MadScientist在评论中改进了对$findstring的使用:使用$filter$patsubst。由于您要搜索的字符串不是模式,因此使用简单的$subst而不是$patsubst也是可能的。
$(if $(patsubst master,,$(branch)),,us-west-2)

注意,us-west-2 移动到了 else 分支,因为 $patsubst/subst 会将找到的字符串替换为空字符串,如果替换成功,则导致条件为假。
$(if $(filter master,$(branch)),us-west-2,)

$filter 返回与提供的模式匹配的输入中的单词。因为模式是一个单词,所以在这种情况下,它只返回精确匹配。

因此,基本上两种替代方案都会给出类似的结果。如果 $branch 包含空格,则删除的单词之间的空格将由 $patsubst 返回,而 $filter 仅返回匹配项。Git 不允许带有空格的分支,因此不应出现这种情况。


2
要完全匹配,您可以使用 $(if $(patsubst master,,$(branch)),,us-west-2) - Renaud Pacalet
嗯,基本上是在$(branch)中使用else分支,以防patsubst完全消耗文本。感谢提示。 - Loebl
2
更好的方法是使用 $(if $(filter master,$(branch)),us-west-2,) - MadScientist
@MadScientist:在这种特殊情况下,你可能是对的。但在一般情况下,“filter”操作的是单词,而不是单个字符串。因此,如果“banch =“master master””,例如,“filter”将匹配,但“patsubst”则不会... - Renaud Pacalet
据我理解手册,patsubst也可以操作单词。但它会返回单词之间的空格(在我的测试中使用类似“master master master”的字符串),这将引导条件进入then分支。但感谢你们两个的输入,我对make有了更多的了解。 - Loebl

2
您可以在$(shell ...)表达式中完成所有操作:
region := $(shell test `git rev-parse --abbrev-ref HEAD` = master && echo us-west-2)

all:
  echo $(region)

明白了,但我想知道如何通过Make完成。 - alkalinecoffee

0

一个通用的一行式if语句

$(if $(strip $(subst $(a),,$(b))),false-command,true-command)

对于你的情况,你可以这样做:

$(if $(strip $(subst $(branch),,master)),,$(eval ami_regions = us-west-2))


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接