Оператор if-equals в make-файле как однострочный - PullRequest
0 голосов
/ 09 января 2019

Следующие работы по назначению:

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

ifeq ($(branch), master)
    ami_regions = us-west-2
endif

show_regions:
    echo $(ami_regions)

Как этот оператор ifeq может быть записан как однострочный, где переменная устанавливается, если условие выполняется, в противном случае переменная задается как другое значение или просто остается неустановленной?

Ответы [ 2 ]

0 голосов
/ 09 января 2019

Это должно быть возможно. Попробуйте из главы 8.4 одно условное в сочетании с поиском строк из главы 8.2 руководства:

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

ami_regions = $(if $(findstring master,$(branch)),us-west-2,)

show_regions:
    echo $(ami_regions)

Функция $if вернет значение из ветви then, если $findstring вернет что-либо. $findstring вернет master, если $(branch) содержит строку master. Недостатком является то, что это также будет соответствовать что-то вроде master-tests.

Чтобы сделать этот матч в точности мастером, вам нужно полагаться на bash: $(shell if [ master = $(branch) ]; then echo "true"; fi ). Но тогда вы также должны позаботиться о том, чтобы $(branch) не содержал шелл-код с побочными эффектами (обычно нет).

Обновление

Рено Пакалет и MadScientist в комментариях дали улучшения к использованию $findstring: используйте $filter или $patsubst. Поскольку искомая строка не является шаблоном, возможно использование простого $subst вместо $patsubst.

$(if $(patsubst master,,$(branch)),,us-west-2)

Обратите внимание, что us-west-2 перемещено в ветвь else, так как $patsubst/subst заменяет найденную строку пустой строкой, приводящей к ложному условию, если замена прошла успешно.

$(if $(filter master,$(branch)),us-west-2,)

$filter возвращает слова из ввода, которые соответствуют поставляемой скороговорке. Поскольку шаблон представляет собой одно слово, в этом случае он возвращает только точные совпадения.

Так что в основном обе альтернативы дают схожие результаты. Различия возникают, если $branch содержит пробелы: пробелы между удаленными словами будут возвращены $patsubst, в то время как $filter возвращает только совпадения. Git не допускает ветки с пробелами, этот случай не должен возникать.

0 голосов
/ 09 января 2019

Вы можете сделать все это в вашем $(shell ...) выражении:

region := $(shell test `git rev-parse --abbrev-ref HEAD` = master && echo us-west-2)

all:
  echo $(region)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...