Настройка переменных
Для задания переменной из makefile, запишите строку, начинающуюся с имени переменной, за которым следует один из операторов присваивания ‘=’, ‘:=’, ‘::=’ или ‘:::=’. Всё, что следует за оператором и начальными пробелами в строке, станет значением. Например,
objects = main.o foo.o bar.o utils.o
определяет переменную с именем objects со значением ‘main.o foo.o bar.o utils.o’. Пробелы вокруг имени переменной и сразу после ‘=’ игнорируются.
Переменные, определенные с помощью ‘=’, являются рекурсивно расширяемыми переменными. Переменные, определенные с помощью ‘:=’ или ‘::=’, являются просто расширяемыми переменными; эти определения могут содержать ссылки на переменные, которые будут расширены до создания определения. Переменные, определенные с помощью ‘:::=’, являются немедленно расширяемыми переменными. Различные операторы присваивания описаны в разделе Два типа переменных.
Имя переменной может содержать ссылки на функции и переменные, которые расширяются при чтении строки, чтобы найти фактическое имя переменной для использования.
Длина значения переменной не ограничена, за исключением объёма памяти компьютера. Для улучшения читабельности, вы можете разбить значение переменной на несколько физических строк (см. Разбиение длинных строк).
Большинство имен переменных считаются имеющими пустую строку в качестве значения, если вы их никогда не задавали. Несколько переменных имеют встроенные начальные значения, которые не пустые, но вы можете задать их обычным способом (см. Переменные, используемые неявными правилами). Несколько специальных переменных автоматически устанавливаются в новое значение для каждого правила; они называются автоматическими переменными (см. Автоматические переменные).
Если вы хотите установить переменную в значение только в том случае, если она ещё не задана, то вы можете использовать сокращённый оператор ‘?=’ вместо ‘=’. Эти два способа задания переменной ‘FOO’ идентичны (см. Функция origin):
FOO ?= bar
и
ifeq ($(origin FOO), undefined) FOO = bar endif
Оператор присваивания оболочки ‘!=’ может быть использован для выполнения скрипта оболочки и задания переменной его выводом. Этот оператор сначала вычисляет правую часть, затем передает результат оболочке для выполнения. Если результат выполнения заканчивается новой строкой, эта одна новая строка удаляется; все остальные новые строки заменяются пробелами. Результирующая строка затем помещается в именованную рекурсивно расширяемую переменную. Например:
hash != printf '\043' file_list != find . -name '*.c'
Если результат выполнения может произвести $, и вы не хотите, чтобы то, что следует за этим, интерпретировалось как ссылка на переменную или функцию make, тогда вы должны заменить каждый $ на $$ как часть выполнения. В качестве альтернативы, вы можете задать просто расширяемую переменную результатом выполнения программы, используя вызов функции shell. См. Функция shell. Например:
hash := $(shell printf '\043') var := $(shell find . -name "*.c")
Как и в случае с функцией shell, код возврата только что вызванного скрипта оболочки хранится в переменной .SHELLSTATUS.
Copyright © 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022 Free Software Foundation, Inc.
Licensed under the GNU Free Documentation License.
https://www.gnu.org/software/make/manual/html_node/Setting.html