Особенности GNU make
Ниже приведён сводный список особенностей GNU make, для сравнения с другими версиями make. В качестве эталона мы рассматриваем особенности make в системах 4.2 BSD. Если вы заботитесь о написании переносимых make-файлов, вам не следует использовать перечисленные здесь функции make, а также те, что в Отсутствующие.
Многие особенности заимствованы из версии make в System V.
- Переменная
VPATHи её особое значение. См. Поиск каталогов для предварительных условий. Эта функция существует в System Vmake, но не документирована. Она документирована в 4.3 BSDmake(где говорится, что она имитирует функциюVPATHSystem V). - Включённые make-файлы. См. Включение других make-файлов. Возможность включения нескольких файлов с помощью одной директивы — это расширение GNU.
- Переменные считываются из среды и передаются через неё. См. Переменные из среды.
- Параметры, передаваемые через переменную
MAKEFLAGSрекурсивным вызовамmake. См. Передача параметров подзадачеmake. - Автоматическая переменная
$%устанавливается в имя элемента в ссылке на архив. См. Автоматические переменные. - Автоматические переменные
$@,$*,$<,$%, и$?имеют аналогичные формы, такие как$(@F)и$(@D). Мы обобщили это на$^, как очевидное расширение. См. Автоматические переменные. - Ссылки на переменные подстановки. См. Основы ссылок на переменные.
- Командные параметры ‘-b’ и ‘-m’ принимаются и игнорируются. В System V
make, эти параметры фактически что-то делают. - Выполнение рекурсивных команд для запуска
makeчерез переменнуюMAKE, даже если указан ‘-n’, ‘-q’ или ‘-t’. См. Рекурсивное использованиеmake. - Поддержка суффикса ‘.a’ в правилах суффикса. См. Правила суффикса архивов. Эта функция устарела в GNU
make, так как общая функция цепочки правил (см. Цепочки неявных правил) позволяет использовать одно правило шаблона для установки элементов в архив (см. Обновление архивов). - Порядок строк и комбинаций обратного слеша/перевода строки в рецептах сохраняется при печати рецептов, так что они отображаются так, как они есть в make-файле, за исключением удаления начальных пробелов.
Следующие функции были вдохновлены различными другими версиями make. В некоторых случаях неясно, какие версии вдохновили какие другие.
- Правила шаблонов с использованием ‘%’. Это реализовано в нескольких версиях
make. Мы не уверены, кто придумал это первым, но оно распространилось. См. Определение и переопределение правил шаблонов. - Цепочки правил и неявные промежуточные файлы. Это реализовано Stu Feldman в его версии
makeдля исследовательской Unix AT&T восьмого издания, а затем Andrew Hume из AT&T Bell Labs в его программеmk(где он называет это «транзитивным замыканием»). Мы не совсем уверены, взяли ли мы это у них или придумали сами одновременно. См. Цепочки неявных правил. - Автоматическая переменная
$^, содержащая список всех предварительных условий текущей цели. Мы не изобретали это, но не знаем, кто это сделал. См. Автоматические переменные. Автоматическая переменная$+является простым расширением$^. - Флаг «что если» (‘-W’ в GNU
make) был (насколько нам известно) изобретён Andrew Hume вmkСм. Вместо выполнения рецептов. - Понятие выполнения нескольких задач одновременно (параллелизм) существует во многих вариантах
makeи подобных программ, хотя не в реализациях System V или BSD. См. Выполнение рецептов. - Несколько инструментов построения, поддерживающих параллелизм, также поддерживают сбор выходных данных и вывод в виде одного блока. См. Выходные данные во время параллельного выполнения.
- Изменённые ссылки на переменные с использованием подстановки шаблонов происходят от SunOS 4. См. Основы ссылок на переменные. Эта функциональность предоставлялась в GNU
makeфункциейpatsubstдо реализации альтернативного синтаксиса для совместимости с SunOS 4. Не совсем ясно, кто вдохновил кого, так как в GNUmakeбыла функцияpatsubstдо выпуска SunOS 4. - Особое значение символов ‘+’ перед строками рецепта (см. Вместо выполнения рецептов) предписано стандартом IEEE Standard 1003.2-1992 (POSIX.2).
- Синтаксис ‘+=’ для добавления к значению переменной происходит от SunOS 4
make. См. Добавление текста к переменным. - Синтаксис ‘archive(mem1 mem2…)’ для перечисления нескольких членов в одном файле архива происходит от SunOS 4
make. См. Элементы архива. - Директива
-includeдля включения make-файлов без ошибки для несуществующего файла происходит от SunOS 4make. (Но обратите внимание, что SunOS 4makeне позволяет указывать несколько make-файлов в одной директиве-include.) Такая же функция встречается под именемsincludeв SGImakeи, возможно, в других. - Оператор присваивания
!=оболочки существует во многих BSDmakeи намеренно реализован здесь так, чтобы вести себя идентично этим реализациям. - Различные инструменты управления сборкой реализованы с помощью языков сценариев, таких как Perl или Python, и, таким образом, предоставляют встроенный язык сценариев, аналогичный интеграции GNU Guile в GNU
make.
Остальные функции — новые изобретения GNU make:
- Используйте опцию ‘-v’ или ‘--version’ для вывода информации о версии и авторских правах.
- Используйте опцию ‘-h’ или ‘--help’ для вывода сводки опций
make. - Просто расширенные переменные. См. Два типа переменных.
- Автоматически передавать присваивания переменных из командной строки через переменную
MAKEрекурсивным вызовамmake. См. Рекурсивное использованиеmake. - Используйте командную опцию ‘-C’ или ‘--directory’ для изменения каталога. См. Сводка опций.
- Определять переменные дословно с помощью
define. См. Определение многострочных переменных. - Объявлять фиктивные цели со специальной целью
.PHONY.Andrew Hume из AT&T Bell Labs реализовал аналогичную функцию с другим синтаксисом в своей программе
mk. Похоже, это случай параллельного открытия. См. Фиктивные цели. - Изменять текст, вызывая функции. См. Функции для преобразования текста.
- Используйте опцию ‘-o’ или ‘--old-file’ для имитации того, что время изменения файла старое. См. Избегание перекомпиляции некоторых файлов.
- Условное выполнение.
Эта функция была реализована многократно в различных версиях
make; она, похоже, является естественным расширением, полученным от функций препроцессора C и аналогичных языков макросов, и не является революционной концепцией. См. Условные части make-файлов. - Укажите путь поиска для включённых make-файлов. См. Включение других make-файлов.
- Укажите дополнительные make-файлы для чтения с помощью переменной среды. См. Переменная
MAKEFILES. - Удалить ведущие последовательности ‘./’ из имён файлов, так что ./file и file считаются одним и тем же файлом.
- Используйте специальный метод поиска для предварительных условий библиотек, записанных в виде ‘-lname’. См. Поиск каталогов для библиотек линковки.
- Разрешить суффиксам в правилах суффикса (см. Старые правила суффикса) содержать любые символы. В других версиях
make, они должны начинаться с ‘.’ и не содержать символов ‘/’. - Отслеживать текущий уровень рекурсии
makeс помощью переменнойMAKELEVEL. См. Рекурсивное использованиеmake. - Предоставлять все цели, заданные в командной строке, в переменной
MAKECMDGOALS. См. Аргументы для задания целей. - Указывать статические правила шаблонов. См. Статические правила шаблонов.
- Обеспечить выборочное
vpathпоиск. См. Поиск каталогов для предварительных условий. - Предоставить вычисленные ссылки на переменные. См. Основы ссылок на переменные.
- Обновлять make-файлы. См. Как пересоздаются make-файлы. В System V
makeсуществует очень ограниченная форма этой функциональности, при которой будут извлекаться файлы SCCS для make-файлов. - Различные новые встроенные неявные правила. См. Каталог встроенных правил.
- Загружать динамические объекты, которые могут изменять поведение
make. См. Загрузка динамических объектов.
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/Features.html