Определение многострочных переменных
Другой способ установить значение переменной — использовать директиву define. Эта директива имеет необычный синтаксис, позволяющий включать символы новой строки в значение, что удобно для определения как готовых последовательностей команд (см. Определение готовых рецептов), так и разделов синтаксиса makefile для использования с eval (см. Функция Eval).
Директива define на той же строке следует за именем определяемой переменной и (необязательным) оператором присваивания, и ничего больше. Значение, которое нужно присвоить переменной, указывается в следующих строках. Конец значения отмечается строкой, содержащей только слово endef.
Помимо этого отличия в синтаксисе, define работает так же, как и любое другое определение переменной. Имя переменной может содержать ссылки на функции и переменные, которые расширяются при чтении директивы, чтобы найти фактическое имя переменной для использования.
Последняя новая строка перед endef не включается в значение; если вы хотите, чтобы ваше значение содержало конечную новую строку, вы должны включить пустую строку. Например, для определения переменной, содержащей символ новой строки, необходимо использовать две пустые строки, а не одну:
define newline endef
Вы можете опустить оператор присваивания переменной, если хотите. Если он опущен, make предполагает, что это ‘=’, и создает рекурсивно расширяемую переменную (см. Два типа переменных). При использовании оператора ‘+=’ значение добавляется к предыдущему значению, как и при любой другой операции добавления: с одним пробелом, разделяющим старые и новые значения.
Вы можете вложенные директивы define: make будет отслеживать вложенные директивы и сообщать об ошибке, если они не будут корректно закрыты с помощью endef. Обратите внимание, что строки, начинающиеся с символа префикса рецепта, считаются частью рецепта, поэтому любые строки define или endef в такой строке не будут рассматриваться как make директивы.
define two-lines echo foo echo $(bar) endef
При использовании в рецепте предыдущий пример функционально эквивалентен этому:
two-lines = echo foo; echo $(bar)
поскольку две команды, разделенные точкой с запятой, ведут себя очень похоже на две отдельные командные оболочки. Однако обратите внимание, что использование двух отдельных строк означает, что make вызовет оболочку дважды, запустив независимую подоболочку для каждой строки. См. Исполнение рецепта.
Если вы хотите, чтобы определения переменных, созданные с помощью define, имели приоритет над определениями переменных из командной строки, вы можете использовать директиву override вместе с define:
override define two-lines = foo $(bar) endef
См. Директиву override.
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/Multi_002dLine.html