Следующие разделы описывают основные принципы работы Automake.
Automake читает файл `Makefile.am' и создает на его основе файл `Makefile.in'. Специальные макросы и цели, определенные в `Makefile.am', заставляют Automake генерировать более специализированный код; например, макроопределение `bin_PROGRAMS' заставит создать цели для компиляции и компоновки программ.
Макроопределения и цели из файла `Makefile.am' копируются в файл
`Makefile.in' без изменений. Это позволяет вам добавлять в
генерируемый файл `Makefile.in' произвольный код. Например,
дистрибутив Automake
включает в себя нестандартную цель cvs-dist
, которую использует
человек, сопровождающий Automake, для создания дистрибутивов из системы
контроля исходного кода.
Заметьте, что расширения GNU make не распознаются программой Automake. Использование таких расширений в файле `Makefile.am' приведет к ошибкам или странному поведению.
Automake пытается сгруппировать комментарии к расположенным по соседству xцелям и макроопределениям.
Цель, определенная в `Makefile.am', обычно переопределяет любую цель
с таким же именем, которая была бы автоматически создана automake
. Хотя
этот прием и работает, старайтесь избегать его использования, поскольку
иногда автоматически созданные цели являются очень важными.
Аналогичным образом, макрос, определенный в `Makefile.am', будет
переопределять любой макрос, который создает automake
. Это часто
более полезно, чем возможность переопределения цели. Но будьте
осторожны, поскольку многие из макросов, создаваемых программой
automake
, считаются макросами только для внутреннего
использования, и их имена могут измениться в будущих версиях.
При обработке макроопределения Automake рекурсивно обрабатывает
макросы, на которые есть ссылка в данном макроопределении. Например,
если Automake исследует содержимое foo_SOURCES
в следующем
определении:
xs = a.c b.c
foo_SOURCES = c.c $(xs)
то он будет использовать файлы `a.c', `b.c' и `c.c' как
содержимое foo_SOURCES
.
Automake также вводит форму комментария, который не копируется в выходной файл; все строки, начинающиеся с `##', полностью игнорируются Automake.
Очень часто первая строка файла `Makefile.am' выглядит следующим образом:
## Process this file with automake to produce Makefile.in
## Для получения Makefile.in обработайте этот файл программой automake
automake
поддерживает три типа иерархии каталогов: плоскую,
неглубокую и глубокую.
Если все файлы пакета располагаются в одном каталоге, то это
плоский пакет. В файле `Makefile.am' для этого типа пакета
по определению отсутствует макрос SUBDIRS
. Примером такого
пакета может служить termutils
.
Глубокий пакет -- это такой, в котором все исходные тексты лежат в
подкаталогах; каталог верхнего уровня содержит в основном
конфигурационную информацию. Хорошим примером такого пакета является GNU
cpio
, а так же GNU tar
. Файл `Makefile.am' в
каталоге верхнего уровня глубокого пакета содержит макрос
SUBDIRS
, но в нем нет никаких других
макросов для определения объектов компиляции.
Неглубокий пакет подразумевает, что основные файлы исходных текстов
располагаются в каталоге верхнего уровня, а различные части этого пакета
(обычно библиотеки) находятся в подкаталогах. К пакетам такого типа
относится Automake (а также GNU make
, который в настоящее время
не использует automake
).
Хотя Automake предназначен для использования людьми, сопровождающими пакеты GNU, он также старается приспособиться и к тем, кто хочет использовать Automake, но не хочет соблюдать все соглашения GNU.
Сейчас Automake поддерживает три уровня строгости (strictness), задающих, сколь строго Automake должен проверять соответствие стандартам.
Строгость может принимать следующие значения:
Для более детальной информации о точном смысле уровня строгости смотрите
section Эффект использования ключей --gnu
и --gnits
.
Макросы Automake (с этого места мы будем ссылаться на них как на
переменные) в общем следуют Единообразной Схеме Именования,
которая позволяет легко понять, как собираются программы (и другие
результирующие объекты), и как они устанавливаются. Эта схема также
поддерживает определение того, что должно быть собрано во время выполнения
configure
.
Во время выполнения make
, некоторые переменные используются для
определения того, что должно быть собрано. Эти переменные называются
основными переменными. Например, основная переменная PROGRAMS
содержит список программ, которые должны быть скомпилированы и собраны.
Различные наборы переменных используются для принятия решения о том, куда
должны быть установлены собранные объекты. Эти переменные называются
подобно основным переменным, но имеют префикс, указывающий, какой из
стандартных каталогов должен быть использован в качестве каталогаx для установки.
Имена стандартных каталогов определены в стандартах GNU
(see section `Directory Variables' in The GNU Coding Standards). Automake расширяет это список переменными pkglibdir
,
pkgincludedir
и pkgdatadir
, которые имеют те же значения,
что и не-`pkg' версии, но с прибавленным к ним суффиксом
`@PACKAGE@'. Например, pkglibdir
определена как
$(datadir)/@PACKAGE@
.
Для каждой из основных переменных также существует дополнительная
переменная, имя которой образовано добавлением префикса `EXTRA_' к
имени основной переменной. Эта переменная используется для перечисления
объектов, которые могут быть собраны, а могут и не собраны в
зависимости от принятого configure
решения. Для того, чтобы
создать файл `Makefile.in', работающий в любой ситуации, Automake
должен сразу узнать полный список объектов, которые вообще могут быть
собраны. Исходя из этого, переменные с префиксом `EXTRA_'
обязательны.
Например, пакет cpio
во время конфигурации принимает решение о том,
какие программы необходимо скомпилировать. Некоторые программы
устанавливаются в bindir
, а некоторые -- в sbindir
:
EXTRA_PROGRAMS = mt rmt
bin_PROGRAMS = cpio pax
sbin_PROGRAMS = @PROGRAMS@
Определение основной переменной без префикса (например, PROGRAMS
)
является ошибкой.
Заметьте, что общий суффикс `dir' опускается при создании имен переменных; таким образом, имя переменной записывается как `bin_PROGRAMS', а не `bindir_PROGRAMS'.
Нельзя устанавливать любые типы объектов в любые каталоги. Automake будет расценивать такие попытки как ошибку. Automake также будет диагностировать очевидные ошибки в именах каталогов.
Иногда стандартных каталогов--- даже с расширениями Automake---
недостаточно. В частности, иногда полезно для ясности устанавливать
объекты в подкаталог какого-то предопределенного каталога. Здесь
Automake также позволяет вам расширить список возможных каталогов для
установки. Заданный префикс (например, `zar') является
разрешенным, если определена переменная, имеющая такое же имя, но с
суффиксом `dir' (например, zardir
).
Например, пока поддержка HTML не станет частью Automake, вы можете
использовать такой фрагмент кода для установки документации в формате
HTML:
htmldir = $(prefix)/html
html_DATA = automake.html
Специальный префикс `noinst' показывает, что указанные объекты вообще не должны быть установлены.
Специальный префикс `check' показывает, что указанные объекты не
должны быть скомпилированы до тех пор, пока не будет запущена команда make
check
.
Вот список возможных основных имен: `PROGRAMS', `LIBRARIES', `LISP', `SCRIPTS', `DATA', `HEADERS', `MANS' и `TEXINFOS'.
Иногда имена переменных в Makefile образуются на базе некоторого текста,
заданного пользователем. Например, имена программ преобразуются в имена
макросов Makefile. Automake канонизирует этот текст, так что он не
должен следовать правилам именования макросов Makefile. Все имена в
имени, за исключением букв, чисел, и подчеркиваний, при создании ссылки
на макрос преобразуются в
подчеркивания . Например, если ваша
программа называется sniff-glue
, то унаследованная переменная
будет называться sniff_glue_SOURCES
, а не sniff-glue_SOURCES
.
Go to the first, previous, next, last section, table of contents.