Другие специальные переменные
GNU make поддерживает некоторые переменные со специальными свойствами.
MAKEFILE_LIST-
Содержит имена каждого файла make, который был проанализирован
make, в порядке их анализа. Имя добавляется непосредственно перед тем, какmakeначинает анализ файла make. Таким образом, если первый шаг в файле make — это проверка последнего слова этой переменной, то оно будет именем текущего файла make. Однако, после того как текущий файл make использовалinclude, последним словом будет имя только что включённого файла make.Если файл make с именем
Makefileсодержит следующее:name1 := $(lastword $(MAKEFILE_LIST)) include inc.mk name2 := $(lastword $(MAKEFILE_LIST)) all: @echo name1 = $(name1) @echo name2 = $(name2)то ожидаемый вывод будет следующим:
name1 = Makefile name2 = inc.mk
.DEFAULT_GOAL-
Устанавливает целевое значение по умолчанию, используемое, если на командной строке не было указано никаких целей (см. Аргументы для указания целей). Переменная
.DEFAULT_GOALпозволяет обнаружить текущую целевую задачу по умолчанию, перезапустить алгоритм выбора целевой задачи по умолчанию, очистив её значение, или явно установить целевую задачу по умолчанию. Следующий пример иллюстрирует эти случаи:# Query the default goal. ifeq ($(.DEFAULT_GOAL),) $(warning no default goal is set) endif .PHONY: foo foo: ; @echo $@ $(warning default goal is $(.DEFAULT_GOAL)) # Reset the default goal. .DEFAULT_GOAL := .PHONY: bar bar: ; @echo $@ $(warning default goal is $(.DEFAULT_GOAL)) # Set our own. .DEFAULT_GOAL := foo
Этот файл make выводит:
no default goal is set default goal is foo default goal is bar foo
Обратите внимание, что присвоение более одного имени цели переменной
.DEFAULT_GOALявляется недопустимым и приведёт к ошибке. MAKE_RESTARTS-
Эта переменная устанавливается только в том случае, если данный экземпляр
makeбыл перезапущен (см. Как файлы make пересоздаются): она будет содержать количество перезапусков этого экземпляра. Обратите внимание, что это не то же самое, что рекурсия (считается переменнойMAKELEVEL). Не следует устанавливать, изменять или экспортировать эту переменную. MAKE_TERMOUTMAKE_TERMERR-
При запуске
makeпроверяется, выводятся ли stdout и stderr на терминал. Если да, тоMAKE_TERMOUTиMAKE_TERMERRсоответственно устанавливаются в имя устройства терминала (илиtrue, если это невозможно определить). Если установлено, эти переменные будут помечены для экспорта. Эти переменные не будут измененыmakeи не будут изменены, если уже установлены.Эти значения могут быть использованы (особенно в сочетании с синхронизацией вывода (см. Вывод во время параллельного выполнения), чтобы определить, пишет ли сам
makeв терминал; они могут быть проверены, чтобы решить, следует ли принудительно генерировать цветной вывод для команд рецепта, например.Если вы вызываете под-
makeи перенаправляете его stdout или stderr, вы несёте ответственность за сброс или снятие экспорта этих переменных, если ваши файлы make полагаются на них. .RECIPEPREFIX-
Первый символ значения этой переменной используется как символ, который make предполагает, что вводит строку рецепта. Если переменная пуста (по умолчанию), этот символ — табуляция. Например, это допустимый файл make:
.RECIPEPREFIX = > all: > @echo Hello, world
Значение
.RECIPEPREFIXможет быть изменено несколько раз; после установки оно остаётся в силе для всех правил, проанализированных до тех пор, пока оно не будет изменено. .VARIABLES-
Расширяется до списка имен всех глобальных переменных, определённых до сих пор. Включает переменные с пустыми значениями, а также встроенные переменные (см. Переменные, используемые неявными правилами), но не включает переменные, определённые только в контексте конкретной цели. Обратите внимание, что любое присвоенное значение этой переменной будет проигнорировано; она всегда будет возвращать своё специальное значение.
.FEATURES
-
Расширяется до списка специальных функций, поддерживаемых этой версией
make. Возможные значения включают, но не ограничиваются:- ‘archives’
-
Поддерживает файлы
ar(архива) с использованием специального синтаксиса имён файлов. См. Использованиеmakeдля обновления архивов. - ‘check-symlink’
-
Поддерживает флаг
-L(--check-symlink-times) . См. Сводка опций. - ‘else-if’
-
Поддерживает условные операторы «else if» без вложенности. См. Синтаксис условных операторов.
- ‘extra-prereqs’
-
Поддерживает специальную цель
.EXTRA_PREREQS. - ‘grouped-target’
-
Поддерживает синтаксис группированных целей для явных правил. См. Несколько целей в правиле.
- ‘guile’
-
GNU Guile доступен как встроенный язык расширений. См. Интеграция GNU Guile.
- ‘jobserver’
-
Поддерживает улучшенные параллельные сборки «сервера задач». См. Параллельное выполнение.
- ‘jobserver-fifo’
-
Поддерживает улучшенные параллельные сборки «сервера задач» с использованием именованных каналов. См. Интеграция GNU
make. - ‘load’
-
Поддерживает динамически загружаемые объекты для создания пользовательских расширений. См. Загрузка динамических объектов.
- ‘notintermediate’
-
Поддерживает специальную цель
.NOTINTERMEDIATE. См. Интеграция GNUmake. - ‘oneshell’
-
Поддерживает специальную цель
.ONESHELL. См. Использование одной оболочки. - ‘order-only’
-
Поддерживает порядок-только зависимости. См. Типы зависимостей.
- ‘output-sync’
-
Поддерживает параметр командной строки
--output-sync. См. Сводка опций. - ‘second-expansion’
-
Поддерживает вторичное развёртывание списков зависимостей.
- ‘shell-export’
-
Поддерживает экспорт переменных
makeв функцииshell. - ‘shortest-stem’
-
Использует метод «наименьшего стебля» для выбора шаблона из нескольких применимых вариантов. См. Как соответствуют шаблоны.
- ‘target-specific’
-
Поддерживает задания переменных, специфичных для цели и шаблона. См. Значения переменных, специфичные для цели.
- ‘undefine’
Поддерживает директиву
undefine. См. Директива Undefine.
.INCLUDE_DIRS-
Расширяется до списка директорий, которые
makeищет включённые makefiles (см. Включение других Makefiles). Обратите внимание, что изменение значения этой переменной не изменяет список директорий, которые проверяются. .EXTRA_PREREQS-
Каждое слово в этой переменной — это новая зависимость, добавляемая к целям, для которых она установлена. Эти зависимости отличаются от обычных зависимостей тем, что они не отображаются ни в одной из автоматических переменных (см. Автоматические переменные). Это позволяет определять зависимости, которые не влияют на рецепт.
Рассмотрим правило для компоновки программы:
myprog: myprog.o file1.o file2.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS)Теперь предположим, что вы хотите улучшить этот Makefile, чтобы гарантировать, что обновления компилятора приведут к повторной компоновке программы. Вы можете добавить компилятор как зависимость, но вы должны убедиться, что он не передаётся как аргумент команде компоновки. Вам понадобится что-то вроде этого:
myprog: myprog.o file1.o file2.o $(CC) $(CC) $(CFLAGS) $(LDFLAGS) -o $@ \ $(filter-out $(CC),$^) $(LDLIBS)Теперь рассмотрим случай с несколькими дополнительными зависимостями: все они должны быть отфильтрованы. Использование
.EXTRA_PREREQSи целевых переменных предоставляет более простое решение:myprog: myprog.o file1.o file2.o $(CC) $(CFLAGS) $(LDFLAGS) -o $@ $^ $(LDLIBS) myprog: .EXTRA_PREREQS = $(CC)Эта функция также может быть полезна, если вы хотите добавить зависимости в Makefile, который вы не можете легко изменить: вы можете создать новый файл, такой как extra.mk:
myprog: .EXTRA_PREREQS = $(CC)
затем вызовите
make -f extra.mk -f Makefile.Установка
.EXTRA_PREREQSглобально добавит эти зависимости ко всем целям (которые сами не переопределили её значение специфичным для цели). Обратите внимание, чтоmakeдостаточно умён, чтобы не добавлять зависимость, указанную в.EXTRA_PREREQS, как зависимость к самой себе.
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/Special-Variables.html