求值后替换Makefile变量中的字符
我有一个用于构建Docker容器的Makefile。我正在检测当前git分支,然后将其用作构建的标记,但是一些git分支可能包含斜杠,这对于Docker标记来说是无效字符 我试图在Makefile中用“-”替换斜杠,但我需要首先检测git分支。以下是我所拥有的一个非常简化的版本:求值后替换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 -
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)