Spec-Zone.ru › GNU Make

Специальные встроенные имена целей

Некоторые имена имеют специальное значение, если они появляются в качестве целей.

.PHONY

Предпосылки специальной цели .PHONY считаются фиктивными целями. Когда приходит время рассмотреть такую цель, make выполнит свой рецепт безусловно, независимо от того, существует ли файл с таким именем или каково его последнее время модификации. См. Фиктивные цели.

.SUFFIXES

Предпосылки специальной цели .SUFFIXES — список суффиксов, которые будут использоваться при проверке правил суффикса. См. Правила суффикса устаревшего формата.

.DEFAULT

Рецепт, указанный для .DEFAULT, используется для любой цели, для которой не найдены правила (ни явные, ни неявные). См. Последний шанс. Если указан рецепт .DEFAULT, каждый файл, упомянутый в качестве предпосылки, но не как цель в правиле, будет иметь этот рецепт, выполненный от его имени. См. Алгоритм поиска неявных правил.

.PRECIOUS

Цели, от которых зависит .PRECIOUS, получают следующее специальное обращение: если make убит или прерван во время выполнения их рецептов, цель не удаляется. См. Прерывание или убийство make. Также, если цель является промежуточным файлом, она не будет удалена после того, как она больше не потребуется, как это обычно делается. См. Цепочки неявных правил. В последнем аспекте она перекликается со специальной целью .SECONDARY.

Вы также можете указать шаблон цели неявного правила (например, «%.o») как файл-предпосылку специальной цели .PRECIOUS для сохранения промежуточных файлов, созданных правилами, шаблоны целей которых соответствуют имени этого файла.

.INTERMEDIATE

Цели, от которых зависит .INTERMEDIATE, обрабатываются как промежуточные файлы. См. Цепочки неявных правил. .INTERMEDIATE без предпосылок не имеет эффекта.

.NOTINTERMEDIATE

Предпосылки специальной цели .NOTINTERMEDIATE никогда не рассматриваются как промежуточные файлы. См. Цепочки неявных правил. .NOTINTERMEDIATE без предпосылок приводит к тому, что все цели обрабатываются как не промежуточные.

Если предпосылкой является шаблон цели, то цели, которые строятся с использованием этого правила шаблона, не считаются промежуточными.

.SECONDARY

Цели, от которых зависит .SECONDARY, обрабатываются как промежуточные файлы, за исключением того, что они никогда автоматически не удаляются. См. Цепочки неявных правил.

.SECONDARY может быть использовано для предотвращения избыточных перестроек в некоторых необычных ситуациях. Например:

hello.bin: hello.o bye.o
        $(CC) -o $@ $^

%.o: %.c
        $(CC) -c -o $@ $<

.SECONDARY: hello.o bye.o

Предположим, hello.bin актуальна по отношению к исходным файлам, но отсутствует файл объекта hello.o. Без .SECONDARY make перестроит hello.o, а затем перестроит hello.bin, хотя исходные файлы не изменились. Объявив hello.o как .SECONDARY make не потребуется перестраивать его и не потребуется перестраивать hello.bin тоже. Конечно, если один из исходных файлов был обновлён, все файлы объектов были бы перестроены, чтобы создание hello.bin могло успешно завершиться.

.SECONDARY без предпосылок приводит к тому, что все цели обрабатываются как вторичные (т. е. ни одна цель не удаляется, потому что она считается промежуточной).

.SECONDEXPANSION

Если .SECONDEXPANSION упомянута в качестве цели где-либо в файле make, то все списки предпосылок, определённые после её появления, будут расширены второй раз после того, как все файлы make будут прочитаны. См. Второе расширение.

.DELETE_ON_ERROR

Если .DELETE_ON_ERROR упомянута в качестве цели где-либо в файле make, то make удалит цель правила, если она изменилась, и её рецепт завершился с ненулевым выходным статусом, точно так же, как это происходит при получении сигнала. См. Ошибки в рецептах.

.IGNORE

Если вы указываете предпосылки для .IGNORE, то make проигнорирует ошибки при выполнении рецепта для этих конкретных файлов. Рецепт для .IGNORE (если есть) игнорируется.

Если упомянута в качестве цели без предпосылок, .IGNORE говорит проигнорировать ошибки при выполнении рецептов для всех файлов. Это использование «.IGNORE» поддерживается только для исторической совместимости. Поскольку это влияет на каждый рецепт в файле make, это не очень полезно; мы рекомендуем использовать более избирательные способы игнорирования ошибок в определённых рецептах. См. Ошибки в рецептах.

.LOW_RESOLUTION_TIME

Если вы указываете предпосылки для .LOW_RESOLUTION_TIME, make предполагает, что эти файлы создаются командами, которые генерируют отметки времени с низким разрешением. Рецепт для .LOW_RESOLUTION_TIME цели игнорируется.

Отметки времени файлов с высоким разрешением многих современных файловых систем уменьшают вероятность того, что make ошибочно сделает вывод о том, что файл актуальный. К сожалению, некоторые хосты не предоставляют способ установить отметку времени файла с высоким разрешением, поэтому команды, такие как «cp -p», которые явно устанавливают отметку времени файла, должны отбросить её подсекундную часть. Если файл создаётся такой командой, вы должны указать его как предпосылку для .LOW_RESOLUTION_TIME чтобы make не делал ошибочного вывода о том, что файл неактуальный. Например:

.LOW_RESOLUTION_TIME: dst
dst: src
        cp -p src dst

Поскольку «cp -p» отбрасывает подсекундную часть отметки времени src, dst обычно немного старше, чем src, даже когда она актуальна. Строка .LOW_RESOLUTION_TIME заставляет make считать dst актуальной, если её отметка времени находится в начале той же секунды, что и отметка времени src.

Из-за ограничения формата архива, отметки времени членов архива всегда имеют низкое разрешение. Вам не нужно указывать члены архива в качестве предпосылок для .LOW_RESOLUTION_TIME, так как make делает это автоматически.

.SILENT

Если вы указываете предпосылки для .SILENT, то make не будет выводить рецепт, используемый для пересоздания этих конкретных файлов, перед их выполнением. Рецепт для .SILENT игнорируется.

Если упомянута как цель без предпосылок, .SILENT говорит не выводить рецепты перед их выполнением. Вы также можете использовать более избирательные способы отключения вывода конкретных команд рецептов. См. Вывод рецептов. Если вы хотите отключать все рецепты для определённого запуска make, используйте параметр «-s» или «--silent» (см. Обзор параметров).

.EXPORT_ALL_VARIABLES

Просто указав её как цель, вы говорите make экспортировать все переменные в дочерние процессы по умолчанию. Это альтернатива использованию export без аргументов. См. Передача переменных подпроцессу make.

.NOTPARALLEL

Если .NOTPARALLEL упоминается как цель без предпосылок, все цели в этом вызове make будут выполняться последовательно, даже если задан параметр «-j». Любая рекурсивно вызываемая команда make по-прежнему будет выполнять рецепты параллельно (если её файл make также не содержит этой цели).

Если у .NOTPARALLEL есть цели в качестве предпосылок, то все предпосылки этих целей будут выполняться последовательно. Это неявно добавляет .WAIT между каждой предпосылкой перечисленных целей. См. Отключение параллельного выполнения.

.ONESHELL

Если .ONESHELL упомянута как цель, то при построении цели все строки рецепта будут переданы одному вызову оболочки, а не каждый строка будет вызываться отдельно. См. Выполнение рецепта.

.POSIX

Если .POSIX упомянута как цель, то файл make будет проанализирован и запущен в режиме совместимости с POSIX. Это не означает, что будут приниматься только файлы make, совместимые с POSIX: все расширенные возможности GNU make по-прежнему доступны. Скорее, эта цель заставляет make вести себя так, как требуется POSIX, в тех областях, где поведение make по умолчанию отличается.

В частности, если эта цель упомянута, рецепты будут вызываться так, как если бы оболочке был передан флаг -e: первая неисправная команда в рецепте вызовет немедленное завершение рецепта с ошибкой.

Любой определённый суффикс неявного правила также считается специальной целью, если он появляется как цель, а также конкатенация двух суффиксов, таких как «.c.o». Эти цели — правила суффиксов, устаревший способ определения неявных правил (но способ, который всё ещё широко используется). В принципе, любое имя цели могло бы быть специальным таким образом, если вы разделите его на две части и добавите обе части в список суффиксов. На практике суффиксы обычно начинаются с «.», поэтому эти имена специальных целей также начинаются с «.». См. Правила суффикса устаревшего формата.

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-Targets.html

Spec-Zone.ru

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