Алексей Махоткин

домашняя страница

Automake

Go to the first, previous, next, last section, table of contents.


Общая информация

Следующие разделы описывают основные принципы работы 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 должен проверять соответствие стандартам.

Строгость может принимать следующие значения:

`foreign’
Automake проверит только те вещи, которые совершенно необходимы для правильного функционирования. Например, в то время как стандарты GNU требуют наличия файла `NEWS’, он не требуется при использовании этого режима. Название режима (“иностранный”, “внешний”) произошло от того факта, что Automake предназначен для использования программ GNU; эти ослабленные требования не являются стандартным режимом функционирования.
`gnu’
Automake проверит, насколько это возможно, соответствие стандартам GNU для пакетов. Этот режим действует по умолчанию.
`gnits’
Automake проверит совместимость с еще не написанными стандартами Gnits. Они основан на стандартах GNU, но еще более детальны. Если вы не являетесь помощником в разработке стандартов Gnits, вам лучше избегать этой опции до тех пор, пока стандарт Gnits не будет опубликован.

Для более детальной информации о точном смысле уровня строгости смотрите 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.

Comments