Автоинструменты: различия в $ VAR, $ (VAR) и $ {VAR} и $ {CC-cc} против $ {CC} - PullRequest
0 голосов
/ 22 января 2019

Я вижу, что используются $ CFLAGS и $ {CFLAGS}, configure.ac использует $ CFLAGS, а acinclude.m4 использует $ {CFLAGS}. Таким образом, переменные доступны по-разному: $ VAR, $ (VAR) и / или $ {VAR}.

Я считаю, что $ (VAR) и $ {VAR} - это одно и то же, и это действительно зависит от предпочтений. Но как насчет $ VAR против $ (VAR) / $ {VAR}, в чем разница между использованием скобок или нет?

Также с этим фрагментом кода: $ {CC-cc}, когда я отображаю содержимое переменной, я получаю «gcc». Если я возьму «-cc» и просто выведу содержимое $ {CC}, я все равно получу «gcc».

Так что же дефис делает здесь?

1 Ответ

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

Я вижу, что используются и $ 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.

...