Spec-Zone.ru › GNU Make

Другие специальные переменные

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_TERMOUT
MAKE_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. См. Интеграция GNU make.

‘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

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API