Программирование PC Как запускать make Tue, January 21 2025  

Поделиться

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

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


Как запускать make Печать
Добавил(а) microsin   

Файл Makefile с набором инструкций для утилиты make можно использовать несколькими способами. Самое простое использование - перекомпилировать каждый файл, который устарел. Обычно файлы makefile пишутся так, что если вы запускаете make без аргументов, он делает именно это (запуск make или make all).

Однако возможно вы захотите обновить только некоторые файлы; вы можете захотеть использовать другой компилятор или другие опции компилятора; также возможно вы захотите обнаружить, какие файлы устарели, без их обновления (без перекомпиляции).

С помощью аргументов, передаваемых в командную строку make, вы все это сможете сделать, а также многое друое.

Утилита make при выходе всегда возвращает одно из трех значений статуса:

0 Говорит об успешном завершении работы make.
2 В работе make произошли ошибки. Будут напечатаны соответствующие сообщения с описанием этих ошибок. 
1 Статус выхода, если вы использовали флаг -q, и утилита make определила, что какая-то target еще не обновлена. См. "9.3 Instead of Executing Recipes" [1].

См. также:

Опцией -f или --file вы можете указать для make, какой файл makefile она должна обрабатывать (также работает опция --makefile). Например, -f altmake говорит использовать файл altmake в качестве makefile.

Если вы используете флаг -f несколько раз, и за каждым -f указываете аргумент, то все используемые файлы обрабатываются совместно как файлы makefile.

Если вы не используете флаг -f или --file, то по умолчанию утилита make пытается обнаружить и обработать файлы инструкций в следующем порядке: GNUmakefile, makefile и Makefile, и будет использовать первый попавшийся из них (см. "3 Writing Makefiles" [1]).

Goals это цели компиляции (target-ы), которые запуск make должен стремиться в конечном итоге обновить. Другие target-ы также обновляются, если они появляются в качестве предпосылок целей (prerequisites) целей или предпосылок предпосылок целей и т. д.

По умолчанию goal это первая target в makefile (не считая target-ы, начинающиеся с точки, см. [2]). Поэтому обычно файлы makefile пишутся так, что первой целью является компиляция всей программы или программ, которые makefile описывают. Если первое правило (rule) в makefile имеет несколько target-ов, то только первое правило становится goal по умолчанию, а не весь список. Вы можете управлять выбором goal по умолчанию из своего makefile, используя переменную .DEFAULT_GOAL (см. "6.14 Other Special Variables" [1]).

Вы также можете указать другую goal или несколько goal в командной строке аргументов make. Используйте имя goal в качестве аргумента. Если вы укажете несколько goal, то make обработает каждую из них по очереди, в том порядке указания их имен.

Любая target в makefile может быть указана в качестве goal (за исключением случаев, когда она начинается с '-' или содержит '=', тогда это соответственно парсится как оператор switch или определение переменной). Даже могут быть указаны target-ы, не находящиеся в makefile, если make может найти неявные правила (implicit rules), которые говорят, как их обработать.

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

Пример подходящего использования MAKECMDGOALS - чтобы избежать подключения .d файлов во время обработки правил очистки (clean rules, см. "4.14 Generating Prerequisites Automatically" [1]), поэтому make не будет создавать их заново только для немедленного удаления:

sources = foo.c bar.c

ifeq (,$(filter clean,$(MAKECMDGOALS))
include $(sources:.c=.d)
endif

Одно из использований указания goal - если вы хотите скомпилировать только часть своей программы, или только одну (или некоторые по выбору) из нескольких программ. Укажите в качестве goal каждый файл, который вы хотите пересоздать. Для примера рассмотрим директорию, содержащую несколько программ, с файлом makefile, начинающимся примерно так:

.PHONY: all
all: size nm ld ar as

Если вы работаете с программой size, то можете запустить команду make size, чтобы были скомпилированы только файлы этой программы.

Другой вариант применения указания goal - когда нужно создать файлы, которые обычно не создаются. Например, это может быть файл вывода отладки или версия программы, которая скомпилирована специально для тестирования, которая имеет соответствующее правило в makefile, но не является prerequisite для default goal.

Еще один вариант применения указания goal - запуск recipe, связанного с phony target (см. "4.6 Phony Targets" [1]) или с empty target (см. "4.8 Empty Target Files to Record Events" [1]). Многие makefile содержат phony target с именем clean, которая удаляет все, кроме исходных файлов. Естественно, это делается только в том случае, если вы явно запрашиваете это действие запуском make clean. Ниже приведен список имен типичных phony target и empty target. Подробный список всех стандартных целевых имен, используемых программными пакетами GNU, см. в разделе "16.6 Standard Targets for Users" [1].

all
    Выполнит сборку всех target-ов верхнего уровня, прописанных в makefile.

clean
    Удалит все файлы, которые обычно создаются при запуске make.

mostlyclean
    Работает подобно 'clean', но может воздержаться от удаления нескольких файлов, которые люди обычно не хотят перекомпилировать. Например, 'mostlyclean' target для GCC не удаляет libgcc.a, потому что перекомпиляция требуется редко, и занимает некоторое время.

distclean
realclean
clobber
    Любая из этих target-ов может быть определена, чтобы удалять большее количество файлов, чем 'clean'. Например, это может удалять конфигурационные файлы или линки, которые вы нормально создаете как подготовка к компиляции, даже если сам makefile не может создать эти файлы.

install
    Копирует исполняемый файл в директорию, которую обычно используют для команд; копирует любые дополнительные файлы в директории, в которые исполняемые файлы их ищут.

print
    Напечатает листинги измененных исходных файлов.

tar
    Создаст tar-файл исходных файлов.

shar
    Создаст shell-архив (файл shar) исходных файлов.

dist
    Создаст файл дистрибутива исходных файлов. Это может быть tar-файл, или shar-файл, или их сжатая версия, или даже больше одного из перечисленного выше.

TAGS
    Обновит таблицу тегов для этой программы.

check
test
    Выполнит тесты самопроверки на программе, которую собирает этот makefile.

Файл makefile сообщает для make как определить, является ли target актуальной (up to date), и как обновить каждую target. Однако обновление target-ов это не всегда то, что вам нужно. Некоторые опции указывают для make другие действия.

-n
--just-print
--dry-run
--recon

Это опции (флаги) "бездействия" (No-op). Они заставляют make напечатать те recipe, которые make считает необходимо обновить, чтобы их target-ы были актуальными, но без реального их выполнения. Обратите внимание, что некоторые recipe все еще выполнятся, даже с этим флагом (см. "5.7.1 How the MAKE Variable Works" [1]). Также выполнятся любые recipe, которые должны быть обновлены подключаемыми makefile (см. "3.5 How Makefiles Are Remade" [1]).

-t
--touch

"Touch". Просто пометит target-ы как обновленные, без фактического их изменения. Другими словами, make сделает вид, что обновила target-ы, но на самом деле не поменяет их содержимое; вместо этого только лишь поменяется метка времени файлов.

-q
--question

"Вопрос". По-тихому проверяет, обновлены ли targets, но не выполняет recipes; код выхода покажет, нужно ли что-то обновлять.

 

-W file
--what-if=file
--assume-new=file
--new-file=file

"Что если". За каждым флагом -W идет имя файла. Время модификации данных файлов записывается make как текущее время, хотя актуальные времена модификации остаются прежними. Вы можете использовать флаг -W вместе с флагом -n, чтобы посмотреть, что произойдет, если вы измените определенные файлы.

С флагом -n утилита make напечатает recipe, которое обычно выполняет, но без его выполнения.

С флагом -t утилита make игнорирует recipe в правилах и использует (по сути) команду touch для каждой target, которая должна быть пересоздана. Команда touch также печатается, если не используется опция -s или .SILENT. Для ускорения работы make на самом деле не использует запуск touch. Она выполняет действия напрямую.

С флагом -q утилита make ничего не напечатает и не будет выполнять никакие recipe, однако при выходе код статуса будет нулевой, если и только если target-ы, которые будут рассмотрены, уже обновлены. Если статус выхода 1, то должны быть выполнены некоторые обновления. Если make обнаружит ошибку, то статус выхода будет 2, так вы можете отличить ошибку от ситуации, когда target не обновлена.

Будет ошибкой использовать больше одного из этих флагов для одного и того же запуска make.

Опции -n, -t и -q не влияют на строки recipe, которые начинаются с символов '+', или содержат строки '$(MAKE)' или '${MAKE}'. Обратите внимание, что независимо от этих опций будут выполнены только строки, содержащие символ '+', либо строки '$(MAKE)' или '${MAKE}'. Другие строки в том же правиле не запустятся если они тоже не начинаются с '+', либо не содержат '$(MAKE)' или '${MAKE}' (см. "5.7.1 How the MAKE Variable Works" [1]).

Флаг -t предотвращает обновление phony targets (см. "4.6 Phony Targets" [1]), за исключением ситуации, когда нет строк recipe, начинающихся на '+', либо содержащих '$(MAKE)' или '${MAKE}'.

Флаг -W предоставляет 2 фичи:

• Если вы также используете флаг -n или -q, то вы можете увидеть что будет делать make, если вы измените некоторые файлы.
• Без флага -n или -q, когда make реально выполнит recipes, флаг -W может указать make действовать таким образом, как если бы некоторые файлы были изменены, без реального запуска recipes для этих файлов.

Обратите внимание, что опции -p и -v позволяют вам получить другую информацию про make или про используемые makefiles (см. далее врезку "Сводка по опциям").

Иногда вы поменяли исходный файл, но не хотите перекомпилировать все файлы, которые от него зависят. Для примера предположим, что вы добавили в заголовок макрос, или декларацию, и от этого заголовка зависит множество других файлов. Будучи консервативной, утилита make предполагает, что любое изменение в заголовочном файле требует перекомпиляции всех зависимых файлов, однако вы знаете, что их не нужно перекомпилировать, и предпочли бы не тратить время на ожидание их компиляции.

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

1. Используйте команду make для перекомпиляции исходных файлов, которые на самом деле нуждаются в перекомпиляции, для гарантии, что объектные файлы будут обновлены перед тем, как вы начнете дальнейшие действия.
2. Сделайте изменения в заголовочных файлах.
3. Используйте команду make -t, чтобы пометить все объектные файлы обновленными. В следующий раз, когда вы запустите make, изменения в заголовочных файлах не приведут к перекомпиляции.

Если вы уже изменили заголовочный файл, когда некоторые файлы исходного кода требуют перекомпиляции, то поздно пользоваться опцией -t. Вместо этого вы можете использовать флаг -o file, который пометит указанный файл как "старый" (см. далее врезку "Сводка по опциям"). Это означает, что сам файл не будет переделан, и ничто не будет с его учетом переделано. Выполните следующую процедуру:

1. Перекомпилируйте исходные файлы, которые требуют перекомпиляции по причинам, не зависящим от определенного файла заголовка, с помощью make -o headerfile. Если в это вовлечено несколько заголовочных файлов, то используйте отдельную опцию -o для каждого из них.
2. Выполните "Touch" для всех объектных файлов с помощью make -t.

Аргумент командной строки, который содержит '=', задает значение переменной. Например, v=x установит значение x для переменной v. Если вы таким способом укажете значение, то все обычные присваивания той же самой переменной в makefile игнорируются; мы говорим, что значение переменной в этом случае переназначено аргументом командной строки.

Чаще всего эта возможность используется для передачи компилятору дополнительных флагов. Например, в правильно написанном makefile переменная CFLAGS включена в каждый recipe, который запускает компилятор C, так что файл foo.c компилируется чем-то наподобие следующей команды:

$ cc -c $(CFLAGS) foo.c

Таким образом, любое значение, которое вы установите для CFLAGS, будет влиять на каждую компиляцию. Файл makefile вероятно указывает обычное значение для CFLAGS, примерно так:

CFLAGS=-g

Каждый раз, когда запускаете make, вы можете при желании поменять это значение. Например, если вы запустите make CFLAGS='-g -O', то каждая компиляция C будет осуществляться командой cc -c -g -O (это также иллюстрирует, как вы можете обрамить кавычками значения переменной в шелл, чтобы туда попали пробелы и другие специальные символы, когда меняете переменную).

Переменная CFLAGS это всего лишь одна из многих общепринятых стандартных переменных, специально существующих для того, чтобы вы могли поменять их таким способом. Для полного списка см. "10.3 Variables Used by Implicit Rules" [1].

Также вы можете запрограммировать makefile для просмотра дополнительных ваших переменных, дающих пользователю управление над другими аспектами работы makefile путем изменения этих переменных.

Когда переназначаете переменную через аргумент командной строки, вы можете определить либо рекурсивно расширяемую (recursively-expanded) переменную, либо переменную, расширяемую обычным способом (simply-expanded). Примеры, приведенные выше, делают recursively-expanded переменную; чтобы сделать simply-expanded переменную, записывайте её присваивание через ':=' или '::=' вместо '='. Однако если вы не хотите включить ссылку на переменную или вызов функции в указанное вами значение, то не имеет значения, какой тип переменной вы создаете.

Существует единственный способ, которым makefile может поменять переменную, которую вы переназначили. Этот способ использует директиву override, строка которой выглядит примерно так: 'override variable = value' (см. "6.7 The override Directive" [1]).

Обычно, когда происходит ошибка при выполнении команды шелла, утилита make немедленно сдается, возвращая ненулевой статус. В таком случае больше не запустятся никакие recipe ни для каких target. Ошибка подразумевает, что goal не может быть корректно пересобрана, и make сообщит об этом сразу, как только обнаружит ошибку.

Когда вы компилируете программу, которую только что изменили, это поведение не то, что вам нужно. Место этого вы бы предпочли попробовать сделать компиляцию каждого файла, чтобы сразу показать как можно больше ошибок компиляции, насколько это возможно. Тогда вы могли бы увидеть и исправить их все без дополнительного запуска make [3] (что может быть важно, когда компилируется большой проект, на что тратится значительное время).

Для таких случаев вы должны использовать флаг -k или --keep-going. Это укажет make продолжить компиляцию для других prerequisites ожидающих обновления target, пересобирая их при необходимости, перед тем как сдаться и вернуть ненулевой статус. Например, после ошибки в компиляции одного объектного файла make -k продолжит компилировать другие объектные файлы, хотя уже известно, что конечная цель процесса недостижима. В дополнение к продолжению после ошибочных команд shell, make -k будет продолжать работу как можно дальше после того, как обнаружит, что не знает как создать файл target или prerequisite. Это всегда приводит к сообщению об ошибке, однако без использования -k такая ошибка фатальна (см. далее врезку "Сводка по опциям").

Обычное поведение make предполагает, что ваша цель состоит в том, чтобы обновить goals; как только make обнаружит, что это невозможно, она сообщит об этом отказе немедленно. Опция -k указывает, что реальная цел состоит в проверке как можно большего количества изменений в программе, чтобы возможно найти несколько независимых проблем, которые вы могли бы исправить перед новой попыткой компиляции. Как раз по этой причине команда компиляции Emacs передает по умолчанию флаг -k.

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

Если установлена переменная окружения MAKE_TMPDIR, то все временные файлы, создаваемые make, будут помещены в директорию, указанную этой переменной.

Если MAKE_TMPDIR не установлена, то используется стандартное размещение временных файлов текущей операционной системы. Для POSIX-систем это будет место, указанное переменной окружения TMPDIR, или иначе используется системное умолчание (например папка /tmp). На Windows сначала будет проверена переменная TMP, затем TEMP, затем TMPDIR, и наконец будет использоваться системное место по умолчанию для временного файла.

Имейте в виду, что эта директория уже должна существовать, иначе make потерпит сбой: make не будет пытаться создать директорию для временных файлов.

Эти переменные не могут быть установлены внутри makefile: GNU make должна иметь доступ к месту временного хранения файлов до момента, когда начнет чтение файлов makefile.

-b
-m

    Эти опции игнорируются для совместимости с другими версиями make.

-B
--always-make

    Считает все target-ы устаревшими. GNU make продолжает рассматривать targets и их prerequisites, используя обычные алгоритмы; однако все цели, рассматриваемые таким образом, всегда перестраиваются заново независимо от статуса их prerequisites. Во избежание бесконечной рекурсии, если установлено MAKE_RESTARTS (см. "6.14 Other Special Variables" [1]) в значение больше 0, то эта опция запрещается при рассмотрении вопроса о переделке файлов makefile (см. "3.5 How Makefiles Are Remade" [1]).

-C dir
--directory=dir

    Меняет директорию на dir перед чтением файлов makefile. Если указано несколько опций -C, то каждая из них интерпретируется относительно предыдущей: '-C / -C etc' эквивалентно '-C /etc'. Это обычно используется вместе с рекурсивными вызовами make (см. "5.7 Recursive Use of make" [1]).

-d

    Печатает отладочную информацию в дополнение к обычной обработке. Отладочная информация говорит, какие файлы рассмотрены для перестроения, какие времена файлов сравниваются и с какими результатами, какие файлы на самом деле необходимо перестроить, какие неявные правила (implicit rules) рассматриваются и какие применяются - все интересное о том, как make решает, что делать. Опция -d эквивалентна --debug=a (см. далее).

--debug[=options]

    Печатает отладочную информацию в дополнение к обычной обработке, с указанием уровня отладочных сообщений. Могут быть выбраны различные уровни и типы вывода. Без аргументов печатает отладочную информацию "базового" уровня (basic). Ниже приведены возможные аргументы этой опции; рассматривается только их первый символ, и значения должны отделяться друг от друга запятой или пробелом.

    a (all)

        Разрешены все типы отладочного вывода. Это эквивалентно использованию -d.

    b (basic)

        Базовая отладочная информация - выводится на печать каждая target, которая была найдена как устаревшая (out-of-date), и была ли сборка успешной или нет.

    v (verbose)

        Уровень выше 'basic'; включает сообщения о том, какие файлы makefile были разобраны, prerequisites которые не нужно было перестраивать, и т. д. Эта опция также разрешает сообщения уровня 'basic'.

    i (implicit)

        Печатает сообщения, описывающие неявный поиск правил для каждой цели. Эта опция также разрешает сообщения уровня 'basic'.

    j (jobs)

        Печатает сообщения, содержащие подробные сведения о вызове определенных подкоманд.

    m (makefile)

        По умолчанию показанные выше сообщения не разрешены при попытке перестроить (remake) файлы makefile. Эта опция разрешает сообщения также и при перестроении файлов makefile. Обратите внимание, что опция 'all' разрешает эту опцию. Эта опция также разрешает сообщения уровня 'basic'.

    p (print)

        Печатает выполняемый recipe, даже когда recipe обычно молчит (из-за .SILENT или '@'). Также печатает имя makefile и его строку, где был определен recipe.

    w (why)

        Объясняет, почему каждая target должна быть пересоздана, показывая, какие prerequisites более актуальны, чем target.

    n (none)

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

-e
--environment-overrides

    Присваивает приоритет переменным, взятым из окружения, перед переменным из файлов makefile. См. "6.10 Variables from the Environment" [1].

-E string
--eval=string

    Обработает string как синтаксис makefile. Это версия командной строки функции eval (см. "8.10 The eval Function" [1]). Вычисление выполняется после того, как определены правила и переменные по умолчанию, но до чтения любых файлов makefile.

-f file
--file=file
--makefile=file

    Читает файл с именем file как makefile. См. "3 Writing Makefiles" [1].

-h
--help

    Напомнит вам об опциях, которые понимает make, и завершит работу make.

-i
--ignore-errors

    Игнорирует все ошибки в recipe, выполняемых для пересборки файлов. См. [3].

-I dir
--include-dir=dir

    Укажет директорию dir для поиска подключаемых файлов makefile. См. "3.3 Including Other Makefiles" [1]. Если используется несколько опций -I для указания нескольких директорий, то директории просматриваются в указанном порядке. Если директория dir это одиночное тире (-), то все уже указанные директории до этого момента (включая пути директории по умолчанию) будут отброшены. Вы можете просмотреть текущий список директорий для поиска через переменную .INCLUDE_DIRS.

-j [jobs]
--jobs[=jobs]

    Указывает количество одновременно запускаемых обработок recipe (jobs). Без аргумента make запустит одновременно столько recipe, сколько возможно. Если указано более одной опции -j, то вступит в действие последняя из них. Для дополнительной информации о том, как запускаются recipes, см. "5.4 Parallel Execution" [1]. Имейте в виду, что на MS-DOS эта опция игнорируется.

--jobserver-style=[style]

    Выбирает стиль используемого сервера заданий. Эта опция дает эффект только если разрешены параллельные сборки (см. "5.4 Parallel Execution" [1]). На POSIX-системах style может быть fifo (умолчание) или pipe. На Windows допускается только стиль sem (умолчание). Эта опция полезна, если вам нужно использовать более старые версии GNU make, или другой инструмент, требующий определенного стиля jobserver.

-k
--keep-going

    Продолжит работу после возникновения ошибки, насколько это возможно. Хотя не может быть собрана target, потерпевшая неудачу и все то, что от неё зависит, все же могут быть обработаны другие prerequisites этих target. См. выше врезку "Тестирование компиляции программы".

-l [load]
--load-average[=load]
--max-load[=load]

    Указывает, что новые recipe не должны запускаться, если выполняются другие recipe, и среднее значение нагрузки процессора составляет как минимум load (число с плавающей запятой). Без аргумента удалит предыдущий лимит нагрузки. См. "5.4 Parallel Execution" [1].

-L
--check-symlink-times

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

-n
--just-print
--dry-run
--recon

    Распечатает recipe, который будет выполнен, но без его выполнения (за исключением определенных обстоятельств). См. выше врезку "Вместо выполнения Recipes".

-o file
--old-file=file
--assume-old=file

    Не пересоздавать файл file, даже если он более старый, чем его prerequisites, и не пересоздавать ничего из-за учета изменений в файле. По сути файл рассматривается как очень старый, и его правила игнорируются. См. выше врезку "Как избежать перекомпиляции некоторых файлов".

-O[type]
--output-sync[=type]

    Гарантирует, что все выходные данные каждого recipe печатаются в одной непрерывной последовательности. Эта опция полезна только когда используется опция --jobs для запуска нескольких recipe одновременно (см. "5.4 Parallel Execution" [1]). Без этой опции вывод будет отображаться как есть, как он генерируется командами нескольких recipe.

    Когда тип type не указан, или тип 'target', данные вывода из всего recipe каждой target группируются вместе. С типом 'line' вывод каждой строки в recipe группируется вместе. С типом 'recurse' вывод из всех рекурсий make группируется вместе. С типом 'none' никакая синхронизация вывода не производится. См. "5.4.2 Output During Parallel Execution" [1].

-p
--print-data-base

    Напечатает базу данных (правила и значения переменных), полученную из чтения файлов makefile; затем выполнит все как обычно, если не указано что-то другое. Это также напечатает информацию версии, которую выдает опция -v (см. далее). Для печати базы данных без пересборки файлов используйте make -qp. Для печати базы данных предварительно заданных правил и переменных используйте make -p -f /dev/null. Вывод базы данных содержит информацию имени файла и номера строки для определений recipe и переменной, так что это может быть полезно как инструмент отладки в сложных окружениях.

-q
--question

    "Режим вопроса". Не запускает никакие recipe, или ничего не напечатает; просто возвратит статус 0 выхода, если указанные target уже обновлены, статус 1 если требуется любая пересборка, или статус 2 если произошла ошибка. См. выше врезку "Вместо выполнения Recipes".

-r
--no-builtin-rules

    Исключит использование встроенных неявных правил (built-in implicit rules, см. "10 Using Implicit Rules" [1]). Вы все еще можете определить свои собственные написанные правила шаблона (см. "10.5 Defining and Redefining Pattern Rules" [1]). Опция -r также очистит список суффиксов по умолчанию для правил суффиксов (см. "10.7 Old-Fashioned Suffix Rules" [1]). Однако вы все еще можете определить свои собственные суффиксы вместе с правилом для .SUFFIXES, и затем определить свои собственные правила суффиксов. Имейте в виду, что опция -r затрагивает только правила; переменные по умолчанию остаются в силе (см. "10.3 Variables Used by Implicit Rules" [1]); см. далее описание опции -R.

-R
--no-builtin-variables

    Исключит использование встроенных относящихся к правилу переменных (built-in rule-specific variables, см. "10.3 Variables Used by Implicit Rules" [1]). Конечно, вы все еще можете определить свои собственные. Опция -R также автоматически разрешит опцию -r (см. выше её описание), поскольку в таком случае нет смысла в неявных правилах без каких-либо определений для переменных, которые они используют.

-s
--silent
--quiet

    "Тихое" функционирование; не печатает никакие выполняемые recipe. См. "5.2 Recipe Echoing" [1].

-S
--no-keep-going
--stop

    Отменяет действие опции -k. В этом нет необходимости, за исключением рекурсивного make, где -k может наследоваться от make верхнего уровня через MAKEFLAGS (см. "5.7 Recursive Use of make" [1]), или если вы установили -k в MAKEFLAGS вашего окружения.

--shuffle[=mode]

    Эта опция разрешает форму fuzz-тестирования взаимоотношений prerequisite. Когда разрешен параллелизм (-j), порядок сборки target-ов становится менее определенным. Если prerequisites не полностью декларированы в makefile, то это может привести к периодическим и трудно поддающимся отслеживанию сбоям сборки.

    Опция --shuffle принуждает make направленно переупорядочить цели goal и prerequisites таким образом, чтобы взаимоотношения target/prerequisite все еще сохранялись, однако упорядочивание prerequisites указанной target меняется, как описано ниже.

    Порядок перечисления prerequisites в автоматических переменных этой опцией не изменяется.

    Псевдо-target .NOTPARALLEL запрещает тасование для этого makefile. Кроме того, любой список prerequisite, содержащий .WAIT, не будет перетасован. См. "5.4.1 Disabling Parallel Execution" [1].

    Опция --shuffle= принимает следующие значения:

    random

        Выберет случайное начальное значение (random seed) для перетасовки. Это используемое умолчание, если режим тасования не выбран. Выбранное seed также предоставляется для команд sub-makes. Это seed включается в сообщения об ошибках, чтобы его можно было повторно использовать в будущих прогонах для воспроизведения проблемы или проверки того, что проблема была решена.

    reverse

        Меняет на обратный упорядочивание goals и prerequisites вместо случайного тасования (random shuffle).

    seed

        Используется 'random' тасование, инициализированное указанным начальным значением seed. Здесь seed это целое число.

    none

        Запрещает тасование. Это отменит любые предыдущие опции --shuffle.

-t
--touch

    Применяет "Touch" к файлам (пометит их как обновленные без каких-либо их изменений) вместо запуска их recipe. Это используется, чтобы сделать вид исполнения recipes, чтобы обмануть будущие запуски make. См. выше врезку "Вместо выполнения Recipes".

--trace

    Покажет информацию трассировки для выполнения make. Использование --trace это сокращение для --debug=print,why.

-v
--version

    Напечатает версию программы make плюс копирайт, список авторов и замечание об отсутствии гарантий, и затем завершит работу make.

-w
--print-directory

    Напечатает сообщение, содержащее рабочую директорию до и после выполнения makefile. Это может быть полезно для отслеживания ошибок из сложных вложений рекурсивных команд make. См. "5.7 Recursive Use of make" [1]. На практике эта опция редко когда нужна, поскольку make делает это за вас. См. "5.7.4 The ‘--print-directory’ Option" [1].

--no-print-directory

    Запретит печать рабочей директории при использовании -w. Эта опция полезна, когда автоматически включена -w, но вы не хотите видеть лишних сообщений. См. "5.7.4 The ‘--print-directory’ Option" [1].

-W file
--what-if=file
--new-file=file
--assume-new=file

    Сделать вид, что целевой файл (target) был только что изменен. При использовании с флагом -n это показывает, что произойдет, если вы измените этот файл. Без -n это почти то же самое, что запуск команды touch над данным файлом перед запуском make, за исключением того, что время модификации изменяется только в воображении make. См. выше врезку "Вместо выполнения Recipes".

--warn-undefined-variables

    Выдает предупреждающее сообщение всякий раз, когда make видит ссылку на не определенную переменную. Это может быть полезно, когда вы пытаетесь отладить файлы makefile, которые сложным образом используют переменные.

[Словарик]

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

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

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

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

rule запись в makefile, указывающая target и возможно через двоеточие список зависимостей этой target, см. "4.2 Rule Syntax" [1].

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

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

make terms

[Ссылки]

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

 

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


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

Top of Page