Программирование PC Makefile: специальные встроенные имена целей Sat, December 21 2024  

Поделиться

Нашли опечатку?

Пожалуйста, сообщите об этом - просто выделите ошибочное слово или фразу и нажмите Shift Enter.


Makefile: специальные встроенные имена целей Печать
Добавил(а) microsin   

Некоторые имена обладают специальным значением, если они появляются в Makefile как цели компиляции (targets).

.PHONY

Prerequisites, необходимые файлы (см. "Словарик") специальной target .PHONY рассматриваются как фиктивные, не файловые цели (phony targets). Когда пришло время рассмотреть такую target, утилита make будет выполнять свой recipe безоговорочно, независимо от того, существует ли файл с этим именем, или каково его время последней модификации. См. "4.6 Phony Targets" [1].

.SUFFIXES

Prerequisites специальной target .SUFFIXES представляют собой список суффиксов, используемые в проверках правил суффиксов. См. "10.7 Old-Fashioned Suffix Rules" [1].

.DEFAULT

Prerequisite, указанное для .DEFAULT, используется для любой target, для которой не найдены правила (явные или неявные), см. "10.6 Defining Last-Resort Default Rules" [1]. Если указан recipe .DEFAULT, то каждый файл, упомянутый как prerequisite, но не как target в правиле, будет иметь этот recipe, выполняемый от его имени. См. "10.8 Implicit Rule Search Algorithm" [1].

.PRECIOUS

Target-ы, от которых зависит .PRECIOUS, получают следующий специальный режим: если make прибит или прерван во время выполнения его recipes, то target не удаляется. См. "5.6 Interrupting or Killing make" [1]. Также, если target это промежуточный файл, то он не будет удален после того, как больше не будет нужен, как это обычно делалось. См. "10.4 Chains of Implicit Rules" [1]. В этом отношении она перекрывает специальную target .SECONDARY.

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

.INTERMEDIATE

Target-ы, от которых зависит .INTERMEDIATE, рассматриваются как промежуточные файлы. См. "10.4 Chains of Implicit Rules" [1]. .INTERMEDIATE без prerequisites не имеет никакого эффекта.

.NOTINTERMEDIATE

Prerequisites специальной target .NOTINTERMEDIATE никогда не рассматриваются как промежуточные файлы. См. "10.4 Chains of Implicit Rules" [1]. .NOTINTERMEDIATE без prerequisites приводит к тому, что все target-ы обрабатываются как не промежуточные.

Если prerequisite это шаблон target, то target-ы, построенные с использованием этого правила шаблона, не считаются промежуточными.

.SECONDARY

Target-ы, от которых зависит .SECONDARY, рассматриваются как промежуточные файлы за исключением того, что они никогда не удаляются автоматически. См. "10.4 Chains of Implicit Rules" [1].

.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, не нужно будет пересобирать его, и не нужно будет пересобирать hello.bin. Конечно, если один из файлов исходного кода обновился, все объектные файлы были бы пересобраны так, чтобы мог быть успешно собран hello.bin.

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

.SECONDEXPANSION

Если в любом месте makefile упомянуто .SECONDEXPANSION как target, то все списки prerequisite, определенные после него, будут расширены второй раз после прочтения всех makefile. См. "3.9 Secondary Expansion" [1].

.DELETE_ON_ERROR

Если в любом месте makefile упомянуто .DELETE_ON_ERROR как target, то make удалит target правила, если оно было изменено, и его recipe совершил выход с ненулевым статусом, как и при получении сигнала. См. [3].

.IGNORE

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

Если .IGNORE используется как target без prerequisites, то .IGNORE говорит игнорировать ошибки в выполнении recipes для всех файлов. Это использование .IGNORE поддерживается только для исторической совместимости. Поскольку это влияет на каждое recipe в makefile, то не слишком полезно; рекомендуется использовать более выборочные способы игнорировать ошибки в определенных recipes. См. [3].

.LOW_RESOLUTION_TIME

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

Метки времени высокого разрешения многих современных файловых систем уменьшают вероятность ошибочного вывода о том, что файл обновлен. К сожалению, некоторые хосты не предоставляют способа установить метку времени высокого разрешения, так что команды наподобие cp -p, явно устанавливающие метку времени файла, должен отбрасывать его субсекундную часть. Если файл был создан такой командой, следует перечислить его как prerequisite .LOW_RESOLUTION_TIME, чтобы make ошибочно не заключил, что файл устарел. Для примера:

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

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

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

.SILENT

Если вы укажете prerequisites для .SILENT, то make не напечатает recipe, используемое для перестроения этих определенных файлов перед их выполнением. Recipe для .SILENT игнорируется.

Если .SILENT упоминалось как target без prerequisites, то оно говорит не печатать никакие recipes перед их выполнением. Вы можете также использовать более избирательные пути подавить вывод определенных командных строк recipe. См. "5.2 Recipe Echoing" [1]. Если вы хотите подавить вывод все recipe для определенного запуска make, то используйте опцию -s или --silent (см. "9.8 Summary of Options" [1]).

.EXPORT_ALL_VARIABLES

При простом упоминании как target это говорит о том, что make по умолчанию экспортирует все переменные в дочерние процессы. Это альтернатива использованию export без аргументов. См. "5.7.2 Communicating Variables to a Sub-make" [1].

.NOTPARALLEL

Если .NOTPARALLEL упоминается как target без prerequisites, то все target-ы в этом вызове make запустятся последовательно, даже если указана опция -j. Любая рекурсивно вызванная команда make все еще будет запускать recipes параллельно (за исключением, если их makefile также содержит эту target).

Если .NOTPARALLEL имеет target-ы в качестве prerequisites, то все prerequisites этих target-ов будут запущены последовательно. Это неявно добавит .WAIT между каждым prerequisite перечисленных target. См. "5.4.1 Disabling Parallel Execution" [1].

.ONESHELL

Если .ONESHELL упоминается как target, то при построении target все строки recipe будут переданы одному вызову shell-а, а не каждой строке, вызываемой отдельно. См. "5.3 Recipe Execution" [1].

.POSIX

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

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

Любой определенный неявный суффикс правила также считается специальной target, если он появляется как target, а также конкатенация двух суффиксов, таких как '.c.o'. Эти target являются суффиксными правилами, устаревшим способом определения неявных правил (но все еще широко используемым способом). В принципе, любое целевое имя может быть особым, если разбить его на две части и добавить обе части в список суффиксов. На практике суффиксы обычно начинаются с '.', поэтому эти специальные целевые имена также начинаются с '.'. См. "10.7 Old-Fashioned Suffix Rules" [1].

[Словарик]

Для сохранения смысла некоторые термины оставлены как есть, без перевода. Ниже приведена попытка объяснения этих терминов.

Makefile последовательность инструкций, которые управляют процессом сборки make.

prerequisite требования, или списки предварительных условий. Это список имен файлов, появляющихся после метки target и двоеточия.

recipe рецепт, или последовательность строк операторов, которые идут за меткой target в Makefile.

target метка, обозначающая целевой файл (файлы) сборки.

Картинка, поясняющая эти термины:

make terms

[Ссылки]

1. GNU make.
2Магия makefile на простых примерах.
3. Makefile: ошибки в списке команд команд цели (recipe errors).

 

Добавить комментарий


Защитный код
Обновить

Top of Page