在评估后替换Makefile变量中的字符

时间:2015-11-02 14:14:17

标签: makefile

我有一个Makefile用于构建Docker容器。我正在检测当前的git分支,然后将其用作构建的标记,但是一些git分支可能包含斜杠,这是Docker标记的无效字符。

我试图用" - "来替换斜杠。在Makefile中,但我需要先检测git分支。这是我的简化版本:

NAME = foo
BRANCH = `git rev-parse --abbrev-ref HEAD`
TAG = $(subst /,-,$(BRANCH))

build:
    docker build --tag=$(NAME):$(TAG) .

问题是如果BRANCH最终设置为" foo / bar"在检测到git分支后,TAG也最终成为" foo / bar"。但是,如果我明确地将BRANCH设置为" foo / bar" (而不是检测它),然后TAG被正确设置为" foo-bar",这是一个有效的标签。

我是Makefiles的新手,但我的猜测是shell命令的评估太晚了,subst命令正在尝试替换shell命令本身,而不是命令的结果。

我也尝试使用":="立即评估(如果我理解正确的文档):

BRANCH := `git rev-parse --abbrev-ref HEAD`

无济于事。

有没有更好的方法来做我尝试的事情,或者我不得不手动将分支名称传递给make命令?

1 个答案:

答案 0 :(得分:2)

反引号由shell扩展,而不是make。 $(BRANCH) make变量的内容是带有反引号的文字字符串。您可以通过将$(info BRANCH := $(BRANCH))添加到生成文件来查看此内容。

因此,当您的$(subst)调用运行时,分支名称中的斜杠尚未显示,因此无法替换。

使用sed或替换参数扩展在配方/ shell时进行替换,或者在make变量赋值中使用$(shell)使make执行git调用。

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

如果您在任何给定的食谱中多次使用BRANCH,那么您可能需要使用simply-expanded variable代替并使用

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

但是这将使make git命令在make解析时运行,无论实际构建的是否需要它(但正常的赋值make将每次运行git命令$(BRANCH)变量已展开。)