Я вижу, что используются и $ CFLAGS, и $ {CFLAGS}, configure.ac использует $ CFLAGS, а acinclude.m4 использует $ {CFLAGS}.Таким образом, переменные доступны по-разному: $ VAR, $ (VAR) и / или $ {VAR}.
Да и нет.
configure.ac
, acinclude.m4
и другиеИсходники M4, которые используются при создании сценария configure
, содержат смесь кода оболочки и макросов Autoconf, с небольшим добавлением синтаксиса M4. И оболочка, и M4 используют символ $
для представления ссылок на переменные, но то, что выВы, вероятно, видите в основном ссылки на переменные оболочки.Для оболочки $VAR
как полная синтаксическая единица означает то же самое, что и ${VAR}
;оба выполняют « расширение параметра ».Скобки полезны для выделения имени переменной из ее контекста, такого как ${VAR}foo
, чтобы указать, что имя переменной VAR
, а не VARfoo
.Кроме того, скобки требуются, когда используются определенные специальные функции расширения параметров.
Я считаю, что $ (VAR) и $ {VAR} - это одно и то же, и это действительно зависит от предпочтений.Но как насчет $ VAR против $ (VAR) / $ {VAR}, в чем разница между использованием скобок или нет?
Это зависит от контекста.$(VAR)
означает нечто совершенно отличное от оболочки, чем ${VAR}
: оно распространяется на выходные данные, если таковые имеются, полученные с помощью (буквальной) команды VAR
.Вы не увидите, чтобы он использовался взаимозаменяемо с ${VAR}
в коде Autoconf.Но вы можете увидеть это в файлах Makefile
s и Automake Makefile.am
.Это связано с тем, что make
использует другие правила расширения переменных , чем оболочка.Для этого $(VAR)
и ${VAR}
означают одно и то же - они расширяются до значения переменной VAR
- но $VAR
означает нечто совершенно иное (и, вероятно, является ошибкой).Форма с круглыми скобками более традиционна, но в настоящее время широко используется и форма с фигурными скобками.
Также с этим фрагментом кода: $ {CC-cc}, когда я отображаю содержимоепеременная, я получаю "GCC".Если я возьму «-cc» и просто выведу содержимое $ {CC}, я все равно получу «gcc».
Так что же на самом деле здесь делает дефис?
Это одна из особенностей синтаксиса расширения параметров оболочки (поэтому она применяется к коду Autoconf, но не к коду Automake): ${CC-cc}
расширяется до значения переменной CC
, аналогично ${CC}
, при условии, что CC
установлено , но если CC
не установлено, то ${CC-cc}
расширяется до литерального текста cc
.