2015-11-02 59 views
1

我有一个Makefile用于构建Docker容器。我正在检测当前的git分支,然后使用它作为构建的标记,但是一些git分支可能包含斜杠,这是Docker标记无效的字符。评估后Makefile变量中的替换字符

我试图在Makefile中用“ - ”替换斜线,但是我需要首先检测到git分支。这里是什么,我有一个非常简化的版本:

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

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

的问题是,如果BRANCH最终被设置为“富/栏”检测git的分支后,再TAG也最终被“富/酒吧” 。但是,如果我明确将BRANCH设置为“foo/bar”(而不是检测它),则TAG会正确设置为“foo-bar”,这是一个有效的标记。

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

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

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

无济于事。

有没有更好的方法来做我正在尝试的,或者我坚持不得不手动传递分支名称到make命令?

+0

我认为这个问题的'git'和'docker'标签是不相关的,因为它纯粹是'make'和'shell'相关的。你介意放弃他们吗? – ivant

+0

我添加了这些标签,以防某人做类似的事情已经解决了这个问题。但是,当然,我会删除它们,我想它一定会让你的列表混乱。 – JoeLinux

回答

2

反向扩展的外壳,而不是。您的$(BRANCH) make变量的内容是带反引号的文字字符串。您可以通过将$(info BRANCH := $(BRANCH))添加到makefile中来查看。

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

无论做在配方/壳时间置换与sed或替代参数膨胀或使用$(shell)在使变量赋值给具有化妆执行git呼叫。

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

如果多次使用BRANCH更在任何给定的配方,那么你可能需要使用一个simply-expanded variable来代替,而

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

,但这将有make运行,在化妆分析时git命令不管不管实际上是否构建了任何东西,都需要它(但是每次扩展$(BRANCH)变量时,正常分配make将运行git命令一次)。

+0

您的最后一行完美地解释了“=”和“:=”之间的区别,我觉得文档有点不清楚,所以谢谢!我决定运行'$(shell )'并且工作。 – JoeLinux