Программирование PC Руководство GNU make: приложения Sat, February 22 2025  

Поделиться

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

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


Руководство GNU make: приложения Печать
Добавил(а) microsin   

Приложения к переводу руководства GNU make [2].

Примечание: объяснение некоторых специфических терминов make/makefile см. в разделе "Словарик Makefile", в конце статьи [2].

[Приложение A. Краткий справочник]

В этом приложении приведено общее описание директив, функций манипулирования текстом, специальные переменные GNU make. См. 4.9. Специальные встроенные имена целей, 10.2. Каталог встроенных правил, 9.8. Сводка по опциям make для других общих описаний.

Список директив, которые понимает GNU make:

define variable
define variable =
define variable :=
define variable ::=
define variable :::=
define variable +=
define variable ?=
endef

Определение многострочных переменных. См. 6.8. Определение многострочных переменных.

undefine variable

Отмена определения переменных. См. 6.9. Отмена определений переменной.

ifdef variable
ifndef variable
ifeq (a,b)
ifeq "a" "b"
ifeq 'a' 'b'
ifneq (a,b)
ifneq "a" "b"
ifneq 'a' 'b'
else
endif

Директива вставки условно подключаемой части makefile. См. 7. Операции проверки условий в файлах Makefile.

include file
-include file
sinclude file

Подключение другого makefile. См. 3.3. Подключение других файлов Makefile.

override variable-assignment

Определение переменной, переопределяющее любое предыдущее определение, даже если оно поступило из командной строки. См. 6.7. Директива override.

export

Говорит make по умолчанию экспортировать все переменные в дочерние процессы. См. 5.7.2. Передача переменных в sub-make.

export variable
export variable-assignment
unexport variable

Говорит make, нужно или не нужно экспортировать определенную переменную в дочерние процессы. 5.7.2. Передача переменных в sub-make.

private variable-assignment

Не позволять это присваивание переменной быть унаследованным предпосылками (prerequisites). См. 6.13. Подавление наследования переменных.

vpath pattern path

Указывает путь поиска файлов, совпадающих с шаблоном '%'. См. 4.5.2. Директива vpath.

vpath pattern

Удалит все пути поиска, ранее указанные для шаблона.

vpath

Удалит все пути поиска, ранее указанные для шаблона любой директивой vpath.

Список встроенных функций (см. 8. Функции для преобразования текста):

$(subst from,to,text) Замена одного текста другим. См. 8.2. Функции для подстановки и анализа строк.

$(patsubst pattern,replacement,text) Заменит слова в text, совпавшие с шаблоном pattern, на содержимое replacement. См. 8.2. Функции для подстановки и анализа строк.

$(strip string) Удалит из строки лишние символы пробела. См. 8.2. Функции для подстановки и анализа строк.

$(findstring find,text) Обнаруживает строку find в строке text. См. 8.2. Функции для подстановки и анализа строк.

$(filter pattern...,text) Выберет слова в строке text, которые совпали с одним из слов pattern. См. 8.2. Функции для подстановки и анализа строк.

$(filter-out pattern...,text) Выберет слова в строке text, которые не совпали с любым из слов pattern. См. 8.2. Функции для подстановки и анализа строк.

$(sort list) Сортирует слова в строке list лексикографическим образом, с удалением дубликатов. См. 8.2. Функции для подстановки и анализа строк.

$(word n,text) Извлечет n-ное слово (n индекс относительно единицы) из строки text. См. 8.2. Функции для подстановки и анализа строк.

$(words text) Подсчитывает количество слов в text. См. 8.2. Функции для подстановки и анализа строк.

$(wordlist s,e,text) Возвратит список слов в строке text от s до e. См. 8.2. Функции для подстановки и анализа строк.

$(firstword names...) Извлечет первое слово из списка names. См. 8.2. Функции для подстановки и анализа строк.

$(lastword names...) Извлечет последнее слово из списка names. См. 8.2. Функции для подстановки и анализа строк.

$(dir names...) Извлечет часть пути из каждого names, относящуюся к директории. См. 8.3. Функции для имен файлов.

$(notdir names...) Извлечет часть пути из каждого names, не относящуюся к директории. См. 8.3. Функции для имен файлов.

$(suffix names...) Извлечет часть расширения (суффикс) каждого имени файла/пути names (последняя точка '.' и последующие символы). См. 8.3. Функции для имен файлов.

$(basename names...) Извлечет базовое имя (имя файла без суффикса) из каждого имени файла names. См. 8.3. Функции для имен файлов.

$(addsuffix suffix,names...) Добавит суффикс suffix к каждому слову в names. См. 8.3. Функции для имен файлов.

$(addprefix prefix,names…) Прикрепит префикс prefix к каждому слову в names. См. 8.3. Функции для имен файлов.

$(join list1,list2) Объединит два параллельных списка слов. См. 8.3. Функции для имен файлов.

$(wildcard pattern...) Найдет имена файлов, совпавшие с шаблоном имени файла шелла (это шаблон не '%'). См. 4.4.3. Функция wildcard.

$(realpath names...) Для каждого имени файла в names расширяется абсолютное имя, не содержащее ни ., ни .., ни символические ссылки (symlinks). См. 8.3. Функции для имен файлов.

$(abspath names...) Для каждого имени файла в names расширяется абсолютное имя, не содержащее ни ., ни .., но с сохранением символических ссылок (symlinks). См. 8.3. Функции для имен файлов.

$(error text...) Когда эта функция вычисляется, make генерирует фатальную ошибку с сообщением text. См. 8.13. Функции, управляющие поведением make.

$(warning text...) Когда эта функция вычисляется, make генерирует предупреждение с сообщением text. См. 8.13. Функции, управляющие поведением make.

$(shell command) Выполнит команду шелла и возвратит её вывод. См. 8.14. Функция shell.

$(origin variable) Возвратит строку, описывающую, как была определена make-переменная variable. См. 8.11. Функция origin.

$(flavor variable) Возвратит строку, описывающий вид (flavor) make-переменной variable. 8.12. Функция flavor.

$(let var [var ...],words,text) Вычислит text с переменными vars, привязанными к словам в words. См. 8.5. Функция let.

$(foreach var,words,text) Вычислит text с переменной var, привязанной к каждому слову в words, и соединит результаты. См. 8.6. Функция foreach.

$(if condition,then-part[,else-part]) Вычислит условие condition; если оно не пустое, то подставит расширение then-part, иначе подставит расширение else-part. См. 8.4. Функции для проверки условий.

$(or condition1[,condition2[,condition3...]]) Вычислит каждое условие conditionN по порядку; подставит первое не пустое расширение. Если все расширения пустые, то будет подставлена пустая строка. См. 8.4. Функции для проверки условий.

$(and condition1[,condition2[,condition3...]]) Вычислит каждое условие conditionN по порядку; если любое расширение оказывается пустым, то подставится пустая строка. Если все расширения оказываются непустыми, то будет подставлено последнее условие. См. 8.4. Функции для проверки условий.

$(intcmp lhs,rhs[,lt-part[,eq-part[,gt-part]]]) Сравнивает lhs и rhs как числа; подставится расширение lt-part, eq-part или gt-part в зависимости от результата сравнения: либо левая часть меньше, либо равна, либо больше чем правая часть соответственно. См. 8.4. Функции для проверки условий.

$(call var,param,...) Вычислит переменную var, заменяющую любые ссылки на $(1), $(2) на первое, второе, и т. д. значения param. См. 8.8. Функция call.

$(eval text) Вычислит text, затем прочитает результаты как команды makefile. Расширяется в пустую строку. См. 8.10. Функция eval.

$(file op filename,text) Расширит аргументы, затем откроет файл file, используя режим op, и запишет текст в этот файл. См. 8.7. Функция file.

$(value var) Вычислит содержимое переменной var, без выполнения над ней расширения. См. 8.9. Функция value.

Общее описание автоматических переменных. Для полной информации см. 10.5.3. Автоматические переменные make.

$@ Имя файла целевого объекта (target).

$% Имя целевого объекта, когда он является элементом архива.

$< Имя первой предпосылки (prerequisite).

$? Имена всех prerequisites, которые более свежие, чем целевой объект, с пробелами между ними. Для prerequisites, которые являются элементами архива, используются только именованные элементы (см. 11. Использование make для обновления файлов архива (библиотеки)).

$^
$+ Имена всех prerequisites, с пробелами между ними. Для prerequisites, которые являются элементами архива, используются только именованные элементы (11. Использование make для обновления файлов архива (библиотеки)). Значение $^ опускает дубликаты prerequisites, в то время как $+ их сохраняет, и сохраняет их порядок следования.

$* Основа (stem), с которой совпало неявное правило (см. 10.5.4. Как работает совпадение шаблонов).

$(@D)
$(@F) Часть, относящаяся к директории, и файла внутри директории от $@.

$(*D)
$(*F) Часть, относящаяся к директории, и файла внутри директории от $*.

$(%D)
$(%F) Часть, относящаяся к директории, и файла внутри директории от $%.

$(< D)
$(< F) Часть, относящаяся к директории, и файла внутри директории от $< .

$(^D)
$(^F) Часть, относящаяся к директории, и файла внутри директории от $^.

$(+D)
$(+F) Часть, относящаяся к директории, и файла внутри директории от $+.

$(?D)
$(?F) Часть, относящаяся к директории, и файла внутри директории от $?.

Эти переменные используются именно GNU make:

MAKEFILES Файлы Makefile, для чтения каждым вовлечением make. См. 3.4. Переменная MAKEFILES.

VPATH Директория поиска для файлов, которые не были найдены в текущей директории. См. 4.5.1. VPATH: путь поиска для всех prerequisites.

SHELL Имя системного интерпретатора команд по умолчанию, обычно /bin/sh. Вы можете установить SHELL в makefile, чтобы поменять шелл, используемый для запуска команд рецептов. См. 5.3. Выполнение рецепта. Переменная SHELL обрабатывается специальным образом, когда импортируется из окружения и экспортируется в окружение. См. 5.3.2. Выбор шелла.

MAKESHELL Только на MS-DOS, имя интерпретатора команд для использования make. Это значение имеет приоритет перед значением SHELL. См. 5.3.2. Выбор шелла.

MAKE Имя, под которым была вовлечена make. Использование этой переменной в рецептах имеет специальный смысл. См. 5.7.1. Как работает переменная MAKE.

MAKE_VERSION Встроенная переменная 'MAKE_VERSION' расширяется в номер версии программы GNU make.

MAKE_HOST Встроенная переменная 'MAKE_HOST' расширяется в строку, представляющую хост, на котором произошла сборка GNU make.

MAKELEVEL Номер уровней рекурсии (суб-вызовов make). См. 5.7.2. Передача переменных в sub-make.

MAKEFLAGS Флаги (опции), предоставленные для make. Вы можете установить это в окружении или в makefile, чтобы установить флаги. 5.7.3. Передача опций в sub-make. Нельзя использовать MAKEFLAGS непосредственно в строке рецепта: его содержимое может быть указано неправильно для использования в шелл. Всегда позволяйте рекурсивным вызовам make получать эти значения через окружение своего родителя.

GNUMAKEFLAGS Другие флаги, проанализированные утилитой make. Вы можете установить это в окружении или в makefile, чтобы настроить флаги командной строки make. GNU make никогда сама не устанавливает эту переменную. Эта переменная нужна только если вы хотите установить флаги, специфичные для GNU make, в POSIX-совместимом makefile. Эту переменную увидит GNU make, и она будет игнорироваться другими реализациями make. Она не нужна, если вы используете только GNU make; просто используйте MAKEFLAGS напрямую. См. 5.7.3. Передача опций в sub-make.

MAKECMDGOALS Целевые объекты, предоставленные для make через командную строку. Установка этой переменной не даст эффекта для управления функционированием make. См. 9.2. Аргументы, указывающие goals.

CURDIR Установится в абсолютное имя пути текущей рабочей директории (после обработки опций -C, если они указаны). Установка этой переменной не даст эффекта для управления функционированием make. См. 5.7. Рекурсивное использование make.

SUFFIXES Список по умолчанию суффиксов перед тем, как make прочитает любой из файлов makefile.

.LIBPATTERNS Определить именование библиотек, которые ищет make, и их порядок. См. 4.5.6. Поиск по директориям для линковки библиотек.

[Приложение B. Ошибки, генерируемые Make]

Здесь приведет список наиболее общих ошибок make, с которыми вы можете встретиться, а также некоторая информация, поясняющая что означает ошибка, и как её исправить.

Иногда ошибки make не фатальные, особенно если был указан префикс '-' в строке рецепта, или указана опция -k в командной строке. Ошибки, которые фатальные, снабжаются префиксом строки ***.

Сообщения об ошибках все либо имеют префикс программы (обычно 'make'), или, если ошибка найдена в makefile, то префикс это имя файла и номер строки, в которой есть проблема.

В таблице ниже общие префиксы оставлены выключенными.

'[foo] Error NN'
'[foo] signal description'

Эти ошибки на самом деле не вызваны ошибками make. Они означают, что программа, которую вызвала make как часть рецепта, возвратила не нулевой код ошибки ('Error NN'), что make интерпретирует как отказ, или произошел выход каким-то ненормальным образом (из-за некоторого типа сигнала). См. 5.5. Ошибки в списках команд рецепта.

Если к сообщению не было присоединено ***, то субпроцесс потерпел неудачу, но правило makefile с ним было снабжено префиксом специального символа -, так что make игнорировала эту ошибку.

'missing separator. Stop.'
'missing separator (did you mean TAB instead of 8 spaces?). Stop.'

Это означает, что make не понимает что-то в только что прочитанной строке makefile. GNU make ожидает обнаружить различные разделители (:, =, символы префикса рецепта, и т. п.), которые показывают, какой смысл имеет обрабатываемая строка. Это сообщение означает, что было обнаружено не то, что допустимо в этом месте.

Чаще всего причина в том, что строки рецептов начинаются пробелами вместо символа табуляции (что чаще всего происходи в текстовых редакторах MS-Windows, когда в их настройках указано вставлять пробелы вместо табуляции). В этом случае make выведет второй вариант показанной выше ошибки. Запомните, что каждая строка рецепта должна начинаться символом табуляции (за исключением ситуации, когда вы установили .RECIPEPREFIX; см. 6.14. Другие специальные переменные). 8 пробелов не считаются допустимыми как префикс строки рецепта. См. 4.2. Синтаксис правила.

'recipe commences before first target. Stop.'
'missing rule before recipe. Stop.'

Это означает, что первое, что есть в makefile, выглядит как часть рецепта: начинается с символа префикса, и не выглядит как допустимая директива make (такая как присвоение переменной). Рецепты всегда должны начинаться с целевого объекта.

Вторая форма ошибки генерируется, если в строке есть точка с запятой как первый символ, не относящийся к пробелу; make интерпретирует это, как то что вы не указали "target: prerequisite" секцию правила. См. 4.2. Синтаксис правила.

'No rule to make target `xxx'.'
'No rule to make target `xxx', needed by `yyy'.'

Это означает, что make определила необходимость собрать целевой объект (target), но не может найти в makefile никакие инструкции, указывающие как это можно сделать, либо явно либо неявно (включая базу данных правил по умолчанию).

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

'No targets specified and no makefile found. Stop.'
'No targets. Stop.'

Первое сообщение означает, что вы не предоставили никакие целевые объекты для сборки в командной строке, и make не нашла никакие файлы makefile, которые она могла бы прочитать. Второе сообщение означает, что какой-то makefile был найден но он не содержал никакой default goal, и ничего такого не было указано в командной строке. GNU make ничего не делает в таких ситуациях. См. 9.1. Аргументы, указывающие файл Makefile.

'Makefile `xxx' was not found.'
'Included makefile `xxx' was not found.'

Файл makefile, указанный в командной строке (первая форма сообщения) или подключенный (вторая форма сообщения) не был найден.

'warning: overriding recipe for target `xxx''
'warning: ignoring old recipe for target `xxx''

GNU make позволяет указать только один рецепт на целевой объект (за исключением правил двух двоеточий). Если вы предоставили рецепт для целевого объекта, который уже был определен ранее, то будет выдано это предупреждение и второй рецепт перезапишет первый. См. 4.11. Несколько правил для одного target-файла.

'Circular xxx < - yyy dependency dropped.'

Это значит, что make определила циклический граф зависимостей: после трассировки prerequisite yyy целевого объекта xxx, и его prerequisites, и т. д., одна из prerequisites снова зависела от xxx.

'Recursive variable `xxx' references itself (eventually). Stop.'

Это значит, что вы определили нормальную (рекурсивную) make-переменную xxx, которая, когда расширяется, ссылается на саму себя (xxx). Это не дозволяется; либо используйте просто расширяемые переменные (':=' или '::='), либо используйте оператор добавления ('+='). См. 6. Как использовать переменные в makefile.

'Unterminated variable reference. Stop.'

Это означает, что вы забыли предоставить правильную закрывающую скобку или фигурную скобку в ссылке на переменную или функцию.

'insufficient arguments to function `xxx'. Stop.'

Это означает, что вы не указали необходимое количество аргументов для этой функции. См. документацию функции для описания её аргументов. См. 8. Функции для преобразования текста.

'missing target pattern. Stop.'
'multiple target patterns. Stop.'
'target pattern contains no `%'. Stop.'
'mixed implicit and static pattern rules. Stop.'

Эти ошибки генерируются для неправильно составленных правил статического шаблона (см. 4.12.1. Синтаксис правил статического шаблона). Первое сообщение означает, что часть target-pattern правила пустая; второе сообщение означает, что существует несколько символов шаблона (%) в части target-pattern; третье сообщение означает, что нет символов шаблона в части target-pattern; и четвертое сообщение означает, что ве три части правила статического шаблона содержит символы шаблона (%) - первая часть не должна содержать символы шаблона.

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

'warning: -jN forced in submake: disabling jobserver mode.'

Это предупреждение генерируется следующим, если make обнаруживает состояния ошибки, относящиеся к параллельно обработке на системах, где вызовы дочерних make могут коммуницировать (см. 5.7.3. Передача опций в sub-make). Это предупреждение генерируется, если рекурсивное вовлечение процесса make принудительно принуждается к '-jN' в своем списке аргументов (где N больше единицы). Это может произойти, например, если вы установили переменную окружения MAKE в 'make -j2'. В этом случае подчиненные вызовы make не коммуницируют с другими процессами make, и будут просто претендовать на два своих собственных рабочих задания (jobs).

'warning: jobserver unavailable: using -j1. Add `+' to parent make rule.'

Чтобы процессы make коммуницировали друг с другом, родительский процесс передаст информацию дочернему. Поскольку это может привести к проблемам, если дочерний процесс на самом деле не является make, родитель будет делать это только в том случае, если считает, что дочерний процесс это тоже make. Родитель использует обычные алгоритмы для определения этой ситуации (см. 5.7.1. Как работает переменная MAKE). Если makefile сконструирован так, что родитель не знает, что дочерний процесс тоже является процессом make, то дочерний процесс получит только часть необходимой информации. В таком случае дочерний процесс будет генерировать это сообщение предупреждения и последовательно продолжит построение.

'warning: ignoring prerequisites on suffix rule definition'

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

[Приложение C. Пример сложного Makefile]

Это makefile для программы GNU tar. Это довольно сложный makefile. Первая строка использует #! настройку, чтобы позволить makefile непосредственное выполнение.

Поскольку это первый целевой объект, то default goal это 'all'. Интересная фича этого makefile в том, что testpad.h это автоматически создаваемый программой testpad исходный файл, который сам компилируется из testpad.c.

Если вы введете команду 'make' или 'make all', то make создаст исполняемый файл tar, демон rmt, который предоставляет удаленный доступ к ленте, и Info-файл tar.info.

Если вы введете 'make install', то make не только создаст tar, rmt и tar.info, но также и установит их.

Если вы введете 'make clean', то make удалит файлы '.o', а также файлы tar, rmt, testpad, testpad.h и core-файлы.

Если вы введете 'make distclean', то make не только удалит те же самые файлы, какие удаляет 'make clean', но удалит также и файлы TAGS, Makefile и config.status. Хотя это и не очевидно, этот makefile (и config.status) генерируются пользователем программой configure, которая предоставляется в дистрибутиве tar, но она здесь не показана.

Если вы введете 'make realclean', то make удалит те же самые файлы, какие удаляет 'make distclean', и также удалит файлы Info, сгенерированные из tar.texinfo.

Дополнительно здесь есть целевые объекты shar и dist, которые создают киты дистрибутива.

#!/usr/bin/make -f
# Generated automatically from Makefile.in by configure.
# Un*x Makefile for GNU tar program.
# Copyright (C) 1991 Free Software Foundation, Inc.
# This program is free software; you can redistribute
# it and/or modify it under the terms of the GNU# General Public License ... ...
SHELL = /bin/sh

#### Начало секции системной конфигурации. ####
srcdir = .

# Если вы используете gcc, то должны либо запустить
# скрипт fixincludes, который поставляется с этим,
# или использовать gcc с опцией -traditional option.
# Иначе вызовы ioctl будут компилироваться
# некорректно на некоторых системах. CC = gcc -O YACC = bison -y INSTALL = /usr/local/bin/install -c INSTALLDATA = /usr/local/bin/install -c -m 644

# Вещи, которые вы можете добавить в DEFS:
# -DSTDC_HEADERS Если у вас заголовки
# и библиотеки ANSI C.
# -DPOSIX Если у вас заголовки
# и библиотеки POSIX.1.
# -DBSD42 Если у вас sys/dir.h (кроме случая,
# когда используете -DPOSIX), sys/file.h,
# и st_blocks в `struct stat'.
# -DUSG Если у вас строки и функции памяти
# System V/ANSI C и заголовки,
# sys/sysmacros.h, fcntl.h, getcwd,
# без valloc, и ndir.h (кроме случая
# когда используете -DDIRENT).
# -DNO_MEMORY_H Если USG или STDC_HEADERS, но не
# подключен memory.h.
# -DDIRENT Если USG, и у вас dirent.h
# вместо ndir.h.
# -DSIGTYPE=int Если ваши сигнальные обработчики
# возвращают int, а не void.
# -DNO_MTIO Если у вас отсутствует sys/mtio.h
# (magtape ioctls).
# -DNO_REMOTE Если у вас нет remote shell
# или rexec.
# -DUSE_REXEC Если используете rexec для операций
# remote tape вместо ответвления
# rsh или remsh.
# -DVPRINTF_MISSING Если у вас отсутствует функция vprintf
# (но есть _doprnt).
# -DDOPRNT_MISSING Если у вас отсутствует функция _doprnt.
# Также нужно определить -DVPRINTF_MISSING.
# -DFTIME_MISSING Если у вас отсутствует системный вызов ftime.
# -DSTRSTR_MISSING Если у вас отсутствует функция strstr.
# -DVALLOC_MISSING Если у вас отсутствует функция valloc.
# -DMKDIR_MISSING Если у вас отсутствуют системные вызовы mkdir
# и rmdir.
# -DRENAME_MISSING Если у вас отсутствует системный вызов rename.
# -DFTRUNCATE_MISSING Если у вас отсутствует системный вызов ftruncate.
# -DV7 На версии 7 Unix (не тестировалось долгое время).
# -DEMUL_OPEN3 Если у вас нет 3-аргументной версии open,
# и вы хотите эмулировать её с системными
# вызовами.
# -DNO_OPEN3 Если у вас нет 3-аргументной версии open,
# и вы хотите запретить опцию tar -k
# вместо эмуляции open.
# -DXENIX Если у вас есть sys/inode.h и нужно подключить 94.
DEFS = -DSIGTYPE=int -DDIRENT -DSTRSTR_MISSING \ -DVPRINTF_MISSING -DBSD42
# Установите это в rtapelib.o кроме случая, когда определили NO_REMOTE,
# тогда сделайте это пустым. RTAPELIB = rtapelib.o LIBS = DEF_AR_FILE = /dev/rmt8 DEFBLOCKING = 20
CDEBUG = -g CFLAGS = $(CDEBUG) -I. -I$(srcdir) $(DEFS) \ -DDEF_AR_FILE=\"$(DEF_AR_FILE)\" \ -DDEFBLOCKING=$(DEFBLOCKING) LDFLAGS = -g
prefix = /usr/local # Префикс для каждой установленной программы, # обычно пустой или `g'. binprefix =
# Директория для установки tar. bindir = $(prefix)/bin
# Директория для установки файлов info. infodir = $(prefix)/info
#### Конец секции системной конфигурации. ####
SRCS_C = tar.c create.c extract.c buffer.c \ getoldopt.c update.c gnu.c mangle.c \ version.c list.c names.c diffarch.c \ port.c wildmat.c getopt.c getopt1.c \ regex.c SRCS_Y = getdate.y SRCS = $(SRCS_C) $(SRCS_Y) OBJS = $(SRCS_C:.c=.o) $(SRCS_Y:.y=.o) $(RTAPELIB) AUX = README COPYING ChangeLog Makefile.in \ makefile.pc configure configure.in \ tar.texinfo tar.info* texinfo.tex \ tar.h port.h open3.h getopt.h regex.h \ rmt.h rmt.c rtapelib.c alloca.c \ msd_dir.h msd_dir.c tcexparg.c \ level-0 level-1 backup-specs testpad.c
.PHONY: all all: tar rmt tar.info
tar: $(OBJS) $(CC) $(LDFLAGS) -o $@ $(OBJS) $(LIBS)
rmt: rmt.c $(CC) $(CFLAGS) $(LDFLAGS) -o $@ rmt.c
tar.info: tar.texinfo makeinfo tar.texinfo
.PHONY: install install: all $(INSTALL) tar $(bindir)/$(binprefix)tar -test ! -f rmt || $(INSTALL) rmt /etc/rmt $(INSTALLDATA) $(srcdir)/tar.info* $(infodir)

$(OBJS): tar.h port.h testpad.h regex.o buffer.o tar.o: regex.h # getdate.y имеет 8 shift/reduce конфликтов.
testpad.h: testpad ./testpad
testpad: testpad.o $(CC) -o $@ testpad.o
TAGS: $(SRCS) etags $(SRCS)
.PHONY: clean clean: rm -f *.o tar rmt testpad testpad.h core
.PHONY: distclean distclean: clean rm -f TAGS Makefile config.status
.PHONY: realclean realclean: distclean rm -f tar.info*
.PHONY: shar shar: $(SRCS) $(AUX) shar $(SRCS) $(AUX) | compress \ > tar-`sed -e '/version_string/!d' \ -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ -e q version.c`.shar.Z
.PHONY: dist dist: $(SRCS) $(AUX) echo tar-`sed \ -e '/version_string/!d' \ -e 's/[^0-9.]*\([0-9.]*\).*/\1/' \ -e q version.c` > .fname -rm -rf `cat .fname` mkdir `cat .fname` ln $(SRCS) $(AUX) `cat .fname` tar chZf `cat .fname`.tar.Z `cat .fname` -rm -rf `cat .fname` .fname
tar.zoo: $(SRCS) $(AUX) -rm -rf tmp.dir -mkdir tmp.dir -rm tar.zoo for X in $(SRCS) $(AUX) ; do \ echo $$X ; \ sed 's/$$/^M/' $$X \ > tmp.dir/$$X ; done cd tmp.dir ; zoo aM ../tar.zoo * -rm -rf tmp.dir

[Appendix D GNU Free Documentation License]

Описание лицензии на документацию см. [1].

[Ссылки]

1. GNU make.
2. Руководство GNU make: главы 1-3.

 

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


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

Top of Page