求值后替换Makefile变量中的字符

求值后替换Makefile变量中的字符,makefile,Makefile,我有一个用于构建Docker容器的Makefile。我正在检测当前git分支,然后将其用作构建的标记,但是一些git分支可能包含斜杠,这对于Docker标记来说是无效字符 我试图在Makefile中用“-”替换斜杠,但我需要首先检测git分支。以下是我所拥有的一个非常简化的版本: NAME = foo BRANCH = `git rev-parse --abbrev-ref HEAD` TAG = $(subst /,-,$(BRANCH)) build: docker build -

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

我试图在Makefile中用“-”替换斜杠,但我需要首先检测git分支。以下是我所拥有的一个非常简化的版本:

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

build:
    docker build --tag=$(NAME):$(TAG) .
问题是如果
BRANCH
在检测到git分支后被设置为“foo/bar”,那么
TAG
也会被设置为“foo/bar”。但是,如果我显式地将
BRANCH
设置为“foo/bar”(而不是检测它),那么
TAG
将正确设置为“foo-bar”,这是一个有效的标记

我对Makefiles非常陌生,但我猜shell命令的计算太晚了,
subst
命令正在尝试对shell命令本身进行替换,而不是对命令的结果进行替换

我还尝试使用“:=”进行即时评估(如果我正确理解文档):

无济于事


是否有更好的方法来执行我正在尝试的操作,或者我必须手动将分支名称传递给
make
命令?

反勾号由shell展开,而不是make。
$(分支)
make变量的内容是带有反勾号的文本字符串。您可以通过将
$(info BRANCH:=$(BRANCH))
添加到makefile中来看到这一点

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

在配方/外壳时间使用
sed
或替换参数展开进行替换,或在make变量赋值中使用
$(外壳)
,使make执行
git
调用

BRANCH = $(shell git rev-parse --abbrev-ref HEAD)
如果您在任何给定配方中多次使用分支,那么您可能需要使用

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

但这将使make在make解析时运行该
git
命令,而不管实际生成的任何东西是否需要它(但在正常分配中,make将在每次展开
$(分支)
变量时运行一次
git
命令).

你的最后一行完美地解释了“=”和“:”,我觉得文档有点不清楚,所以谢谢你!我决定运行
$(shell)
,这就成功了。我认为这个问题的
git
docker
标记是不相关的,因为它纯粹是
make
shell
相关的。你介意放下它们吗?我添加了这些标签,以防做类似事情的人已经找到了解决这个问题的方法。但当然,我会删除它们,我想它一定是把你的物品弄得乱七八糟了。
BRANCH := $(shell git rev-parse --abbrev-ref HEAD)