@dircategory GNU admin * automake: (automake.ru). Использование Automake. Создание Makefile.in
@dircategory Отдельные утилиты * aclocal: (automake.ru) Использование aclocal. Создание aclocal.m4
Авторские права (C) 1995, 96 Free Software Foundation, Inc. Это первая редакция документации по GNU Automake,
и она согласована с GNU Automake 1.4.
Published by the Free Software Foundation
59 Temple Place - Suite 330,
Boston, MA 02111-1307 USA
Permission is granted to make and distribute verbatim copies of this manual provided the copyright notice and this permission notice are preserved on all copies.
Permission is granted to copy and distribute modified versions of this manual under the conditions for verbatim copying, provided that the entire resulting derived work is distributed under the terms of a permission notice identical to this one.
Permission is granted to copy and distribute translations of this manual into another language, under the above conditions for modified versions, except that this permission notice may be stated in a translation approved by the Free Software Foundation.
Введение
Automake --- это утилита для автоматического создания файлов `Makefile.in' из файлов `Makefile.am'. Каждый файл `Makefile.am' фактически является набором макросов для программы make
(иногда с несколькими правилами). Полученные таким образом файлы `Makefile.in' соответствуют стандартам GNU Makefile.
Стандарт GNU Makefile (see section `Makefile Conventions' in The GNU Coding Standards) --- это длинный, запутанный документ, и его содержание может в будущем измениться. Automake разработан для того, чтобы убрать бремя сопровождения Makefile с плеч человека, ведущего проект GNU (и взвалить его на человека, сопровождающего Automake).
Типичный входной файл Automake является просто набором макроопределений. Каждый такой файл обрабатывается, и из него создается файл `Makefile.in'. В каталоге проекта должен быть только один файл `Makefile.am'.
Automake накладывает на проект некоторые ограничения; например, он предполагает, что проект использует программу Autoconf (see section `Введение' in Руководство Autoconf), а также налагает некоторые ограничения на содержимое файла `configure.in'.
Automake требует наличия программы perl
для генерации файлов `Makefile.in'. Однако дистрибутив, созданный Automake, является полностью соответствующим стандартам GNU и не требует наличия perl
для компиляции.
Вы можете посылать пожелания по доработке и сообщения об ошибках Automake по адресу .
Общая информация
Следующие разделы описывают основные принципы работы 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
.
Некоторые примеры пакетов
Простой пример, от начала до конца
Давайте предположим, что мы только что закончили писать zardoz
--- программу, от которой у всех кружится голова. Вы использовали Autoconf для обеспечения переносимости, но ваш файл `Makefile.in' был написан бессистемно. Вы же хотите сделать его пуленепробиваемым, и поэтому решаете использовать Automake.
Сначала вам необходимо обновить ваш файл `configure.in', чтобы вставить в него команды, которые необходимы для работы automake
. Проще всего для этого добавить строку AM_INIT_AUTOMAKE
сразу после AC_INIT
:
AM_INIT_AUTOMAKE(zardoz, 1.0)
Поскольку ваша программа не имеет никаких осложняющих факторов (например, она не использует gettext
и не будет создавать разделяемые библиотеки), то первая стадия на этом и заканчивается. Это легко!
Теперь вы должны заново создать файл `configure'. Но для этого нужно сказать autoconf
, где найти новые макросы, которые вы использовали. Для создания файла `aclocal.m4' удобнее всего будет использовать программу aclocal
. Но будьте осторожны... у вас уже есть `aclocal.m4', поскольку вы уже написали несколько собственных макросов для вашей программы. Программа aclocal
позволяет вам поместить ваши собственные макросы в файл `acinclude.m4', так что для сохранения вашей работы просто переименуйте свой файл с макросами, а уж затем запускайте программу aclocal
:
mv aclocal.m4 acinclude.m4 aclocal autoconf
Теперь пришло время написать свой собственный файл `Makefile.am' для программы zardoz
. Поскольку zardoz
является пользовательской программой, то вам хочется установить ее туда, где располагаются другие пользовательские программы. Вдобавок, zardoz
содержит в комплекте документацию в формате Texinfo. Ваш скрипт `configure.in' использует AC_REPLACE_FUNCS
, так что вам необходимо скомпоновать программу с `@LIBOBJS@'. Вот что вам необходимо написать в `Makefile.am'.
bin_PROGRAMS = zardoz zardoz_SOURCES = main.c head.c float.c vortex9.c gun.c zardoz_LDADD = @LIBOBJS@ info_TEXINFOS = zardoz.texi
Теперь можно запустить automake --add-missing
, чтобы создать файл `Makefile.in', используя дополнительные файлы, и вот, все готово!
Классическая программа
GNU hello известен своей классической простотой и многогранностью. В этом разделе показывается, как Automake может быть использован с пакетом GNU Hello. Примеры, приведенные ниже, взяты из последней бета-версии GNU Hello, но убран код, предназначенный только для разработчика пакет, а также сообщения об авторских правах.
Конечно же, GNU Hello использует больше возможностей, чем традиционная двухстроковая программа: GNU Hello работает с разными языками, выполняет обработку ключей командной строки, имеет документацию и набор тестов. GNU Hello является глубоким пакетом.
Вот файл `configure.in' из пакета GNU Hello:
dnl Обработайте этот файл программой autoconf для создания скрипта configure. AC_INIT(src/hello.c) AM_INIT_AUTOMAKE(hello, 1.3.11) AM_CONFIG_HEADER(config.h) dnl Набор доступных языков. ALL_LINGUAS="de fr es ko nl no pl pt sl sv" dnl Проверка наличия программ. AC_PROG_CC AC_ISC_POSIX dnl Проверка имеющихся библиотек. dnl Проверка наличия заголовочных файлов. AC_STDC_HEADERS AC_HAVE_HEADERS(string.h fcntl.h sys/file.h sys/param.h) dnl Проверка библиотечных функций. AC_FUNC_ALLOCA dnl Проверка наличия поля st_blksize в структуре stat AC_ST_BLKSIZE dnl Макросы поддержки различных языков AM_GNU_GETTEXT AC_OUTPUT([Makefile doc/Makefile intl/Makefile po/Makefile.in \ src/Makefile tests/Makefile tests/hello], [chmod +x tests/hello])
Макросы `AM_' предоставляются Automake (или библиотекой Gettext); остальные макросы является макросами Autoconf.
Файл `Makefile.am' в корневом каталоге выглядит следующим образом:
EXTRA_DIST = BUGS ChangeLog.O SUBDIRS = doc intl po src tests
Как видите, вся работа выполняется в подкаталогах.
Каталоги `po' и `intl' автоматически создаются программой gettextize
; они не будут обсуждаться в этом документе.
В файле `doc/Makefile.am' мы видим строки:
info_TEXINFOS = hello.texi hello_TEXINFOS = gpl.texi
Этого достаточно для сборки, установки и распространения руководства GNU Hello.
Вот содержимое файла `tests/Makefile.am':
TESTS = hello EXTRA_DIST = hello.in testdata
Скрипт `hello' создается configure
, и является единственным тестовым случаем. При выполнении make check
будет запущен именно этот тест.
В заключение мы приведем содержимое `src/Makefile.am', где и выполняется вся настоящая работа:
bin_PROGRAMS = hello hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h hello_LDADD = @INTLLIBS@ @ALLOCA@ localedir = $(datadir)/locale INCLUDES = -I../intl -DLOCALEDIR=\"$(localedir)\"
Компиляция программ etags и ctags
Вот другой, более изощренный пример. Он показывает, как собрать две программы (ctags
и etags
) из одного и того же исходного файла (`etags.c'). Самая трудное в том, что каждая компиляция файла `etags.c' требует задания разных флагов для cpp
.
bin_PROGRAMS = etags ctags ctags_SOURCES = ctags_LDADD = ctags.o etags.o: etags.c $(COMPILE) -DETAGS_REGEXPS -c etags.c ctags.o: etags.c $(COMPILE) -DCTAGS -o ctags.o -c etags.c
Заметьте, что переменная ctags_SOURCES
определена как пустая --- при этому не подставляется неявного значения по умолчанию. Для создания etags
из файла `etags.o', однако, используются неявные значения.
Переменная ctags_LDADD
используется для вставки `ctags.o' в строку компоновщика. ctags_DEPENDENCIES
создается Automake.
Вышеприведенные правила не работают в том случае, если ваш компилятор не умеет одновременно работать с ключами `-c' и `-o'. Самым простым способом исправить это недоразумение является введение поддельной зависимости (для того, чтобы избежать проблем с параллельной версией make
):
etags.o: etags.c ctags.o $(COMPILE) -DETAGS_REGEXPS -c etags.c ctags.o: etags.c $(COMPILE) -DCTAGS -c etags.c && mv etags.o ctags.o
Эти явные правила также не работают, если используется де-ANSI-фикация (see section Автоматическая де-ANSI-фикация). Поддержка де-ANSI-фикации требует немного больше работы:
etags._o: etags._c ctags.o $(COMPILE) -DETAGS_REGEXPS -c etags.c ctags._o: etags._c $(COMPILE) -DCTAGS -c etags.c && mv etags._o ctags.o
Создание файла `Makefile.in'
Для создания всех файлов `Makefile.in' пакета запустите программуautomake
в каталоге верхнего уровня без аргументов.automake
автоматически найдет каждый файл `Makefile.am' (сканируя `configure.in'; see section Сканирование файла `configure.in') и сгенерирует соответствующий файл `Makefile.in'. Заметьте, чтоautomake
имеет более простое видение структуры пакета; он предполагает, что пакет имеет только один файл `configure.in', расположенный в каталоге верхнего уровня. Если в вашем пакете имеется несколько файлов `configure.in', то вам необходимо запуститьautomake
в каждом из каталогов, где есть файл `configure.in'.
Также вы можете задать аргумент дляautomake
; суффикс `.am' добавляется к аргументу и результат используется как имя входного файла. В основном эта возможность используется для автоматической перегенерации устаревших файлов `Makefile.in'. Заметьте, чтоautomake
всегда должен запускаться из каталога верхнего уровня проекта, даже если необходимо перегенерировать `Makefile.in' в каком-то из подкаталогов. Это необходимо, так какautomake
должен просканировать файл `configure.in', а также потому, чтоautomake
в некоторых случаях изменяет свое поведение при обработке `Makefile.in' в подкаталогах.automake
принимает следующие ключи командной строки:
- `-a'
- `--add-missing'
-
В некоторых ситуациях Automake требует наличия некоторых общих файлов; например, если в `configure.in' выполняется макрос
AC_CANONICAL_HOST
, то требуется наличие файла `config.guess'. Automake распространяется с несколькими такими файлами; этот ключ заставит программу автоматически добавить к пакету отсутствующие файлы, если это возможно. В общем, если Automake сообщает вам, что какой-то файл отсутствует, то используйте этот ключ. По умолчанию Automake пытается создать символьную ссылку на собственную копию отсутствующего файла; это поведение может быть изменено с помощью ключа--copy
. - `--amdir=dir'
- Этот ключ заставляет Automake искать файлы данных в каталоге dir, а не в каталоге установки. Этот ключ обычно используется при отладке.
- `--build-dir=dir'
-
Сообщает Automake, где располагается каталог для сборки. Этот ключ используется при включении зависимостей в файл `Makefile.in', созданный командой
make dist
; он не должен использоваться в других случаях. - `-c'
- `--copy'
- При использовании с ключом
--add-missing
, заставляет копировать недостающие файлы. По умолчанию создаются символьные ссылки. - `--cygnus'
-
Заставляет сгенерированные файлы `Makefile.in' следовать правилам Cygnus, вместо правил GNU или Gnits. Для дополнительной информации, смотрите section Эффект использования ключа
--cygnus
. - `--foreign'
- Устанавливает глобальную строгость в значение `foreign'. За дополнительной информацией смотрите раздел section Ограничения.
- `--gnits'
-
Устанавливает глобальную строгость в значение `gnits'. За дополнительной информацией смотрите раздел section Эффект использования ключей
--gnu
и--gnits
. - `--gnu'
-
Устанавливает глобальную строгость в значение `gnu'. За дополнительной информацией смотрите раздел section Эффект использования ключей
--gnu
и--gnits
. По умолчанию используется именно такая строгость. - `--help'
- Печатает список ключей командной строки и завершается.
- `-i'
- `--include-deps'
- Включить всю автоматически генерируемую информацию о зависимостях (see section Автоматическое отслеживание зависимостей) в генерируемый файл `Makefile.in'. Это делается в основном при создании дистрибутива; смотрите раздел section Что войдет в дистрибутив.
- `--generate-deps'
- Создать файл, объединяющий всю автоматически генерируемую информацию о зависимостях (see section Автоматическое отслеживание зависимостей), этот файл будет называться `.dep_segment'. В основном этот ключ используется при создании дистрибутива; смотрите section Что войдет в дистрибутив. Он полезен при сопровождении `SMakefile' или файлов `Makefile' для других платформ (`Makefile.DOS', и т. п.). Этот ключ может использоваться только с ключами `--include-deps', `--srcdir-name' и `--build-dir'. Заметьте, что если задан этот ключ, то никакой другой обработки не выполняется.
- `--no-force'
-
Обычно
automake
создает все файлы `Makefile.in', указанные в `configure.in'. Этот ключ заставляет обновлять только те файлы `Makefile.in', которые устарели, с учетом зависимостей друг от друга. - `-o dir'
- `--output-dir=dir'
- Поместить сгенерированный файл `Makefile.in' в каталог dir. Обычно каждый файл `Makefile.in' создается в том же каталоге, что и соответствующий файл `Makefile.am'. Этот ключ используется при создании дистрибутивов.
- `--srcdir-name=dir'
-
Сообщает Automake имя каталога с исходными текстами текущего дистрибутива. Этот ключ используется при включении зависимостей в файл `Makefile.in', сгенерированный командой
make dist
; он не должен использоваться в других случаях. - `-v'
- `--verbose'
- Заставляет Automake выдавать информацию о том, какие файлы читаются или создаются.
- `--version'
- Выдает номер версии Automake и завершается.
Сканирование файла `configure.in'
Для определения разной информации о данном пакете Automake сканирует файл `configure.in'. Также ему требуется определение некоторых макросов и переменныхautoconf
в файле `configure.in'. Automake также использует информацию из файла `configure.in' для определения параметров вывода.
Для того, чтобы облегчить сопровождение, Automake предоставляет некоторые макросы Autoconf. Эти макросы могут быть автоматически помещены в ваш файл `aclocal.m4' при использовании программыaclocal
.
Требования к конфигурации
Чтобы удовлетворить основным требованиям Automake, можно использовать макросAM_INIT_AUTOMAKE
(see section Макросы Autoconf, поставляемые с Automake). Но если хотите, то можете совершить требуемые шаги вручную:
- Определить переменные
PACKAGE
иVERSION
с помощьюAC_SUBST
. ПеременнаяPACKAGE
должна содержать имя пакета, в том виде, в котором оно используется при создании дистрибутива. Например, Automake определяет переменнуюPACKAGE
со значением `automake'. ПеременнаяVERSION
должна содержать номер разрабатываемой версии. Мы рекомендуем хранить номер версии в единственном месте, а именно, в файле `configure.in': это упрощает выпуск новых версий. Automake не производит никакой интерпретации переменныхPACKAGE
илиVERSION
, за исключением работы в режиме `Gnits' (see section Эффект использования ключей--gnu
и--gnits
). - Если программа или скрипт устанавливаются, то используйте макрос
AC_ARG_PROGRAM
. See section `Преобразование имен при установке' in Руководство Autoconf. - Используйте макрос
AC_PROG_MAKE_SET
если пакет не является плоским. See section `Создание файлов вывода' in Руководство Autoconf. - Используйте макрос
AM_SANITY_CHECK
для того, чтобы убедиться, что среда, в которой будет производится сборка пакета, является нормальной. - Вызовите макрос
AC_PROG_INSTALL
(see section `Проверка отдельных программ' in Руководство Autoconf). - Используйте макрос
AM_MISSING_PROG
для того, чтобы убедиться, что программыaclocal
,autoconf
,automake
,autoheader
иmakeinfo
находятся в среде в которой производится сборка пакета. Вот как это сделано:missing_dir=`cd $ac_aux_dir && pwd` AM_MISSING_PROG(ACLOCAL, aclocal, $missing_dir) AM_MISSING_PROG(AUTOCONF, autoconf-ru, $missing_dir) AM_MISSING_PROG(AUTOMAKE, automake, $missing_dir) AM_MISSING_PROG(AUTOHEADER, autoheader, $missing_dir) AM_MISSING_PROG(MAKEINFO, makeinfo, $missing_dir)
Вот список других макросов, которые требуются Automake, но которые не запускаются макросомAM_INIT_AUTOMAKE
:
AC_OUTPUT
-
Automake использует этот макрос для определения того, какие файлы необходимо создавать (see section `Создание выходных файлов' in Руководство Autoconf). Файлы с именем `Makefile' из этого списка считаются файлами для программы
make
. Остальные файлы интерпретируются по разному. В настоящее время отличие состоит лишь в том, что файлы `Makefile' удаляютсяmake distclean
, тогда как другие файлы удаляются командойmake clean
.
Другие вещи, которые распознает Automake
Также Automake распознает использование некоторых макросов и в соответствии с ними генерирует `Makefile.in'. Вот список распознаваемых макросов и результатов их работы:
AC_CONFIG_HEADER
-
Automake требует использования макроса
AM_CONFIG_HEADER
, который похож наAC_CONFIG_HEADER
(see section `Заголовочные файлы настройки' in Руководство Autoconf), но кроме этого выполняет полезную работу, специфичную для Automake. AC_CONFIG_AUX_DIR
- Automake будет искать различные вспомогательные скрипты, такие как `mkinstalldirs', в каталоге, указанном в качестве параметра макроса. Если скрипты там не обнаружены, то они ищутся в их стандартном месте (в каталоге верхнего уровня пакета, либо в каталоге исходных текстов, соответствующем текущему файлу `Makefile.am'). See section `Hахождение ввода `configure'' in Руководство Autoconf.
AC_PATH_XTRA
-
Automake при выполнении этого макроса для каждого файла `Makefile.in', который компилирует программу или библиотеку на C, поместит туда определения переменных, указанных в
AC_PATH_XTRA
. See section `Системные сервисы' in Руководство Autoconf. AC_CANONICAL_HOST
AC_CHECK_TOOL
- Automake обеспечит существование файлов `config.guess' и `config.sub'. Также в файле `Makefile' появятся переменные `host_alias' и `host_triplet'. Смотрите section `Получение канонического типа системы' in Руководство Autoconf, и section `Проверка базовых программ' in Руководство Autoconf.
AC_CANONICAL_SYSTEM
-
Этот макрос подобен макросу
AC_CANONICAL_HOST
, но кроме этого он определяет в файле `Makefile' переменные `build_alias' и `target_alias'. See section `Получение канонического типа системы' in Руководство Autoconf. AC_FUNC_ALLOCA
AC_FUNC_GETLOADAVG
AC_FUNC_MEMCMP
AC_STRUCT_ST_BLOCKS
AC_FUNC_FNMATCH
AM_FUNC_STRTOD
AC_REPLACE_FUNCS
AC_REPLACE_GNU_GETOPT
AM_WITH_REGEX
-
Automake обеспечит генерацию соответствующих зависимостей для объектов, относящихся к этим макросам. Также Automake проверит, что соответствующие файлы исходных текстов являются частью дистрибутива. Заметьте, что Automake поставляется без исходных текстов на C, которые требуются для использования этих макросов, так что
automake -a
не сможет установить их. За дополнительной информацией см. See section Построение библиотеки. Также смотри section `Проверка отдельных функций' in Руководство Autoconf. LIBOBJS
-
Automake также обнаружит операторы, которые помещают файлы с расширением `.o' в
LIBOBJS
, и будет обрабатывать эти дополнительные файлы так, как если бы они описывались макросомAC_REPLACE_FUNCS
. See section `Проверка базовых функций' in Руководство Autoconf. AC_PROG_RANLIB
- Этот макрос требуется, если в пакете собирается какая-нибудь библиотека. See section `Проверка отдельных программ' in Руководство Autoconf.
AC_PROG_CXX
- Требуется если в пакет входят исходные тексты на языке C++. See section `Проверка отдельных программ' in Руководство Autoconf.
AC_PROG_F77
- Требуется, если в пакет будут включаться исходные тексты на Fortran 77. Этот макрос распространяется с Autoconf версии 2.13 и более поздних. See section `Проверка отдельных программ' in Руководство Autoconf.
AC_F77_LIBRARY_LDFLAGS
- Этот макрос требуется для программ и разделяемых библиотек, которые написаны на разных языках и включают Fortran 77 (see section Использование Fortran 77 с C и C++). See section Макросы Autoconf, поставляемые с Automake.
AM_PROG_LIBTOOL
-
Automake включит поддержку
libtool
(see section `Введение' in Руководство Libtool). AC_PROG_YACC
- Если в пакете есть исходный текст на Yacc, то вы должны либо использовать этот макрос, либо определить переменную `YACC' в файле `configure.in'. Рекомендуется использовать первый вариант (See section `Проверка отдельных программ' in Руководство Autoconf.)
AC_DECL_YYTEXT
- Этот макрос требуется, если в пакете есть исходный текст на Lex. See section `Проверка отдельных программ' in Руководство Autoconf.
AC_PROG_LEX
- Если есть исходный текст на Lex, то должен использоваться этот макрос. See section `Проверка отдельных программ' in Руководство Autoconf.
ALL_LINGUAS
- Если Automake обнаружит, что эта переменная установлена в файле `configure.in', то он проверит каталог `po', для того, чтобы обеспечить, что все указанные файлы с расширением `.po' существуют, и что указаны все существующие файлы `.po'.
AM_C_PROTOTYPES
- Это макрос требуется при использовании автоматической де-ANSI-фикации; смотри section Автоматическая де-ANSI-фикация.
AM_GNU_GETTEXT
- Этот макрос требуется для пакетов, которые используют пакет GNU gettext (see section Gettext). Он распространяется вместе с gettext. Если Automake находит этот макрос, то он проверяет, отвечает ли данный пакет некоторым требованиям gettext.
AM_MAINTAINER_MODE
-
Этот макрос добавляет ключ `--enable-maintainer-mode' к скрипту
configure
. Если используется данный макрос, тоautomake
отключит правило `maintainer-only' в сгенерированных файлах `Makefile.in'. Этот макрос не разрешен в режиме `Gnits' (see section Эффект использования ключей--gnu
и--gnits
). Этот макрос определяет условную переменную `MAINTAINER_MODE', которую можно использовать в ваших собственных файлах `Makefile.am'. AC_SUBST
AC_CHECK_TOOL
AC_CHECK_PROG
AC_CHECK_PROGS
AC_PATH_PROG
AC_PATH_PROGS
- Для каждого из этих макросов, их первый аргумент автоматически определяется в качестве переменной в каждом сгенерированном файле `Makefile.in'. See section `Установка переменных вывода' in Руководство Autoconf, и section `Проверка основных переменных' in Руководство Autoconf.
Автоматическая генерация `aclocal.m4'
Automake содержит некоторое количество макросов Autoconf, которые могут быть использованы в вашем пакете; в некоторых ситуациях они требуются для работы Automake. Эти макросы должны быть определены в вашем файле `aclocal.m4'; иначе они не будут обнаружены программойautoconf
.
Программаaclocal
автоматически создает файл `aclocal.m4' на основе содержимого `configure.in'. Это обеспечивает удобный способ для получения макросов Automake, без выполнения дополнительного поиска. Механизмaclocal
является также расширяемым для использования другими пакетами.
При запуске программаaclocal
производит поиск макроопределений во всех файлах `.m4', которые она может найти. Затем она сканирует `configure.in'. Любое упоминание одного из найденных на первом этапе макросов приводит к тому, что этот макрос и все макросы, требуемые для его работы, будут помещены в файл `aclocal.m4'.
Если файл `acinclude.m4' существует, то его содержимое также будет автоматически включено в `aclocal.m4'. Это полезно для включения локальных макросов в `configure'.
Программаaclocal
работает со следующими ключами командной строки:
--acdir=dir
- Заставляет программу искать файлы с макросами в каталоге dir, вместо каталога, куда производилась установка программы. Этот ключ в основном используется для отладки.
--help
- Напечатать справку по ключам командной строки и закончить работу.
-I dir
- Добавляет каталог dir в список каталогов, в которых производится поиск файлов `.m4'.
--output=file
- Вывод производится в файл file, а не в файл `aclocal.m4'.
--print-ac-dir
-
Печатает имя каталога, в котором
aclocal
будет производить поиск файлов `.m4'. При задании этого ключа подавляется обычная обработка. Этот ключ используется пакетом для определения места, куда будет производиться установка файлов с макросами. --verbose
- Печатает имена обрабатываемых файлов.
--version
- Выдает номер версии и заканчивает работу.
Макросы Autoconf, поставляемые с Automake
AM_CONFIG_HEADER
- При использовании этого макроса Automake сгенерирует правила для автоматической регенерации заголовочного файла конфигурации. Если вы используете этот макрос, то вы должны создать в каталоге исходных текстов файл `stamp-h.in'. Он может быть пустым.
AM_ENABLE_MULTILIB
- Этот макрос используется, когда будет строиться "мульти-библиотека". "Мульти-библиотека" компилируется несколько раз, по разу на каждую комбинацию флагов компиляции. Это полезно только в тех случаях, когда библиотека предназначена для кросс-компиляции. Первым необязательным аргументом макроса является имя создаваемого файла `Makefile'; значением по умолчанию является `Makefile'. Второй аргумент используется для нахождения каталога верхнего уровня исходных текстов; по умолчанию используется пустая строка (обычно этот аргумент не следует использовать, если вы не знакомы с внутренним устройством).
AM_FUNC_STRTOD
-
Если функция
strtod
недоступна, или работает неправильно (как в SunOS 5.4), то строка `strtod.o' добавляется к выходной переменнойLIBOBJS
. AM_FUNC_ERROR_AT_LINE
-
Если функция
error_at_line
не найдена, то строка `error.o' добавляется кLIBOBJS
. AM_FUNC_MKTIME
-
Проверяет наличие работоспособной функции
mktime
. Если таковая не найдена, то к переменной `LIBOBJS' добавляется `mktime.o'. AM_FUNC_OBSTACK
- Проверка наличия кода GNU obstacks; если код не найден, то добавить строку `obstack.o' к переменной `LIBOBJS'.
AM_C_PROTOTYPES
- Проверяет, распознает ли компилятор прототипы функций. Если это происходит, то определяет переменную `PROTOTYPES' и устанавливает выходные переменные `U' и `ANSI2KNR' в пустую строку. В противном случае, устанавливает `U' равным `_', а `ANSI2KNR' в `./ansi2knr'. Automake использует эти значения для реализации автоматической де-ANSI-фикации.
AM_HEADER_TIOCGWINSZ_NEEDS_SYS_IOCTL
-
Если использование
TIOCGWINSZ
требует наличия файла `' , то этот макрос определяет переменнуюGWINSZ_IN_SYS_IOCTL
. В противном случае поискTIOCGWINSZ
будет осуществляться в `' . AM_INIT_AUTOMAKE
- Запускает множество макросов, в которых нуждается `configure.in'. Этот макрос требует два аргумента -- имя пакета и номер версии. По умолчанию этот макрос определяет через
AC_DEFINE
макросы `PACKAGE' и `VERSION'. Такого поведения можно избежать, передавая непустой третий аргумент. AM_PATH_LISPDIR
-
Ищет программу
emacs
, и если она найдена, то устанавливает выходную переменнуюlispdir
равной полному пути к каталогу `site-lisp' программы Emacs. AM_PROG_CC_STDC
- Если по умолчанию компилятор C не работает в режиме ANSI C, то пробует добавить опцию к переменно
CC
, которая заставит его делать это. Этот макрос пробует различные ключи командной строки компилятора, которые включают режим ANSI C на некоторых системах. Считается, что компилятор находится в режиме ANSI C, если он корректно обрабатывает прототипы функций. Если вы используете этот макрос, то вы должны проверить, что после его вызова компилятор C будет работать в режиме ANSI C; если это не так, то переменная средыam_cv_prog_cc_stdc
устанавливается в значение `no'. Если вы написали свою программу в стандарте ANSI C, то вы можете создать ее не-ANSI-фицированную копию, используя опциюansi2knr
(see section Автоматическая де-ANSI-фикация). AM_PROG_LEX
-
Этот макрос похож на макросы
AC_PROG_LEX
иAC_DECL_YYTEXT
(see section `Проверка отдельных программ' in Руководство Autoconf), но использует скриптmissing
на системах, в которых нетlex
. Одной из таких систем является `HP-UX 10'. AM_SANITY_CHECK
- Этот макрос выполняет проверку того, что файл, созданный в каталоге для компиляции, новее, чем файл в каталоге с исходными текстами. На системах с неправильно установленными часами произойдет сбой. Этот макрос автоматически запускается из
AM_INIT_AUTOMAKE
. AM_SYS_POSIX_TERMIOS
-
Проверяет, доступны ли заголовочные файлы POSIX `termios' в данной системе. Если это так, то переменная среды
am_cv_sys_posix_termios
устанавливается в значение `yes'. Если нет, то значением переменной будет являться `no'. AM_TYPE_PTRDIFF_T
-
Определяет переменную `HAVE_PTRDIFF_T' в том случае, если тип `ptrdiff_t' определен в `
' . AM_WITH_DMALLOC
-
Добавляет поддержку пакета dmalloc Если пользователь выполняет конфигурацию с ключом `--with-dmalloc', то будет определена переменная
WITH_DMALLOC
и добавлен ключ `-ldmalloc' в переменнуюLIBS
. AM_WITH_REGEX
-
Добавляет `--with-regex' к ключам командной строки
configure
. Если этот ключ указан (по умолчанию), то используется библиотека регулярных выражений `regex', файл `regex.o' помещается в `LIBOBJS' и определяется переменная `WITH_REGEX'. Если задан ключ `--without-regex', то используется библиотека регулярных выражений `rx', а `rx.o' добавляется в переменную `LIBOBJS'.
Написание ваших собственных макросов aclocal
Программаaclocal
сама по себе ничего не знает о каких-либо макросах, поэтому ее очень легко расширять, создавая свои собственные макросы.
Эта возможность в основном используется библиотеками, которые хотят предоставить собственные макросы Autoconf для использования другими программами. Например, библиотекаgettext
предоставляет макросAM_GNU_GETTEXT
, который должен быть использован любым пакетом, использующимgettext
. При установке библиотеки устанавливается также этот макрос, чтобы программаaclocal
смогла его найти.
Файл макросов должен быть серией вызововAC_DEFUN
. Программаaclocal
также понимает директивуAC_REQUIRE
, так что вполне безопасно помещать каждый макрос в отдельный файл. See section `Hеобходимые макросы' in Руководство Autoconf, и section `Макроопределения' in Руководство Autoconf.
Имя файла макросов должно оканчиваться на `.m4'. Такие файлы должны устанавливаться в каталог `$(datadir)/aclocal'.
`Makefile.am' верхнего уровня
В неплоских пакетах в файле `Makefile.am' верхнего уровня надо указать Automake, в каких подкаталогах будет производится сборка. Это выполняется с помощью переменнойSUBDIRS
.
МакросSUBDIRS
содержит список подкаталогов, в которых могут производиться различные виды сборки. Многие цели (например,all
) в сгенерированном файле `Makefile' будут выполняться как в текущем каталоге, так и во всех указанных подкаталогах. Заметьте, что подкаталоги, перечисленные вSUBDIRS
, не обязаны содержать файл `Makefile.am', а только лишь `Makefile' (после выполнения конфигурации). Это позволяет использовать библиотеки из пакетов, которые не используют Automake (например,gettext
). Каталоги, упомянутые вSUBDIRS
, должны быть прямыми потомками текущего каталога. Например, вы не можете поместить каталог `src/subdir' в переменнуюSUBDIRS
.
В глубоких пакетах `Makefile.am' верхнего уровня часто очень короток. Например, вот `Makefile.am' из дистрибутива GNU Hello:
EXTRA_DIST = BUGS ChangeLog.O README-alpha SUBDIRS = doc intl po src tests
Можно переопределить переменнуюSUBDIRS
если, как в случае GNUInetutils
, вы хотите собрать только некоторое подмножество пакета. Для этого включите в ваш файл `Makefile.am' следующие строки:
SUBDIRS = @SUBDIRS@
Затем в вашем файле `configure.in' вы можете указать:
SUBDIRS = "src doc lib po" AC_SUBST(SUBDIRS)
В результате этого Automake сможет при построении пакета заставить его принимать список каталогов, но точное содержимое этого списка станет известно только после запускаconfigure
.
Хотя макросSUBDIRS
может содержать подстановки (например `@DIRS@'); сам Automake в действительности не проверяет содержимое этой переменной.
Если определена переменнаяSUBDIRS
, то ваш файл `configure.in' должен включать макросAC_PROG_MAKE_SET
.
ИспользованиеSUBDIRS
не ограничено только `Makefile.am' верхнего уровня. Automake может использоваться для создания пакетов любой глубины.
По умолчанию Automake создает файлы `Makefile', которые работают, выполняя сначала make в подкаталогах (постфиксный метод). Однако, можно изменить это поведение, поместив `.' в переменнуюSUBDIRS
. Например, поместив `.' в начало списка, вы заставите выполнять make сначала в текущем каталоге, а затем уже в подкаталогах (префиксный метод).
Построение программ и библиотек
Большая часть функциональности Automake направлена на то, чтобы облегчить компиляцию программ и библиотек.
Построение программ
В каталоге, содержащем исходные тексты, из которых будет построена программа (в отличие от библиотеки), в основном используется макрос `PROGRAMS'. Программы могут быть установлены в каталогиbindir
,sbindir
,libexecdir
,pkglibdir
, или же вообще не устанавливаться (`noinst').
Например:
bin_PROGRAMS = hello
В этом простом примере результирующий `Makefile.in' будет содержать код для генерации программы с именемhello
. Переменнаяhello_SOURCES
используется для указания того, какие файлы исходных текстов будут использованы для компиляции исполняемого файла:
hello_SOURCES = hello.c version.c getopt.c getopt1.c getopt.h system.h
В результате этого каждый упомянутый в этой переменной файл `.c' будет скомпилирован в соответствующий файл `.o'. Затем все они компонуются для создания `hello'.
Если переменная `prog_SOURCES' необходима, но не указана, то она получает значение по умолчанию, равное единственному файлу `prog.c'.
В одном каталоге могут компилироваться несколько программ. Эти программы могут совместно использовать один и тот же исходный файл, который должен быть указан в каждом определении `_SOURCES'.
Заголовочные файлы, перечисленные в определении `_SOURCES', включаются в дистрибутив, а в других случаях игнорируются. В том случае, если это не очень удобно, вы не должны включать файл, созданный `configure' в переменную `_SOURCES'; этот файл не должен распространяться. Файлы Lex (`.l') и Yacc (`.y') также должны быть перечислены; смотрите раздел section Поддержка Yacc и Lex.
Automake должен знать все файлы исходных текстов, которые могут участвовать в компиляции программы, даже если не все файлы будут использоваться в каждом конкретном случае. Файлы, которые компилируются только при выполнении определенных условий, должны быть перечислены в соответствующей переменной `EXTRA_'. Например, если `hello-linux.c' будет, в зависимости от условий, включен в программуhello
, то файл `Makefile.am' должен содержать:
EXTRA_hello_SOURCES = hello-linux.c
Иногда также полезно аналогичным образом определить во время конфигурации, какие программы будут скомпилированы. Например, GNUcpio
создает программыmt
иrmt
только при выполнении определенных условий.
В этом случае вы должны уведомить Automake обо всех программах, которые могут быть построены, но в то же время заставить сгенерированный файл `Makefile.in' использовать программы, заданные при выполненииconfigure
. Это делается подстановкой значений при выполненииconfigure
в каждом определении `_PROGRAMS'. А все программы, которые можно создать, перечисляются в переменнойEXTRA_PROGRAMS
.
Если вы хотите скомпоновать программу с библиотеками, которые не найденыconfigure
, то для этого вы должны использовать переменнуюLDADD
. Эта переменная может использоваться для добавления ключей в командную строку компоновщика.
Иногда несколько программ компилируются в одном каталоге, но при этом у них различные требования к компоновке. В этом случае для переопределения глобальной переменнойLDADD
вы можете использовать переменную `prog_LDADD' (где prog является именем программы, как оно появляется в некоторых переменных `_PROGRAMS', и обычно записывается буквами в нижнем регистре). Если эта переменная существует для заданной программы, то программа компонуется без использованияLDADD
.
Например, в GNU cpio,pax
,cpio
иmt
компонуются с библиотекой `libcpio.a'. Однако, программаrmt
, создаваемая в том же каталоге, не имеет такого требования к компоновке. Более того, программыmt
иrmt
создаются только на определенных типах машин. Вот как выглядит `src/Makefile.am' из поставки cpio (в сокращенном виде):
bin_PROGRAMS = cpio pax @MT@ libexec_PROGRAMS = @RMT@ EXTRA_PROGRAMS = mt rmt LDADD = ../lib/libcpio.a @INTLLIBS@ rmt_LDADD = cpio_SOURCES = ... pax_SOURCES = ... mt_SOURCES = ... rmt_SOURCES = ...
`prog_LDADD' не подходит для передачи специфических для программы флагов компоновщика (за исключением `-l' и `-L'). Для передачи таких флагов используйте переменную `prog_LDFLAGS'.
Также иногда полезно собирать программу, в зависимости от цели, которая не является частью этой программы. Это может быть сделано с использованием переменной `prog_DEPENDENCIES'. Каждая программа зависит от содержимого такой переменной, но никакой дополнительной интерпретации не производится.
Если переменная `prog_DEPENDENCIES' не определена, то она будет вычислена Automake. Автоматически присвоенная ей величина является содержимым переменной `prog_LDADD' с большинством подстановок configure. Ключи `-l' и `-L' удаляются. Остающимися подстановками configure являются только `@LIBOBJS@' и `@ALLOCA@'; они остаются потому, что они заведомо не приведут к генерации неправильных значений для `prog_DEPENDENCIES'.
Построение библиотеки
Построение библиотеки по большей части аналогично построению программы. В этом случае именем основной переменной является `LIBRARIES'. Библиотеки могут быть установлены в каталогиlibdir
или вpkglibdir
.
Смотрите See section Построение разделяемых библиотек, для получения информации о том, как компилировать разделяемые библиотеки, используя программу Libtool и основную переменную `LTLIBRARIES'.
Каждая переменная `_LIBRARIES' является списком библиотек, которые должны быть построены. Например, для того, чтобы создать библиотеку с именем `libcpio.a', но не устанавливать ее, вы должны написать:
noinst_LIBRARIES = libcpio.a
Файлы исходных текстов для библиотек определяются точно так же, как и для программ, через переменные `_SOURCES'. Заметьте, что имя библиотеки является канонизированным (see section Как именуются порожденные переменные), так что переменная `_SOURCES' для `liblob.a' является равной `liblob_a_SOURCES', а не `liblob.a_SOURCES'.
Дополнительные объекты могут быть добавлены в библиотеку, используя переменную `library_LIBADD'. Это можно использовать для объектов, определенныхconfigure
. Опять пример изcpio
:
libcpio_a_LIBADD = @LIBOBJS@ @ALLOCA@
Специальная обработка переменных `LIBOBJS' и `ALLOCA'
Automake явно распознает использование переменных@LIBOBJS@
и@ALLOCA@
, и использует эту информацию вместе со списком файловLIBOBJS
, полученным из `configure.in', для автоматического включения соответствующих файлов исходных текстов в дистрибутив (see section Что войдет в дистрибутив). Эти файлы исходных текстов также обрабатываются для автоматического определения зависимостей; смотрите раздел See section Автоматическое отслеживание зависимостей.
Использование@LIBOBJS@
и@ALLOCA@
распознается в переменных `_LDADD' и `_LIBADD'.
Построение разделяемых библиотек
Построение разделяемой библиотеки является относительно сложной задачей. Для помощи в платформонезависимом построении разделяемых библиотек была создана программа GNU Libtool (see section `Introduction' in Libtool Manual).
Automake использует Libtool для построения библиотек, указанных в переменной `LTLIBRARIES'. Каждая переменная `_LTLIBRARIES' является списком разделяемых библиотек, которые нужно построить. Например, для создания библиотеки с именем `libgettext.a' и соответствующей ей разделяемой библиотеки, а также их установки в `libdir', вы должны написать:
lib_LTLIBRARIES = libgettext.la
Заметьте, что разделяемые библиотеки должны быть установлены, так что использованиеcheck_LTLIBRARIES
не разрешено. Однако же, разрешено использование переменнойnoinst_LTLIBRARIES
. Эта возможность должна быть использована для "готовых библиотек" libtool.
Для каждой библиотеки переменная `library_LIBADD' содержит имена дополнительных объектов libtool (файлы `.lo'), которые будет добавляться в разделяемую библиотеку. Переменная `library_LDFLAGS' содержит любые дополнительные флаги libtool, такие как `-version-info' или `-static'.
В то время как обычные библиотеки могут включать@LIBOBJS@
, библиотеки, использующие libtool, должны использовать@LTLIBOBJS@
. Это требуется, поскольку имена объектных файлов, над которыми работает libtool, не обязательно оканчиваются на `.o'. Руководство по libtool содержит более детальное описание этой темы.
Для библиотек, устанавливаемых в некоторый каталог, Automake будет автоматически снабжать их соответствующим ключом `-rpath'. Однако для библиотек, определенных во время конфигурации (и таким образом перечисленных в переменнойEXTRA_LTLIBRARIES
), Automake не знает возможных каталогов установки; для таких библиотек вы должны сами добавить ключ `-rpath' в соответствующую переменную `_LDFLAGS'.
Для подробного описания смотрите @xref{Использование Automake, Использование Automake с Libtool, libtool, Libtool Manual}.
Переменные, используемые при построении программ
Иногда полезно знать, какие переменные `Makefile' Automake использует для компиляции; например, вам в некоторых случаях может быть необходимо использовать ваш собственный способ компиляции.
Некоторые переменные наследуются от Autoconf: этоCC
,CFLAGS
,CPPFLAGS
,DEFS
,LDFLAGS
иLIBS
.
Также есть некоторые дополнительные переменные, определенные самим Automake:
INCLUDES
-
Задает список ключей `-I'. Может быть установлен в вашем файле `Makefile.am', если у вас есть специальные каталоги, в которых вы хотите осуществлять поиск. Automake автоматически подставляет некоторые ключи `-I'. В частности, он генерирует строку с ключами `-I$(srcdir)' и `-I', указывающий на каталог с файлом `config.h' (если вы используете
AC_CONFIG_HEADER
илиAM_CONFIG_HEADER
).INCLUDES
может быть использован для других ключейcpp
, а не только для `-I'. Например, эта переменная используется для передачи специальных ключей `-D' вашему компилятору. COMPILE
- Эта команда используется для компиляции исходных файлов на языке C. Имя файла исходных текстов добавляется для формирования полной командной строки.
LINK
- Эта команда используется для компоновки программы на языке C.
Поддержка Yacc и Lex
В Automake есть некоторая поддержка Yacc и Lex.
Automake предполагает, что файлы с расширением `.c', которые создаютсяyacc
(илиlex
) должны называться точно так же, как и входной файл. Это значит, что при использовании исходного yacc-файла `foo.y' Automake будет считать, что промежуточный файл будет называться `foo.c' (а не более традиционно, `y.tab.c').
Расширение имени yacc-файла используется для определения расширения имени готового файла на языках `C' или `C++'. Файлы с расширением `.y' будут превращены в файлы с расширением `.c'; аналогично `.yy' станут `.cc'; `.y++' станут `c++'; и `.yxx' станут `.cxx'.
Подобным образом исходные тексты наlex
могут быть использованы для создания файлов на `C' или `C++'; распознаются файлы с расширениями `.l', `.ll', `.l++' и `.lxx'.
Вы не должны явно упоминать промежуточные файлы (на `C' или `C++') в переменных `SOURCES'; вы должны указывать только список исходных файлов.
Промежуточные файлы, созданныеyacc
(илиlex
), будут включены в созданный дистрибутив. Таким образом, пользователю не обязательно иметь у себяyacc
илиlex
.
Если был обнаружен исходный текст наyacc
, то ваш файл `configure.in' должен определить переменную `YACC'. Это легко делается макросом `AC_PROG_YACC' (see section `Проверка отдельных программ' in Руководство Autoconf).
Аналогичным образом, если есть исходный текстlex
, то в `configure.in' должна быть определена переменная `LEX'. Вы можете использовать для этого макрос `AC_PROG_LEX' (see section `Проверка отдельных программ' in Руководство Autoconf). Поддержкаlex
в Automake также требует использования макроса `AC_DECL_YYTEXT' -- automake необходимо знать значение `LEX_OUTPUT_ROOT'. Все эти тонкости обрабатываются при использовании макросаAM_PROG_LEX
(see section Макросы Autoconf, поставляемые с Automake).
Automake делает возможным включение в одну программу нескольких исходных файловyacc
(илиlex
). Для запускаyacc
(илиlex
) в подкаталогах Automake использует небольшую программу,ylwrap
. Это необходимо, поскольку имя выходного файла yacc является фиксированным, а параллельное выполнение make может одновременно запустить несколько экземпляровyacc
. Программаylwrap
распространяется вместе с Automake. Она должна быть в каталоге, указанном переменной `AC_CONFIG_AUX_DIR' (see section `Нахождение ввода `configure'' in Руководство Autoconf) или в текущем каталоге, если данный макрос не используется в `configure.in'.
Дляyacc
, недостаточно просто управлять блокировками. Результирующий файлyacc
всегда использует внутри одни и те же имена символов, так что невозможно скомпоновать два парсераyacc
в одну и ту же программу.
Мы рекомендуем использование следующего приема с переименованием объектов, который используется вgdb
:
#define yymaxdepth c_maxdepth #define yyparse c_parse #define yylex c_lex #define yyerror c_error #define yylval c_lval #define yychar c_char #define yydebug c_debug #define yypact c_pact #define yyr1 c_r1 #define yyr2 c_r2 #define yydef c_def #define yychk c_chk #define yypgo c_pgo #define yyact c_act #define yyexca c_exca #define yyerrflag c_errflag #define yynerrs c_nerrs #define yyps c_ps #define yypv c_pv #define yys c_s #define yy_yys c_yys #define yystate c_state #define yytmp c_tmp #define yyv c_v #define yy_yyv c_yyv #define yyval c_val #define yylloc c_lloc #define yyreds c_reds #define yytoks c_toks #define yylhs c_yylhs #define yylen c_yylen #define yydefred c_yydefred #define yydgoto c_yydgoto #define yysindex c_yysindex #define yyrindex c_yyrindex #define yygindex c_yygindex #define yytable c_yytable #define yycheck c_yycheck #define yyname c_yyname #define yyrule c_yyrule
Для каждого `#define' замените префикс `c_' на то, что вы хотите использовать. Эти определения работают для программbison
,byacc
и традиционныхyacc
. Если вы обнаружили, что какой-нибудь генератор парсеров использует символы, не указанные в этом списке, то сообщите нам новое имя, чтобы мы добавили его.
Поддержка C++
Automake полностью поддерживает C++.
Любой пакет, содержащий код на C++, должен определить переменную `CXX' в файле `configure.in'; самым простым способом сделать это является использование макросаAC_PROG_CXX
(see section `Проверка отдельных программ' in Руководство Autoconf).
Несколько дополнительных переменных определяются при обнаружении исходных файлов на C++:
CXX
- Имя компилятора C++.
CXXFLAGS
- Флаги, передаваемые компилятору C++.
CXXCOMPILE
- Команда, используемая для компиляции исходных текстов на языке C++. Имя файла с исходным текстом добавляется к ней для формирования полной командной строки.
CXXLINK
- Эта команда используется для компоновки программы на C++.
Поддержка Fortran 77
Automake полностью поддерживает Fortran 77.
Любой пакет, содержащий исходные тексты на языке Fortran 77, должен определить выходную переменную `F77' в файле `configure.in'; самым простым способом является использование макросаAC_PROG_F77
(see section `Проверка отдельных программ' in Руководство Autoconf). See section Использование Fortran 77 с Autoconf.
При использовании исходных текстов на Fortran 77 определяются несколько дополнительных переменных:
F77
- Имя компилятора Fortran 77.
FFLAGS
- Флаги, передаваемые компилятору Fortran 77.
RFLAGS
- Флаги, передаваемые компилятору Ratfor.
F77COMPILE
- Команда, используемая для компиляции исходных текстов на Fortran 77. Имя файла исходных текстов добавляется к ней чтобы получить полную командную строку.
FLINK
- Команда, используемая для компоновки программы на Fortran 77 или разделяемой библиотеки.
Automake может вдобавок к компиляции выполнять предварительную обработку исходных файлов на Fortran 77 и Ratfor(1). Automake также содержит некоторую поддержку для создания программ и разделяемых библиотек, которые написаны на смеси Fortran 77 и других языков (see section Использование Fortran 77 с C и C++).
Это описывается в следующих разделах.
Предварительная обработка файлов Fortran 77
Файл `N.f' автоматически создается из файла `N.F' или `N.r'. Это правило запускает препроцессор для преобразования исходных текстов Fortran 77 или Ratfor с директивами препроцессора в строгий исходный текст Fortran 77. Вот точные команды, которые используются для этого:
- `.F'
$(F77) -F $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)
- `.r'
$(F77) -F $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)
Компиляция файлов Fortran 77
`N.o' автоматически создается из `N.f', `N.F' или `N.r' запуском компилятора Fortran 77. Для компиляции используются следующий команды:
- `.f'
$(F77) -c $(AM_FFLAGS) $(FFLAGS)
- `.F'
$(F77) -c $(DEFS) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_FFLAGS) $(FFLAGS)
- `.r'
$(F77) -c $(AM_FFLAGS) $(FFLAGS) $(AM_RFLAGS) $(RFLAGS)
Использование Fortran 77 с C и C++
В настоящее время Automake предоставляет ограниченную поддержку создания программ и разделяемых библиотек, которые являются смесью Fortran 77 и C и/или C++. Однако существует много других вопросов, возникающих при смешивании кода на Fortran 77 с кодом на других языках, которые в настоящее время не обрабатываются Automake, но обрабатываются другими пакетами(2).
Automake может предоставить вам помощь двумя способами:
- Автоматический выбор компоновщика в зависимости от комбинации исходного кода.
- Автоматический выбор флагов компоновщика (например, `-L' и `-l') для передачи автоматически выбранному компоновщику для компоновки с соответствующими внутренними библиотеками и библиотеками времени исполнения Fortran 77. Эти дополнительные флаги компоновщика Fortran 77 выдаются в выходную переменную
FLIBS
макросом AutoconfAC_F77_LIBRARY_LDFLAGS
, который поставляется со свежими версиями Autoconf (Autoconf версии 2.13 и выше). See section `Характеристики компилятора Fortran 77' in Autoconf.
Если Automake определяет, что программа или разделяемая библиотека (упомянутые в каких-либо основных переменных_PROGRAMS
или_LTLIBRARIES
) содержит исходный код, который является смесью Fortran 77 и C и/или C++, то он требует вызова макросаAC_F77_LIBRARY_LDFLAGS
в файле `configure.in', и чтобы в соответствующей переменной_LDADD
(для программ) или_LIBADD
(для разделяемых библиотек) появились ссылки либо на$(FLIBS)
, либо на@FLIBS@
. От человека, пишущего `Makefile.am', требуется убедиться, что переменные$(FLIBS)
или@FLIBS@
находятся в соответствующих переменных_LDADD
или_LIBADD
.
Например, рассмотрим следующий `Makefile.am':
bin_PROGRAMS = foo foo_SOURCES = main.cc foo.f foo_LDADD = libfoo.la @FLIBS@ pkglib_LTLIBRARIES = libfoo.la libfoo_la_SOURCES = bar.f baz.c zardoz.cc libfoo_la_LIBADD = $(FLIBS)
В этом случае Automake будет настаивать, чтобы макросAC_F77_LIBRARY_LDFLAGS
был упомянут в `configure.in'. Более того, если переменная@FLIBS@
не была упомянута в переменнойfoo_LDADD
иlibfoo_la_LIBADD
, то Automake выдаст предупреждение.
Как выбирается компоновщик
Следующая диаграмма показывает, как Automake производит выбор соответствующего компоновщика.
Например, если используемый код на Fortran 77, C и C++ компонуется в одну программу, то выбирается компоновщик C++. В этом случае, если компоновщики C или Fortran 77 требуют какие-либо специальные библиотеки, которые не подключаются компоновщиком C++, то они должны быть вручную добавлены пользователем в переменные_LDADD
или_LIBADD
файла `Makefile.am'.
\ Linker source \ code \ C C++ Fortran ----------------- +---------+---------+---------+ | | | | C | x | | | | | | | +---------+---------+---------+ | | | | C++ | | x | | | | | | +---------+---------+---------+ | | | | Fortran | | | x | | | | | +---------+---------+---------+ | | | | C + C++ | | x | | | | | | +---------+---------+---------+ | | | | C + Fortran | | | x | | | | | +---------+---------+---------+ | | | | C++ + Fortran | | x | | | | | | +---------+---------+---------+ | | | | C + C++ + Fortran | | x | | | | | | +---------+---------+---------+
Использование Fortran 77 с Autoconf
Имеющаяся в Automake поддержка Fortran 77 требует наличия свежей версии Autoconf, которая поддерживает Fortran 77. Полная поддержка Fortran 77 была добавлена в Autoconf 2.13, так что вы можете использовать эту версию Autoconf или более позднюю.
Поддержка других языков
В настоящее время Automake включает в себя полную поддержку только C, C++ (see section Поддержка C++) и Fortran 77 (see section Поддержка Fortran 77). Поддержка других языков находится в зачаточном состоянии и будет улучшена по требованию пользователей.
Автоматическая де-ANSI-фикация
Хотя стандарты GNU позволяют использование ANSI C, это может привести к ограничению переносимости пакета на некоторые старые компиляторы (особенно SunOS).
Automake позволяет вам обойти проблему с такими машинами путем де-ANSI-фикации каждого исходного файла перед компиляцией.
Если в `Makefile.am' переменнаяAUTOMAKE_OPTIONS
(see section Изменение поведения Automake) содержит ключansi2knr
, то в генерируемый файл `Makefile.in' будет вставлен код для де-ANSI-фикации.
Это заставит считать каждый исходный текст на языке C соответствующим ANSI C. Если доступен компилятор, соответствующий ANSI C, то он будет использован. В противном случае для преобразования исходных файлов в стандарт K&R будет использована программаansi2knr
, а затем преобразованные файлы будут скомпилированы.
Программаansi2knr
совершенно бесхитростна. Она предполагает, что исходный текст будет отформатирован определенным способом; подробное описание находится на странице руководства поansi2knr
.
Поддержка де-ANSI-фикации требует наличия файлов `ansi2knr.c' и `ansi2knr.1' в том же пакете, где находятся и исходные тексты на ANSI C; эти файлы поставляются в комплекте Automake. Файл `configure.in' должен также содержать вызов макросаAM_C_PROTOTYPES
(see section Макросы Autoconf, поставляемые с Automake).
Automake также работает в тех случаях, когда файлыansi2knr
находятся в другом подкаталоге текущего пакета. Это делается добавлением в опциюansi2knr
относительного пути к соответствующему каталогу. Например, предположим, что исходные тексты на ANSI C располагаются в подкаталогах `src' и `lib'. Файлы `ansi2knr.c' и `ansi2knr.1' находятся в подкаталоге `lib'. Вот что должно быть написано в `src/Makefile.am':
AUTOMAKE_OPTIONS = ../lib/ansi2knr
Если никакой префикс не задан, то считается, что файлы находятся в текущем каталоге.
Файлы, перечисленные в переменнойLIBOBJS
и нуждающиеся в де-ANSI-фикации, не будут обрабатываться автоматически. Это происходит из-за того, чтоconfigure
будет генерировать имена объектных файлов в виде `regex.o', в то время какmake
будет искать `regex_.o' (при выполнении де-ANSI-фикации). В конечном счете эта проблема может быть решена с помощью методовautoconf
, но для этого вы должны поместить следующий код в ваш файл `configure.in', как раз перед вызовом макросаAC_OUTPUT
:
# This is necessary so that .o files in LIBOBJS are also built via # the ANSI2KNR-filtering rules. LIBOBJS=`echo $LIBOBJS|sed 's/\.o /\$U.o /g;s/\.o$/\$U.o/'`
Автоматическое отслеживание зависимостей
Для разработчика зачастую мучительно бывает постоянно обновлять файл `Makefile.in' при изменении зависимостей включаемых в проект файлов. Automake предоставляет возможность автоматического отслеживания изменения зависимостей и записи информации о них в сгенерированный `Makefile.in'.
В настоящее время эта поддержка требует использования GNUmake
иgcc
. В будущем может быть возможным поставка другой программы генерации зависимостей, если это будет требоваться. По умолчанию этот режим разрешен, если в текущем каталоге определена любая программа или библиотека на C, так что вы можете получить от не-GNU make ошибку `Должен быть разделитель'.
Когда вы решаете создать дистрибутив, то цельdist
перезапуститautomake
с ключом `--include-deps' и другими ключами. See section Создание файла `Makefile.in', и section Изменение поведения Automake. При этом предварительно сгенерированные зависимости будут помещены в созданный `Makefile.in' и, таким образом, они окажутся в дистрибутиве. При этом в дистрибутив код генерации зависимостей не будет включен в дистрибутив, так что человек, загрузивший ваш дистрибутив и не использующий GNUmake
иgcc
, не получит ошибки.
При добавлении зависимостей в `Makefile.in', из них автоматически удаляются все специфические для данной системы зависимости. Это может быть сделано перечислением файлов в переменной `OMIT_DEPENDENCIES'. Например, Automake удаляет все ссылки на системные заголовочные файлы. Иногда полезно указать, чтобы были удалены отдельные заголовочные файлы. Например, если ваш файл `configure.in' использует макрос `AM_WITH_REGEX', то любая зависимость от файла `rx.h' или `regex.h' должны быть удалена, потому что правильное значение не может быть известно до того, как пользователь выполнит конфигурацию пакета.
Оказывается, Automake достаточно умен для обработки именно этого случая использования заголовочных файлов библиотеки регулярных выражений. Он также автоматически убирает зависимость от `libintl.h' при использовании `AM_GNU_GETTEXT'.
Автоматическое отслеживание зависимостей может быть запрещено помещениемno-dependencies
в переменнуюAUTOMAKE_OPTIONS
.
Если вы распаковываете дистрибутив, созданныйmake dist
, и хотите включить отслеживание зависимостей, то просто перезапуститеautomake
.
Файлы зависимостей помещаются в подкаталог с именем `.deps' каталога, где происходит построение. Эти зависимости являются специфическими для машины. Можете удалить их, если хотите; они будут автоматически пересозданы при следующей сборке.
Другие порожденные объекты
Automake может обрабатывать порожденные объекты, которые не являются программами на C. Иногда поддержка построения таких объектов должна быть предоставлена явно, но Automake все равно будет автоматически отрабатывать процесс установки и создания дистрибутива.
Исполняемые скрипты
Существует также возможность определить и установить программы, которые являются скриптами. Эти программы перечисляются с использованием основной переменной `SCRIPTS'. Automake не определяет зависимости для скриптов; файл `Makefile.am' должен явно включать в себя соответствующие правила.
Automake не считает, что скрипты являются унаследованными объектами; такие скрипты должны удаляться вручную (see section Что будет удалено).
Сама программаautomake
является скриптом на Perl, так что она генерируется на этапе конфигурации из `automake.in'. Вот как это обрабатывается:
bin_SCRIPTS = automake
Посколькуautomake
появляется в макросеAC_OUTPUT
, то для нее цель создается автоматически.
Скрипты могут быть установлены в каталогиbindir
,sbindir
,libexecdir
илиpkgdatadir
.
Заголовочные файлы
Заголовочные файлы определяются семейством переменных `HEADERS'. Обычно заголовочные файлы не устанавливаются, так что в большинстве случаев будет определена переменнаяnoinst_HEADERS
.
Все заголовочные файлы должны быть перечислены; отсутствующие файлы не будут включены в дистрибутив. Часто лучше всего перечислить неустанавливаемые заголовочные файлы вместе с другими исходными текстами программы. See section Построение программ и библиотек. Заголовочные файлы, перечисленные в переменных `_SOURCES', не надо указывать ни в одной из переменных `_HEADERS'.
Заголовочные файлы могут быть установлены в каталогиincludedir
,oldincludedir
илиpkgincludedir
.
Файлы данных, не зависимые от архитектуры машины
Automake поддерживает установку различных файлов данных, используя семейство переменных `DATA'.
Такие данные могут быть установлены в каталогиdatadir
,sysconfdir
,sharedstatedir
,localstatedir
илиpkgdatadir
.
По умолчанию файлы данных не включаются в дистрибутив.
Вот как Automake устанавливает свои вспомогательные файлы данных:
pkgdata_DATA = clean-kr.am clean.am ...
Построение исходных текстов
Время от времени файлы, которые могли бы быть названы исходными (например, файлы `.h' в C), в действительности порождаются из других файлов. Такие файлы должны быть перечислены в переменнойBUILT_SOURCES
.
Построенные исходные тексты по умолчанию не компилируются. Для компиляции исходных текстов вы должны явно указать их в других переменных `_SOURCES'.
Заметьте, что в некоторые случаях,BUILT_SOURCES
будет работать достаточно странным образом. Для того, чтобы построение исходных текстов работало с автоматическим отслеживанием зависимостей, файл `Makefile' должен зависеть от$(BUILT_SOURCES)
. При этом такие исходные тексты могут начать пересобираться в самый неудобный момент.
Другие утилиты GNU
Поскольку Automake в основном предназначен для генерации файлов `Makefile.in' для использования в программах проекта GNU, то он старается взаимодействовать с другими утилитами GNU.
Emacs Lisp
Automake предоставляет некоторую поддержку Emacs Lisp. Основная переменная `LISP' используется для хранения списка файлов `.el'. Возможными префиксами являются `lisp_' и `noinst_'. Заметьте, что если определена переменнаяlisp_LISP
, то в `configure.in' должен использоваться макросAM_PATH_LISPDIR
(see section Макросы Autoconf, поставляемые с Automake).
По умолчанию Automake будет производить байт-компиляцию всех исходных текстов Emacs Lisp, используя Emacs, который найден при выполнении макросаAM_PATH_LISPDIR
. Если вы не хотите производить байт-компиляцию, то просто определите переменнуюELCFILES
с пустым значением. Байт-скомпилированные файлы Emacs Lisp не переносимы между разными версиями Emacs, так что отключите компиляцию, если ожидаете, что целевые машины будут иметь несколько разных версий Emacs. К тому же, многие пакеты на самом деле работают после байт-компиляции не лучше. Однако мы рекомендуем вам оставить эту возможность разрешенной. Серверам с такими странными установками лучше дать возможность справиться самим, чем затруднять установку для остальных людей.
Gettext
Если в файле `configure.in' есть макросAM_GNU_GETTEXT
, то Automake включает поддержку GNU gettext, системы каталогов сообщений для интернационализации (see section `GNU Gettext' in Утилиты GNU gettext).
Поддержкаgettext
в Automake требует добавления в пакет двух подкаталогов, `intl' и `po'. Automake проверяет, что эти подкаталоги существуют и упомянуты в переменнойSUBDIRS
.
Также Automake проверяет, что определение переменнойALL_LINGUAS
в файле `configure.in' соответствует в точности всем файлам `.po', ни больше, ни меньше.
Guile
Automake обеспечивает некоторую автоматическую поддержку написания модулей Guile. Automake включит поддержку Guile, если в `configure.in' используется макросAM_INIT_GUILE_MODULE
.
В настоящее время поддержка Guile означает, что при выполнении макросаAM_INIT_GUILE_MODULE
будет:
- Запущен макрос
AM_INIT_AUTOMAKE
. - Запущен макрос
AC_CONFIG_AUX_DIR
с параметром `..'.
Когда Guile станет лучше поддерживать модули, нет никаких сомнений, что их поддержка в Automake будет развиваться.
Libtool
Automake предоставляет поддержку GNU Libtool (see section `Introduction' in The Libtool Manual) с основной переменной `LTLIBRARIES'. See section Построение разделяемых библиотек.
Java
Automake предоставляет минимальную поддержку компиляции файлов Java, используя основную переменную `JAVA'.
Все файлы `.java', перечисленные в переменной `_JAVA', будут скомпилированы с помощьюJAVAC
. По умолчанию, файлы с расширением `.class' не включаются в дистрибутив.
В настоящее время Automake принуждает к тому, что в каждом `Makefile.am' может быть использована только одна переменная `_JAVA'. Причиной этого ограничения является то, что невозможно узнать, какие файлы `.class' будут сгенерированы из файлов `.java' -- так что может быть невозможным узнать, какие файлы и куда необходимо устанавливать.
Построение документации
В настоящее время Automake обеспечивает поддержку Texinfo и страниц руководства.
Texinfo
Если текущий каталог содержит исходный текст Texinfo, то вы должны указать это с помощью основной переменной `TEXINFOS'. В общем случае файлы Texinfo могут быть преобразованы в формат info, и поэтому макросinfo_TEXINFOS
является наиболее часто используемым. Заметьте, что имена файлов исходных текстов Texinfo должны заканчиваться на `.texi' или `.texinfo'.
Если файл `.texi' включает в себя с помощью `@include' файл `version.texi', то он будет сгенерирован автоматически. Файл `version.texi' определяет три макроса Texinfo, на которые вы можете ссылаться:EDITION
,VERSION
иUPDATED
. Первые два макроса содержат номер версии вашего пакета (но для ясности они разделены на две части); последний макрос содержит дату изменения основного файла. Поддержка `version.texi' требует наличия программыmdate-sh
; эта программа поставляется с Automake и автоматически включается при запускеautomake
с ключом--add-missing
.
Иногда файл info зависит от более чем одного файла `.texi'. Например, в пакете GNU Hello, файл `hello.texi' включает файл `gpl.texi'. Вы можете сообщить об этих зависимостях Automake, используя переменнуюtexi_TEXINFOS
. Вот как это делается в GNU Hello:
info_TEXINFOS = hello.texi hello_TEXINFOS = gpl.texi
По умолчанию Automake требует наличия файла `texinfo.tex' в том же каталоге, что и исходные файлы Texinfo. Однако, если вы используете в файле `configure.in' макросAC_CONFIG_AUX_DIR
(see section `Hахождение ввода `configure'' in Руководство Autoconf), то `texinfo.tex' ищется в заданном каталоге. Automake устанавливает файл `texinfo.tex', если задан ключ `--add-missing'.
Если в вашем пакете файлы Texinfo находятся в нескольких каталогах, то вы можете использовать переменнуюTEXINFO_TEX
для того, чтобы сообщить Automake, где найти файл `texinfo.tex'. Значением этой переменной должен быть относительный путь от текущего файла `Makefile.am' к файлу `texinfo.tex':
TEXINFO_TEX = ../doc/texinfo.tex
Ключ `no-texinfo.tex' может быть использован для отмены требования наличия файла `texinfo.tex'. Однако предпочтительней использование переменнойTEXINFO_TEX
, поскольку это позволяет работать целиdvi
.
Automake создает цельinstall-info
; она, очевидно, используется некоторыми. По умолчанию страницы info устанавливаются при выполнении `make install'. Это поведение может быть изменено, используя ключno-installinfo
.
Страницы руководства
Пакет также может включать в свой состав справочные страницы (но взгляните на стандартны GNU за информацией о них, section `Man Pages' in The GNU Coding Standards). Страницы руководства объявляются с помощью основной переменной `MANS'. Обычно используется макросman_MANS
. Справочные страницы автоматически устанавливаются в зависимости от расширения файлов в соответствующие подкаталогиmandir
. Они не включаются в состав дистрибутива автоматически.
По умолчанию страницы руководства устанавливаются при выполнении `make install'. Однако, поскольку проекты GNU не требуют наличия справочных страниц, то многие разработчики проектов не расходуют время на поддержание справочных страниц в обновленном состоянии. В этих случаях опцияno-installman
отключит установку справочных страниц по умолчанию. Пользователь все равно будет иметь возможность явно установить справочные страницы, используя команду `make install-man'.
Вот как документация обрабатывается в пакете GNUcpio
(который включает в себя как документацию в Texinfo, так и справочные страницы):
info_TEXINFOS = cpio.texi man_MANS = cpio.1 mt.1 EXTRA_DIST = $(man_MANS)
Исходные тексты Texinfo и страницы info считаются исходными файлами и включаются в состав дистрибутива.
В настоящее время страницы руководства не рассматриваются как исходные файлы, потому что зачастую они генерируются автоматически. Именно поэтому они и не включаются автоматически в состав дистрибутива.
Что будет установлено
Automake обрабатывает установку вашей программы после компиляции. Всё перечисленное вPROGRAMS
,SCRIPTS
,LIBRARIES
,LISP
,DATA
иHEADERS
автоматически устанавливается на соответствующие места.
Automake также обрабатывает установку указанных страниц info и страниц руководства.
В том случае, когда программа установки устанавливает пакет на несколько машин с общей структурой каталогов, Automake создает отдельные целиinstall-data
иinstall-exec
-- они позволяют установить машино-независимые части только один раз. Цельinstall
зависит от обоих этих целей.
Automake также создает цельuninstall
, цельinstalldirs
и цельinstall-strip
.
Также можно расширить этот механизм определением целиinstall-exec-local
илиinstall-data-local
. Если эти цели определены, то они будут запущены при выполнении `make install'.
Переменные, использующие стандартные префиксы каталогов `data', `info', `man', `include', `oldinclude', `pkgdata' или `pkginclude' (например, `data_DATA') будут устанавливаться при выполнении цели `install-data'.
Переменные, использующие стандартные префиксы каталогов `bin', `sbin', `libexec', `sysconf', `localstate', `lib' или `pkglib' (например, `bin_PROGRAMS'), устанавливаются целью `install-exec'.
Любые переменные, использующие определенные пользователем префиксы каталогов со словом `exec' в имени (например, `myexecbin_PROGRAMS' устанавливаются целью `install-exec'. Все другие определенные пользователем префиксы устанавливаются целью `install-data'.
Automake генерирует поддержку переменной `DESTDIR' во всех правилах установки. Переменная `DESTDIR' используется в процессе выполнения `make install' для перемещения устанавливаемых объектов в область установки. К каждому объекту и пути добавляется значение переменной `DESTDIR' до того, как быть скопированным в область установки. Вот пример типичного использования DESTDIR:
make DESTDIR=/tmp/staging install
Это помещает устанавливаемые объекты в дерево каталогов, которое создано в каталоге `/tmp/staging'. Если устанавливаются файлы `/gnu/bin/foo' и `/gnu/share/aclocal/foo.m4', то вышеприведенная команда установит `/tmp/staging/gnu/bin/foo' и `/tmp/staging/gnu/share/aclocal/foo.m4'.
Это свойство часто используется для построения пакетов и установок. Для получения дополнительной информации смотрите section `Makefile Conventions' in The GNU Coding Standards.
Что будет удалено
Стандарты GNU Makefile определяют несколько правил удаления временных файлов.
Обычно Automake сам может определить, какие файлы могут быть удалены. Конечно, Automake также распознает некоторые переменные, определенные для указания дополнительных файлов, которые должны быть удалены. Этими переменными являютсяMOSTLYCLEANFILES
,CLEANFILES
,DISTCLEANFILES
иMAINTAINERCLEANFILES
.
Что войдет в дистрибутив
Цельdist
, создаваемая в генерируемом файле `Makefile.in', может быть использована для создания сжатого файлаtar
с дистрибутивом. Имя tar-файла основывается на переменных `PACKAGE' и `VERSION'; а точнее, он называется `package-version.tar.gz'. Вы можете использовать переменнуюmake
с именем `GZIP_ENV' для того, чтобы управлять запуском gzip. Значением по умолчанию является строка `--best'.
В большинстве случаев файлы, необходимые для дистрибутива, автоматически находятся Automake: все файлы исходных текстов автоматически включаются в состав дистрибутива, так же как и все файлы `Makefile.am' и `Makefile.in'. Automake также имеет встроенный список часто используемых файлов, которые автоматически включаются в состав дистрибутива, если они существуют в текущем каталоге. Этот список показывается при выполнении `automake --help'. Также автоматически включаются файлы, которые читает программаconfigure
(например, файлы исходных текстов, относящиеся к файлам, указанным при запуске макросаAC_OUTPUT
).
Все равно, иногда существуют файлы, которые должны входить в состав дистрибутива, но которые не смогли попасть в автоматически созданный список. Эти файлы должны быть перечислены в переменнойEXTRA_DIST
. Вы можете указывать в переменнойEXTRA_DIST
файлы из подкаталогов. Вы можете также указывать каталоги: в этом случае весь каталог будет рекурсивно скопирован в дистрибутив.
Если вы определили переменнуюSUBDIRS
, то Automake будет рекурсивно включать подкаталоги в состав дистрибутива. ЕслиSUBDIRS
определен условно (see section Условные операторы), то Automake включит в дистрибутив все подкаталоги, которые могут появиться вSUBDIRS
. Если вам необходимо указать список каталогов условно, то вы можете задать в переменнойDIST_SUBDIRS
точный список подкаталогов, которые необходимо включить в дистрибутив.
Время от времени полезно иметь возможность изменить дистрибутив до того, как он будет упакован. Если существует цельdist-hook
, то она запускается после создания каталога с дистрибутивом, но до того, как создается файл `.tar' (или `.shar'). Это применяется для распространения файлов из подкаталогов, в которых было бы избыточным создавать файл `Makefile.am':
dist-hook: mkdir $(distdir)/random cp -p $(srcdir)/random/a1 $(srcdir)/random/a2 $(distdir)/random
Automake также создает цельdistcheck
, которая может помочь убедиться в том, что дистрибутив работает.distcheck
создает дистрибутив и пытается его построить с помощьюVPATH
.
Поддержка комплектов тестирования
Automake поддерживает два вида комплектов тестирования.
Если определена переменнаяTESTS
, то ее значение является списком программ, которые надо запустить для проведения тестирования. Программы могут быть либо унаследованными объектами, либо исходными объектами; сгенерированное правило будет искать их и вsrcdir
, и в `.'. Программы, которые нуждаются в файлах данных должны искать их в каталогеsrcdir
(который указан в одноименных переменных среды и make), так что они будут работать при построении в отдельном каталоге (see section `Каталоги сборки' in Руководство Autoconf), и в частности для целиdistcheck
(see section Что войдет в дистрибутив).
Количество сбоев будет напечатано в конце запуска. Если заданная тестовая программа заканчивает работу с кодом 77, то ее результаты игнорируется в завершающем подсчете. Это свойство позволяет игнорировать непереносимые тесты, в тех случаях когда они не имеют значения.
ПеременнаяTESTS_ENVIRONMENT
может быть использована для установки переменных среды для запускаемых тестов; при выполнении этого правила переменная средыsrcdir
устанавливается. Если все ваши тестовые программы являются скриптами, то вы также можете установить переменнуюTESTS_ENVIRONMENT
для вызова командного процессора (например, `$(SHELL) -x'); это свойство может быть полезно при отладке тестов.
Если в переменнойAUTOMAKE_OPTIONS
указано `dejagnu', то предполагается использования комплекта тестов на базеdejagnu
. Значение переменнойDEJATOOL
передается как аргумент ключа--tool
программыruntest
; по умолчанию это имя пакета.
ПеременнаяRUNTESTDEFAULTFLAGS
содержит флаги для ключей--tool
и--srcdir
, которые по умолчанию передаются dejagnu; в случае необходимости это поведение может быть изменено.
ПеременныеEXPECT
,RUNTEST
иRUNTESTFLAGS
могут быть переопределены для подстановки специфичных для проекта значений. Например, если вам необходимо сделать это для тестирования toolchain компилятора, поскольку значения по умолчанию не должны содержать имена машины и цели.
В других случаях тестирование производится через цель `make check'.
Изменение поведения Automake
Различные возможности Automake могут контролироваться ключами в файле `Makefile.am'. Такие ключи перечислены в специальной переменной с именемAUTOMAKE_OPTIONS
. В настоящее время распознаются следующие ключи:
gnits
gnu
foreign
cygnus
-
Устанавливает соответствующий уровень ограничений. Ключ
gnits
также предполагает наличие ключейreadme-alpha
иcheck-news
. ansi2knr
path/ansi2knr
- Включает автоматическую де-ANSI-фикацию. See section Автоматическая де-ANSI-фикация. Если в начале строки указан путь, то сгенерированный `Makefile.in' будет искать программу `ansi2knr' в указанном каталоге. В общем случае путь должен быть относительным путем к другому каталогу в данном пакете (хотя в настоящее время Automake не делает проверку этого пути).
check-news
-
Вызывает сбой
make dist
до тех пор, пока номер текущей версии не появится в нескольких первых строках файла `NEWS'. dejagnu
-
Заставляет генерировать специфичные для
dejagnu
правила. See section Поддержка комплектов тестирования. dist-shar
-
Создает цель
dist-shar
также как и обычную цельdist
. Эта новая цель будет создавать shar-архив дистрибутива. dist-zip
-
Создает цель
dist-zip
также как и обычную цельdist
Эта новая цель будет создавать zip-архив дистрибутива. dist-tarZ
-
Создает цель
dist-tarZ
также как и обычную цельdist
target. Эта новая цель будет создавать сжатый tar-архив дистрибутива; предполагается использование традиционных программtar
иcompress
. Предупреждение: Если вы в действительности используетеGNU tar
, то созданный архив может содержать непереносимые конструкции. no-dependencies
- Этот ключ похож на ключ командной строки `--include-deps', но полезен в тех ситуациях, где вы не имеете необходимости в автоматическом отслеживание зависимостей See section Автоматическое отслеживание зависимостей. В этом случае можно запретить автоматическое отслеживание зависимостей.
no-installinfo
-
Сгенерированный `Makefile.in' не будет по умолчанию обрабатывать и устанавливать страницы info. Однако, цели
info
иinstall-info
все равно будут доступны. Этот ключ запрещен при уровне ограничения `GNU' и выше. no-installman
-
Сгенерированный `Makefile.in' не будет по умолчанию устанавливать справочные страницы. Однако, цель
install-man
все равно будет доступна для использования. Этот ключ запрещен при уровне ограничения `GNU' и выше. no-texinfo.tex
- Отменяет требования на наличие файла `texinfo.tex', даже если файлы texinfo присутствуют в этом каталоге.
readme-alpha
- Если этот выпуск является выпуском в стадии альфа и существует файл `README-alpha', то он будет добавлен в дистрибутив. Если задан этот ключ, то номер версии может быть представлен в одной из двух форм. Первая форма выглядит следующим образом: `MAJOR.MINOR.ALPHA', где каждый элемент является числом; заключительная точка и номер должны быть опущены для не-альфа выпусков. Вторая форма выглядит следующим образом: `MAJOR.MINORALPHA', где ALPHA это буква; они должны быть убраны для не-альфа выпусков.
- version
- Может быть указан номер версии (например, `0.30'). Если Automake не новее указанной версии, то будет запрещено создание `Makefile.in'.
Нераспознанные ключи оцениваютсяautomake
.
Различные правила
Существует несколько правил, которые нельзя отнести к вышеперечисленным пунктам.
Взаимодействие с etags
Automake при некоторых обстоятельствах будет генерировать правила для генерации файлов `TAGS', которые используются с GNU Emacs.
Если присутствует любой исходный код на C, C++ или Fortran 77, то для каталога будут созданы целиtags
иTAGS
.
В каталоге верхнего уровня пакета, состоящего из нескольких каталогов цельtags
создаст файл, при выполнении которой будет создавать файл `TAGS', включающий все файлы `TAGS' из подкаталогов.
Также, если определена переменнаяETAGS_ARGS
, то будет сгенерирована цельtags
. Эта переменная предназначена для каталогов, которые содержат исходные файлы, тип которых не понимаетetags
, но которые можно обработать.
Вот как Automake создает тэги для своих исходных файлов, а также для узлов файла Texinfo:
ETAGS_ARGS = automake.in --lang=none \ --regex='/^@node[ \t]+\([^,]+\)/\1/' automake.texi
Если вы добавили имена файлов к переменной `ETAGS_ARGS', то вы вероятно захотите установить переменную `TAGS_DEPENDENCIES'. Содержимое этой переменной будет полностью добавлено к зависимости для целиtags
.
Automake также сгенерирует цельID
, которая будет запускать программуmkid
на исходных файлах. Это поддерживается при использовании покаталожной основы.
Обработка новых расширений файлов
Иногда полезно ввести новое неявное правило для обработки новых типов файлов, о которых Automake ничего не знает. Если вы сделали это, то вы должны уведомить GNU Make о новых суффиксах. Это может быть сделано помещением списка новых суффиксов в переменнуюSUFFIXES
.
Например, в настоящее время Automake не обеспечивает никакой поддержки Java. Если вы напишите макрос для генерации файлов `.class' из файлов с исходными текстами `.java', то вы также должны добавить эти суффиксы в список.
SUFFIXES = .java .class
Включение дополнительных файлов
Для включения других файлов (может быть для подключения общих правил) поддерживается следующий синтаксис:
include ($(srcdir)|$(top_srcdir))/filename
Используя файлы в текущем каталоге:
include $(srcdir)/Makefile.extra
include Makefile.generated
Используя файлы в каталоге верхнего уровня:
include $(top_srcdir)/filename
Условные операторы
Automake поддерживает простой тип условных операторов.
До использования условного оператора, вы должны определить его в файлеconfigure.in
используя макросAM_CONDITIONAL
(see section Макросы Autoconf, поставляемые с Automake). МакросуAM_CONDITIONAL
передается два аргумента.
Первым аргументом дляAM_CONDITIONAL
является имя условного оператора. Им должны быть простая строка, начинающаяся с буквы и содержащая только буквы, цифры и знаки подчеркивания.
Вторым аргументомAM_CONDITIONAL
является условие для командного процессора, которое можно использовать в оператореif
. Условие оценивается при запускеconfigure
.
Условные операторы обычно зависят от ключей, которые использует пользователь при запуске скриптаconfigure
. Вот пример того, как написать условный оператор, который возвращает истинное выражение, если пользователь использовал ключ `--enable-debug'.
AC_ARG_ENABLE(debug, [ --enable-debug Turn on debugging], [case "${enableval}" in yes) debug=true ;; no) debug=false ;; *) AC_MSG_ERROR(bad value ${enableval} for --enable-debug) ;; esac],[debug=false]) AM_CONDITIONAL(DEBUG, test x$debug = xtrue)
Вот пример использования этого условного оператора в файле `Makefile.am':
if DEBUG DBG = debug else DBG = endif noinst_PROGRAMS = $(DBG)
Этот тривиальный пример также мог быть создан используя макрос EXTRA_PROGRAMS (see section Построение программ).
В оператореif
вы можете тестировать только одну переменную. Операторelse
может не использоваться. Условные операторы могут быть вложены на любую глубину.
Заметьте, что условные операторы в Automake не похожи на условные операторы в GNU Make. Условные операторы Automake проверяются во время конфигурации, при выполнении скрипта `configure', и воздействуют на преобразование файла `Makefile.in' в файл `Makefile'. Они основываются на ключах, передаваемых скрипту `configure' и на результатах, определяемых во время выполнения `configure'. Условные операторы GNU Make проверяются при выполненииmake
и основываются на переменных, передаваемых программе make, или определенных в `Makefile'.
Условные операторы Automake будут работать с любой программой make.
Эффект использования ключей --gnu
и --gnits
Ключ `--gnu' (или `gnu' в переменной `AUTOMAKE_OPTIONS') заставляетautomake
выполнить проверку следующих вещей:
- Файлы `INSTALL', `NEWS', `README', `COPYING', `AUTHORS' и `ChangeLog' должны находится в каталоге верхнего уровня пакета.
- Ключи `no-installman' и `no-installinfo' запрещены.
Заметьте, что в будущем этот ключ будет расширен для проведения дополнительных проверок; рекомендуется ознакомиться с точными требованиями стандартов GNU. Также ключ `--gnu' может требовать наличия нестандартных программ GNU для использования в целях, используемых человеком, который сопровождает данный пакет; например, в будущем может потребоваться программаpathchk
для работы цели `make dist'.
Ключ `--gnits' делает то же самое, что и ключ `--gnu', а также проверяет следующие вещи:
- `make dist' выполнит проверку того, что файл `NEWS' обновлен для новой версии.
- Наличие файла `COPYING.LIB' запрещено. По видимому LGPL считается несостоявшимся экспериментом.
- Проверяется `VERSION' на то, что его формат соответствует стандартам Gnits.
- Если `VERSION' указывает на то, что этот выпуск является альфа-версией, и в каталоге верхнего уровня находится файл `README-alpha', то этот файл будет включен в дистрибутив. Это делается в режиме `--gnits', и ни в каких других режимах, поскольку только в этом режиме есть ограничения формата номера версии, и только в этом режиме Automake может автоматически определить, нужно ли включать файл `README-alpha'.
- Требуется наличие файла `THANKS'.
Эффект использования ключа --cygnus
Cygnus Solutions применяет немного другие правила о том как будет конструироваться файл `Makefile.in'. Передача ключа `--cygnus' дляautomake
вызовет то, что сгенерированный `Makefile.in' будет соответствовать правилам Cygnus.
Вот точное описания действия ключа `--cygnus':
- Файлы Info всегда создаются в каталоге, где происходит построение, а не в каталоге с исходными текстами.
- Не требуется наличие файла `texinfo.tex', если есть файлы с исходными текстами Texinfo. Предполагается, что файл будет предоставлен, но в том месте, где Automake не сможет найти его. Это предположение является следствием того, как обычно поставляются пакеты Cygnus.
- При выполнении `make dist' файлы будут искаться в каталоге, где происходило построение, а также в каталоге с исходными текстами. Это требуется для того, чтобы файлы info были помещены в дистрибутив.
- Поиск некоторые утилиты будет производится в каталогах. где происходит сборка, а также в каталогах, указанных в переменной среды `PATH' пользователя. Этими утилитами являются
runtest
,expect
,makeinfo
иtexi2dvi
. - Подразумевается использование ключа
--foreign
. - Подразумевается использование ключей `no-installinfo' и `no-dependencies'.
- Требуются макросы `AM_MAINTAINER_MODE' и `AM_CYGWIN32'.
- Цель
check
не зависит от целиall
.
Люди, сопровождающие программы GNU рекомендуют использовать уровень ограничений `gnu', а не режим Cygnus.
Когда не хватает возможностей Automake
Неявная семантика копирования Automake означает, что много проблем может быть решено простым добавлением некоторых целей дляmake
и правил для `Makefile.in'. Automake будет игнорировать эти добавления.
Есть некоторые предостережения для этих работ. Хотя вы можете переопределить цели, уже используемые Automake, но часто это просто неразумно, особенно в каталоге верхнего уровня пакета не относящегося к типу flat. Однако, вы можете указать в вашем файле `Makefile.in' различные полезные цели, имеющие суффикс `-local'. Automake дополнит стандартные цели этими целями пользователя.
К целям, поддерживающим локальную версию относятся:all
,info
,dvi
,check
,install-data
,install-exec
,uninstall
и разные целиclean
(mostlyclean
,clean
,distclean
иmaintainer-clean
). Заметьте, что в этом списке нет целейuninstall-exec-local
илиuninstall-data-local
; есть толькоuninstall-local
. Это не имеет значения для удаления только данных или исполняемых файлов.
Например, вот один из способов установить файл в каталог `/etc':
install-data-local: $(INSTALL_DATA) $(srcdir)/afile /etc/afile
Некоторые цели также имеют способ запускать другие цели после выполнения всех своих действий, это называется ловушка (hook). Ловушка называется по имени цели, с добавлением суффикса `-hook'. Целями, разрешающими использование ловушек являютсяinstall-data
,install-exec
,dist
иdistcheck
.
Например, вот как создать жесткую ссылку на установленную программу:
install-exec-hook: ln $(bindir)/program $(bindir)/proglink
Распространение файлов `Makefile.in'
Automake не налагает никакие ограничения на распространение готовых файлов `Makefile.in'. Мы поощряем авторов к распространению их работ под действием правил подобных GPL, но не требуем использовать Automake.
Некоторые из файлов, которые могут быть автоматически установлены при использовании ключа командной строки--add-missing
могут вызвать ошибку при использовании GPL; просмотрите каждый файл для получения информации.
Некоторые идеи на будущее
Возможности, которые могут появиться в будущем:
- Поддержка HTML.
- Вывод будет очищен. Например, в файл `Makefile.in' будут вставляться только используемые переменные.
- Будет добавлена поддержка для автоматической перекодировки дистрибутива. Эта возможность предназначена для того, чтобы сопровождающий мог использовать удобный для него набор символов, а дистрибутив использовал бы Unicode или ISO 10646 с кодировкой UTF-8.
- Изменения в Guile. Этого не случится в ближайшем будущем, но когда-нибудь обязательно произойдет.