我有一个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
命令?
答案 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)
变量已展开。)