В чем разница между синтаксисом скобок $() и фигурной скобкой ${} в Makefile?


есть ли какие-либо различия в вызове переменных с синтаксисом ${var} и $(var)? Например, в том, как переменная будет расширена или что-то еще?

5 67

5 ответов:

нет никакой разницы – они означают точно то же самое (в GNU Make и в POSIX make).

думаю, что $(round brackets) выглядеть опрятнее, но это просто личные предпочтения.

(другие ответы указывают на соответствующие разделы документации GNU Make и отмечают, что вы не должны смешивать синтаксисы в одном выражении)

The основы ссылок на переменные раздел С GNU make состояние документации без разницы:

чтобы заменить значение переменной, напишите знак доллара, за которым следует имя переменной в круглых или фигурных скобках:или $(foo) или ${foo} является допустимой ссылкой к переменной foo.

на самом деле, это, кажется, довольно разные:

, = ,
list = a,b,c
$(info $(subst $(,),-,$(list))_EOL)
$(info $(subst ${,},-,$(list))_EOL)

выходы

a-b-c_EOL
md/init-profile.md:4: *** unterminated variable reference. Stop.

но до сих пор я только нашел эту разницу, когда имя переменной в ${...} содержит запятую. Сначала я подумал ${...} расширял запятую не как часть значения, но оказалось, что я не могу взломать его таким образом. Я все еще не понимаю этого... Если бы у кого-нибудь было объяснение, я был бы счастлив узнать !

Как уже правильно указывалось, разницы нет но будьте осторожны, чтобы не смешивать два вида разделителей, поскольку это может привести к загадочным ошибкам, таким как unomadh GNU сделать пример.

С руководство GNU make по синтаксису вызова функции (выделено мной):

[...] если сами аргументы содержат другие вызовы функций или ссылки на переменные, разумнее всего использовать один и тот же тип разделителей для всех ссылки; написать $(subst a,b,$(x)), а не $(subst a,b,${x}). Это потому, что это яснее, и потому что только один тип разделителя подбирается, чтобы найти конец ссылка.

стиль ${} позволяет проверить правила make в оболочке, если у вас есть соответствующие переменные среды, так как это совместимо с bash.