Makefile中的if-equals语句为单行

时间:2019-01-09 14:22:35

标签: bash makefile

以下按预期工作:

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

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

show_regions:
    echo $(ami_regions)

如何将此ifeq语句写成单行代码,如果条件通过则在其中设置变量,否则将变量设置为另一个值,或者只是将其保留为未设置状态?

3 个答案:

答案 0 :(得分:2)

您可以在$(shell ...)表达式中完成所有操作:

region := $(shell test `git rev-parse --abbrev-ref HEAD` = master && echo us-west-2)

all:
  echo $(region)

答案 1 :(得分:2)

那应该是可能的。尝试chapter 8.4中的一种条件,并结合手册chapter 8.2中的字符串搜索:

mp.currentTimeProperty().addListener(new ChangeListener<>() {

  @Override
  public void changed(ObservableValue<? extends Duration> observable,
                      Duration oldTime, Duration newTime) {
    durationSlider.setValue(newTime.toMillis() / mp.getTotalDuration().toMillis() * 100);
    String formattedTime = ...; // your computations
    displayCurrentTime.setText(formattedTime);
  }

});

如果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包含字符串$findstring,则master将返回$(branch)。不利之处在于,它还会匹配master之类的东西。

要使此匹配完全掌握,您将不得不依靠bash:master-tests。但是然后,您还必须注意$(shell if [ master = $(branch) ]; then echo "true"; fi )不包含带有副作用的shell代码(通常不是)。

更新

Renaud Pacalet和MadScientist在评论中对$(branch)的使用进行了改进:使用$findstring$filter。由于您搜索的字符串不是模式,因此也可以使用简单的$patsubst而不是$subst

$patsubst

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

$patsubst/subst

$(if $(filter master,$(branch)),us-west-2,) 从输入中返回与提供的模式匹配的单词。由于模式是一个单词,因此在这种情况下,它仅返回完全匹配项。

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

答案 2 :(得分:0)

一般的单线if

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

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

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