2015-11-02 6 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 заканчивает тем, что установлен в положение «Foo/бар» после обнаружения ветви GIT, затем TAG также заканчивает тем, что «Foo/бар» , Однако, если я явно установил BRANCH в «foo/bar» (вместо его обнаружения), то TAG будет правильно настроен на «foo-bar», который является допустимым тегом.

Я довольно новичок в Makefiles, но думаю, что команда оболочки оценивается слишком поздно, а команда subst пытается выполнить замену самой команды оболочки, а не результат команды ,

Я также попытался с помощью «: =» для немедленной оценки (если я правильно понял документацию):

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

без толка.

Есть ли лучший способ сделать то, что я пытаюсь, или я застрял, чтобы передать имя ветки вручную команде make?

+0

Я думаю, что теги 'git' и' docker' этого вопроса не имеют отношения к делу, поскольку это чисто «make» и «shell». Не возражаете ли вы их сбросить? – ivant

+0

Я добавил эти теги на случай, если кто-то делает что-то подобное, уже имело решение этой проблемы. Но, конечно, я их уберу, наверное, это где-то загромождает ваши списки. – JoeLinux

ответ

2

Backticks расширяются оболочкой, а не производятся. Содержимое вашей переменной $(BRANCH) - это буквальная строка с обратными выводами в ней. Вы можете увидеть это, добавив $(info BRANCH := $(BRANCH)) в ваш файл.

Итак, когда ваш вызов $(subst) работает, косая черта в названии ветки еще не отображается и поэтому не может быть заменена.

Либо сделать замену во время рецепта/оболочек с или расширением параметра sed замещения или использовать $(shell) в присвоении сделать переменное, чтобы иметь делаете выполнить git вызов.

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

Если вы используете более BRANCH, чем один раз в любом рецепте, то вы можете использовать simply-expanded variable вместо этого и использовать

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

, но это будет иметь грим бежать, что git команды в выкроить время синтаксического анализа независимо от того, требуется ли ему что-то, что действительно требуется для построения (но с нормальным назначением make будет запускать команду git один раз при изменении переменной $(BRANCH)).

+0

Ваша последняя строка прекрасно объяснила мне разницу между «=» и «: =», где я чувствовал, что документы были немного непонятными, так что спасибо! Я решил запустить '$ (shell )', и это сработало. – JoeLinux

Смежные вопросы