Здесь приведен обзор особонностей GNU-версии программы make,
которые отличают ее от других версий, а также заимствованы из других
версий программы make. Мы берем за основу особенности программы make в
системах 4.2 BSD. Если вы заинтересованы в написании переносимых
make-файлов, то вам следует использовать только возможности программы
make, не перечисленные здесь и в главе 13 [Недостающие возможности].
Многие особенности происходят из версии программы make для системы
System V.
Переменная VPATH и ее специальный смысл. Смотрите раздел 4.3
"Поиск зависимостей по каталогам". Эта особенность существует в
программе make для системы System V, но является
недокументированной. Она документирована в программе make для
сисеты 4.3 BSD (где сообщается, что она имитирует возможности
переменной VPATH из системы System особенности).
Включаемые make-файлы. Смотрите раздел 3.3 "Включение других
make-файлов". Расширением в GNU-версии является разрешение на
включение нескольких файлов с помошью одной директивы.
Переменные читаются из командной среды передаются через командную
среду. Смотрите раздел 6.9 "Переменные из командной среды".
Опции для рекурсивных вызовов программы make передаются через
переменную MAKEFLAGS. Смотрите раздел 5.6.3 "Опции для связи с
порожденным процессом make".
При работе с архивом, в качестве значения автоматической
переменной $% устанавилается имя элемента архива. Смотрите раздел
10.5.3 "Автоматические переменные".
Автоматические переменные $@ , $*, $<, $%, и $? имеют,
соответствующие формы вида $(@F) и $(@D). В качестве
напрашивающегося расширения, мы обобщили это и на переменную $^.
Смотрите раздел 10.5.3 "Автоматические переменные".
Замена обращения к переменную. Смотрите раздел 6.1 "Основы
обращения к переменным".
Опции командной строки '-b' и '-m' врспринимаются и игнорируются.
В программе make для системы System V эти опции кое-что реально
делают.
Выполнение рекурсивных команд для запуска программы make через
переменную MAKE, даже если определены опции '-n', '-q' или '-t'.
Смотрите раздел 5.6 "Рекурсивное использование программы make".
Поддержка суффикса '.a' в суффиксных правилах. Смотрите раздел
11.4 "Архивные суффиксные правила". Эта особенность является
устаревшей в GNU-версии программы make, поскольку общая
возможность построения цепочки правил (смотрите раздел 10.4
"Цепочки неявных правил") позволяет отдельному шаблонному
правилу устанавливать элементы в архиве (смотрите раздел 11.2
"Обновление архива"), и этого достаточно.
Расположение строк и комбинаций символов backslash и конца строки в
командах сохраняются при печати команд, поэтому они появляются в
таком же виде, как и в make-файле, за исключением удаления
первоначальных пробельных символов.
На реализацию следующих возможностей нас вдохновили всевозможные
другие версии программы make. В некоторых случаях точно неясно, какие
версии повлияли на развитие каких других версий.
Шаблонное правило с использованием символа '%'. Это было
реализовано в нескольких версиях программы make. Мы не уверены в
том, кто изобрел такую конструкцию первым, но она
распространилось повсюду. Смотрите раздел 10.5 "Определение и
переопределение шаблонных правил".
Построение цепочки правил и неявных промежуточных файлов. Это
было реализовано Стью Фельдманом в его версии программы make
для системы AT&T Eighth Edition REsearch Unix, а позже - Андрю
Ньюмом из AT&T Bell Labs в его программа mk (где он называет это
"транзитивным замыканием"). Мы, на самом деле, не знаем, взяли ли
мы это от кого-либо из них или же одновременно додумались об этом
сами. Смотрите раздел 10.4 "Цепочки неявных правил".
Автоматическая переменная $^, содержащая список всех зависимостей
текущей цели. Мы этого не изобретали это, но мы понятия не имеем,
кто это сделал. Смотрите раздел 10.5.3 "Автоматические
переменные". Автоматическая переменная $+ представляет собой
просто расширение переменной $^.
Опция "А что, если" (`-W' в GNU-версии программы make) была
изобретена (насколько нам известно) Андрю Хьюмом и применена в
программе mk. Смотрите раздел 9.3 "Вместо исполнения команд".
Концепция выполнения нескольких работ одновременно (параллелизм)
существует во многих реализациях программы make и аналогичных
программах, хотя ее нет в реализациях для систем System V и BSD.
Смотрите раздел 5.2 "Выполнение команд".
Модифицированное обращение к переменной ссылки с использованием
шаблонной подстановки происходит из системы SunOS 4. Смотрите
раздел 6.1 "Основы обращения к переменным". Такая
функциональность была обеспечена в GNU-версии программы make
посредством функции patsubst, прежде, чем был реализован
альтернативный синтаксис для совместимости с системой SunOS 4.
Здесь не до конца ясно, кто на кого повлиял, так как в GNU-версии
программы make функция patsubst была до того, как былаъ
выпущена система SunOS 4.
Специальное значение символов '+', предшествующих командным
строкам (смотрите раздел 9.3 "Вместо исполнения команд")
предписано стандартом IEEE 1003.2-1992 (POSIX.2).
Синтаксис, связанный с конструкцией '+=', предназначенный для
добавления к значению переменной, происходит из программы make
для системы SunOS 4 Смотрите раздел 6.6 "Добавление
дополнительного фрагмента к пеpеменным".
Синтаксисическая конструкция 'АРХИВ(ЭЛЕМ1 ЭЛЕМ2...)' для
перечисления нескольких элементов одного архивного файла
происходит из программы make для системы SunOS 4. Смотрите раздел
11.1 "Элементы архива".
Директива -include для включения make-файлов без генерации ошибки
для несуществующего файла происходит из программы make для
системы SunOS 4. (Но обратите внимание, что программа make для
системы SunOS 4 не позволяет нескольким make-файлам быть
указанным в одной директивк -include.)
Оставшиеся возможности - новые изобретения GNU-версии программы
make:
Использование опции '-v' или '--version' опции для вывода на
экран версии и информации о copyright.
Использование опцию '-h' или '--help' для вывода на экран полной
полной информации о каждой опции программы make.
Упрощенно-вычисляемые переменные. Смотрите раздел 6.2 "Две
разновидности переменных".
Автоматическая передача через переменную MAKE присваиваний
значений переменным в командной строке рекурсивным вызовам
программы make. Смотрите раздел 5.6 "Рекурсивное использование
программы make".
Использование опции командной строки '-C' или '--directory' для
измения каталога. Смотрите раздел 9.7 "Обзор опций".
Реализация определений многостроковых переменных при помощи
директивы define. Смотрите раздел 6.8 "Определение
многостроковых переменных".
Объявление целей, являющихся именами действий, при помощи
специальной цели .PHONY.
Андрю Хьюм из AT&T Bell Labs в своей программе mk реализовал
аналогичную возможность с помощью другого синтаксиса. Это похоже
на случай параллельного открытия. Смотрите раздел 4.4 "Цели-имена
действий".
Манипуляции с текстом с помощью вызывов функций. Смотрите главу 8
"Функции преобразования текста".
Использование опции '-o' или '--old-file' для иммитации того, что
время изменения файла старое. Смотрите раздел 9.4 "Предотвращение
перекомпиляции некоторых файлов".
Условное выполнение.
Эта возможность была реализована много раз в различных версиях
программы make; она выглядит естественным расширением,
наследуемым из возможностей C-препроцессора и аналогичных
макроязыков и не является революционной концепцией. Смотрите
главу 7 "Условные части make-файла".
Определение пути поиска для включаемых make-файлов. Смотрите
раздел 3.3 "Включение других make-файлов".
Определение дополнительных make-файлов, подлежащих чтению, с
помощью переменной командной среды. Смотрите раздел 3.4
"Переменная MAKEFILES".
Удаление из имен файлов ведущей последовательности подстрок './',
поэтому './file' и 'file'рассматриваются как один и тот же файл.
Использование специального матода поиска для библиотечных
зависимостей, записанных в форме '-lname' Смотрите раздел 4.3.5
"Поиск по каталогам библиотек для компоновки".
Разрешение суффиксам в суффиксных правилах (смотрите раздел 10.7
"Устаревшие суффиксные правила") содержать любые символы. В
других версиях программы make они должны начинаться с символа '.'
и не содержать ни одного символа '/'.
Отслеживание текущего уровня рекурсии программы make с
использованием переменной MAKELEVEL. Смотрите раздел 5.6
"Рекурсивное использование программы make".
Определение статических шаблонных правил. Смотрите раздел 4.10
"Статические шаблонные правила".
Поддержка выборочного поиска на основе значения переменной vpath.
Смотрите раздел 4.3 "Поиск зависимостей по каталогам".
Поддержка вычисляемых ссылок на переменные. Смотрите раздел 6.1
"Основы обращения к переменным".
Обновление make-файлов. Смотрите раздел 3.5 "Как переделываются
make-файлы". Программа make для системы System V имеет очень,
очень ограниченную форму такой функциональности, заключающуюся в
том, что она сравнит выходные SCCS-файлы с make-файлами.
Различные новые встроенные неявные правила. Смотрите раздел 10.2
"Перечень неявных правил".
Встроенная переменная MAKE_VERSION показывает номер версии
программы make.