Передача переменных в подзадачу
Значения переменных верхнего уровня make могут быть переданы подзадаче make через среду по явному запросу. Эти переменные определяются в подзадаче make в качестве значений по умолчанию, но они не переопределяют переменные, определенные в файле make, используемом подзадачей make, если не используется переключатель ‘-e’ (см. Обзор параметров).
Для передачи, или экспорта, переменной, make добавляет переменную и её значение в среду для выполнения каждой строки рецепта. Подзадача make, в свою очередь, использует среду для инициализации таблицы значений переменных. См. Переменные из среды.
За исключением явного запроса, make экспортирует переменную только в том случае, если она либо определена в среде изначально, либо задана в командной строке, и её имя состоит только из букв, цифр и символов подчёркивания.
Значение переменной make SHELL не экспортируется. Вместо этого значение переменной SHELL из вызывающей среды передаётся подзадаче make. Вы можете принудительно заставить make экспортировать своё значение для SHELL с помощью директивы export, описанной ниже. См. Выбор оболочки.
Специальная переменная MAKEFLAGS всегда экспортируется (если вы её не исключаете из экспорта). MAKEFILES экспортируется, если вы ей присваиваете любое значение.
make автоматически передает значения переменных, определённых в командной строке, помещая их в переменную MAKEFLAGS. См. Параметры/Рекурсия.
Переменные обычно не передаются, если они были созданы по умолчанию make (см. Переменные, используемые неявными правилами). Подзадача make определит их для себя.
Если вы хотите экспортировать определенные переменные в подзадачу make, используйте директиву export, например:
export variable …
Если вы хотите запретить экспорт переменной, используйте директиву unexport, например:
unexport variable …
В обоих этих формах аргументы для export и unexport расширяются, и поэтому могут быть переменными или функциями, которые расширяются до (списка) имён переменных, подлежащих (от)экспорту.
Для удобства вы можете определить переменную и экспортировать её одновременно, выполнив:
export variable = value
имеет тот же результат, что и:
variable = value export variable
и
export variable := value
имеет тот же результат, что и:
variable := value export variable
Аналогично,
export variable += value
аналогично:
variable += value export variable
См. Добавление текста к переменным.
Вы можете заметить, что директивы export и unexport работают в make так же, как и в оболочке sh.
Если вы хотите, чтобы все переменные экспортировались по умолчанию, вы можете использовать export само по себе:
export
Это сообщает make о том, что переменные, которые не указаны явно в директиве export или unexport, должны быть экспортированы. Любая переменная, заданная в директиве unexport, по-прежнему не будет экспортирована.
Поведение, вызываемое директивой export сама по себе, было значением по умолчанию в более старых версиях GNU make. Если ваши файлы make зависят от этого поведения и вы хотите быть совместимы со старыми версиями make, вы можете добавить специальную цель .EXPORT_ALL_VARIABLES в свой файл make вместо использования директивы export. Это будет проигнорировано старыми версиями make, в то время как директива export вызовет синтаксическую ошибку.
При использовании export само по себе или .EXPORT_ALL_VARIABLES для экспорта переменных по умолчанию, будут экспортированы только переменные, имена которых состоят только из букв, цифр и символов подчёркивания. Для экспорта других переменных вы должны указать их явно в директиве export.
Добавление значения переменной в среду требует её расширения. Если расширение переменной имеет побочные эффекты (такие как info или eval или аналогичные функции), то эти побочные эффекты будут наблюдаться каждый раз при вызове команды. Вы можете избежать этого, убедившись, что такие переменные имеют имена, которые не подлежат экспорту по умолчанию. Однако лучшее решение – не использовать эту функцию «экспорта по умолчанию», а вместо этого явно export соответствующие переменные по имени.
Вы можете использовать unexport само по себе, чтобы сообщить make не экспортировать переменные по умолчанию. Поскольку это стандартное поведение, вам нужно сделать это только в том случае, если export было использовано ранее (возможно, в подключенном файле make). Вы не можете использовать export и unexport само по себе, чтобы экспортировать переменные для некоторых рецептов, а не для других. Последняя директива export или unexport , которая появляется сама по себе, определяет поведение для всего запуска make.
В качестве специальной функции переменная MAKELEVEL изменяется при передаче с уровня на уровень. Значение этой переменной — строка, представляющая глубину уровня в виде десятичного числа. Значение «0» для верхнего уровня make; «1» для подзадачи make, «2» для подподзадачи make и т. д. Увеличение происходит, когда make настраивает среду для рецепта.
Основное использование MAKELEVEL — проверка его в условной директиве (см. Условные части файлов make); таким образом вы можете написать файл make, который ведет себя одним способом при рекурсивном запуске и другим — при прямом запуске вами.
Вы можете использовать переменную MAKEFILES для того, чтобы все подзадачи make использовали дополнительные файлы make. Значение MAKEFILES — список имён файлов, разделённых пробелами. Если эта переменная определена во внешнем файле make, она передаётся через среду; затем она служит списком дополнительных файлов make, которые подзадача make должна прочитать перед обычными или указанными. См. Переменная MAKEFILES.
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/Variables_002fRecursion.html