Почему в этом минимальном Makefile нужны скобки (или фигурные скобки)? - PullRequest
0 голосов
/ 08 июня 2018

Я сбит с толку, почему мне нужно повторить $(VAR1) или ${VAR1}, чтобы получить вывод "abcd" в этом файле Makefile:

VAR1=abcd

myTarget:
        @echo $VAR1

all: myTarget

.PHONY: all

Вместо этого make выдаст эхо $V (что являетсяпустая строка), а затем "AR1", который является моим выводом.

Я знаю, что в bash, echo $VAR1 работает, чтобы получить "abcd", и я понимаю, что часть кода с отступомзапустить в bash.Я использую GNU Make 3.81.

Ответы [ 2 ]

0 голосов
/ 08 июня 2018

Это необходимо, потому что это синтаксис, который make использует для ссылки на переменные.Например, смотрите GNU make manual или даже стандартное определение POSIX make.

Обратите внимание, что make-файлы являются , а не сценариями оболочки и не имеюттот же синтаксис, что и сценарии оболочки.Makefiles делают содержат сценарии оболочки (или, по крайней мере, команды оболочки) в рецептах.

Устанавливая переменную:

VAR1 = abcd

в вашем make-файле, вы создаете переменная make , а не переменная shell .

Рецепт (команда с отступом TAB) сначала анализируется make, и все ссылки на переменные make расширяются.Затем результат этого расширения передается в оболочку.Поскольку вы хотите сослаться на переменную make в своем рецепте, вы должны использовать синтаксис ссылки на переменную make.

0 голосов
/ 08 июня 2018

Я знаю, что в bash, echo $VAR1 работает, чтобы получить «abcd», и я понимаю, что часть кода с отступом - это то, что выполняется bash.

$VAR1 увеличивается на make (не bash) и фактически эквивалентно расширению $(V)AR1.Результирующая строка после этого расширения - это то, что выполняется bash.

Вам нужно экранировать ведущий $ в $VAR1, чтобы make не расширил переменную.Экранирование может быть достигнуто путем помещения дополнительного $ перед $VAR1, то есть:

myTarget:
        @echo $$VAR1

Таким образом, bash получит строку echo $VAR1.

...