Automake linux как использовать

Обновлено: 02.07.2024

Для определения разной информации о данном пакете Automake сканирует файл `configure.in' . Также ему требуется определение некоторых макросов и переменных autoconf в файле `configure.in' . Automake также использует информацию из файла `configure.in' для определения параметров вывода.

Для того, чтобы облегчить сопровождение, Automake предоставляет некоторые макросы Autoconf. Эти макросы могут быть автоматически помещены в ваш файл `aclocal.m4' при использовании программы aclocal .

  • Определить переменные 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 находятся в среде в которой производится сборка пакета. Вот как это сделано:

Вот список других макросов, которые требуются Automake, но которые не запускаются макросом AM_INIT_AUTOMAKE :

AC_OUTPUT Automake использует этот макрос для определения того, какие файлы необходимо создавать (see section `Создание выходных файлов' in Руководство Autoconf ). Файлы с именем `Makefile' из этого списка считаются файлами для программы make . Остальные файлы интерпретируются по разному. В настоящее время отличие состоит лишь в том, что файлы `Makefile' удаляются make distclean , тогда как другие файлы удаляются командой make clean .

Также 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 .

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 Выдает номер версии и заканчивает работу.

Программа aclocal сама по себе ничего не знает о каких-либо макросах, поэтому ее очень легко расширять, создавая свои собственные макросы.

Эта возможность в основном используется библиотеками, которые хотят предоставить собственные макросы Autoconf для использования другими программами. Например, библиотека gettext предоставляет макрос AM_GNU_GETTEXT , который должен быть использован любым пакетом, использующим gettext . При установке библиотеки устанавливается также этот макрос, чтобы программа aclocal смогла его найти.

Файл макросов должен быть серией вызовов AC_DEFUN . Программа aclocal также понимает директиву AC_REQUIRE , так что вполне безопасно помещать каждый макрос в отдельный файл. See section `Hеобходимые макросы' in Руководство Autoconf , и section `Макроопределения' in Руководство Autoconf .

Имя файла макросов должно оканчиваться на `.m4' . Такие файлы должны устанавливаться в каталог `$(datadir)/aclocal' .

Прежде чем разбираться с вопросом автоматизации сборки своей копии программы “hello, world!” будьте уверены, что вы можете её написать. В любом случае, вот вам пример этой программы на языке Си:

Создание configure.in

Те, кто внимательно прочитал всю, или хотя бы бОльшую часть мануала (см. раздел Ссылки), без особых усилий смогут самостоятельно создать configure.in. Для таких же новичков как мы была создана программа autoscan, которая сканирует текущий каталог и создаёт заготовку для будущего configure.in файла. После запуска autoscan найдите в текущем каталоге файл configure.scan

Вот пример configure.scan, который получился у меня:

Переименуйте этот файл в configure.in и отредактируйте.

Первым макросом идёт AC_PREREQ. Он указывает, что требуется autoconf версии 2.59 и никак не меньше. В случае, если мы попытаемся создать configure скрипт с помощью autoconf более младшей версии мы получим ошибку.

Любой configure.in должен начинаться с макроса AC_INIT и заканчиваться макросом AC_OUTPUT. В качестве аргументов AC_INIT принимает название программы, её версию, и, как необязательный аргумент, ваш email-адрес, куда пользователи смогут отправлять отчеты об ошибках.

Не забудьте изменить значения по умолчанию для этих параметров! AC_CONFIG_SRCDIR принимает в качестве параметра путь к файлу, с которого начинается сборка. Т.к. в нашей программе файл пока всего один, то именно он и является аргументом этого макроса.

FIXME

AC_CONFIG_HEADER можете смело удалить, т.к. для программы уровня “hello world!” он не нужен.( Использование файла config.h?) AC_PROG_CC ищет компилятор для языка Си и выставляет переменную CC соответствующим образом. AC_OUTPUT заканчивает файл configure.in и заставляет autoconf начать генерацию configure-скрипта.

Более подробное описание для всех этих макросов вы можете найти в разделе ссылок внизу 1) .

После всех правок я получил следующий configure.in:

Теперь запустите программу autoconf, а после получившийся configure скрипт:

Создание Makefile.am и src/Makefile.am

Но работающего скрипта configure недостаточно. Наша цель, чтобы программа также собиралась по команде make и устанавливалась по make install. За это отвечает уже automake. Для него нам потребуется создать два файла: корневой Makefile.am и Makefile.am для каталога src/, в котором и должен располагаться файл hello.c

Для нашей программы они очень простые:

Объясню подробнее назначение добавленных макросов: AM_INIT_AUTOMAKE сообщает autoconf о том, что мы намерены использовать automake. AC_CONFIG_FILES говорит, что из указанных файлов, с постфиксом .in, нужно создать результирующие файлы с приведёнными именами. Иными словами, во время вызова configure из файла Makefile.in будет создаваться Makefile. (А Makefile.in создаётся автоматически из Makefile.am)

FIXME

использование дополнительных аргументов макроса AM_INIT_AUTOMAKE для передачи аргументов программе automake

Применение «авто-утилит» позволяет сделать проект архитектурно независимым и свести к минимуму процесс написания Makefile.

Пример маленького проекта, написанного на языке Си:

1. Создадим директорию для проекта test

2. В директории test создадим директорию src

3. В src создадим файл main.c

4. В src создадим файл test.c

5. В src создадим файл main.h

Для сборки такого проекта можно вручную написать Makefile, а лучше использовать автотулсы, которые сгенерируют его автоматически.

Для автоматического создания Makefile нужно всего лишь два файла-шаблона - Makefile.am и configure.in. Причем первый пишется вручную, а второй генерируется автоматически и правится.

В корневой директории проекта (в директории test) создаем файл Makefile.am следующего содержания:

Ключевое слово SUBDIRS означает, что исходные файлы для сборки находятся в данной директории.

Также нужно создать Makefile.am в директории src следующего содержания:

Ключевое слово bin_PROGRAMS определяет имя исполняемого файла, который будет получен в результате сборки.

Ключевое слово hello_SOURCES используется для перечисления имен файлов исходного кода, из которых будет создаваться файл «hello».

Если требуется подключить явным образом какую-либо библиотеку, то нужно добавить следующую строку:

Таким образом подключается библиотека lpthread.

Если требуется явным образом указать какой-то флаг, это делается так:

В последнем случае добавляется путь, где искать библиотеку. (точка означает в текущем каталоге).

Если требуется подключить какую-либо директорию с хедерами, то нужно добавить:

Всё, этого достаточно.

configure.in создадим с помощью утилиты autoscan. Эта программа создает файл configure.scan, который и является прототипом configure.in.

Правим configure.scan и затем переименовываем его в configure.in :

Макрос AC_INIT. В качестве параметров передаются — имя программы, её версия, email.

Макрос AC_CONFIG_SRCDIR. В качестве параметра передаётся - путь к файлу, с которого начинается сборка.

Макрос AM_INIT_AUTOMAKE включает поддержку Automake

Макрос AC_PROG_CC проверяет наличие и работоспособности в системе Си компилятора.

Макрос AC_OUTPUT служит для указания Makefile, которые будут созданы в результате исполнения скрипта configure.

ВСЁ! Теперь выполняем следующую последовательность действий и Makefile готов.

aclocal - создает aclocal.m4.

autoconf - утилита создает скрипт configure в соответствии с макросами, указанными в файле `configure.in'.

autoheader — создает заголовочный файл (config.h.in).

touch NEWS README AUTHORS ChangeLog (эти файлы нужны для automake )

Давайте предположим, что мы только что закончили писать zardoz --- программу, от которой у всех кружится голова. Вы использовали Autoconf для обеспечения переносимости, но ваш файл `Makefile.in' был написан бессистемно. Вы же хотите сделать его пуленепробиваемым, и поэтому решаете использовать Automake.

Сначала вам необходимо обновить ваш файл `configure.in' , чтобы вставить в него команды, которые необходимы для работы automake . Проще всего для этого добавить строку AM_INIT_AUTOMAKE сразу после AC_INIT :

Поскольку ваша программа не имеет никаких осложняющих факторов (например, она не использует gettext и не будет создавать разделяемые библиотеки), то первая стадия на этом и заканчивается. Это легко!

Теперь вы должны заново создать файл `configure' . Но для этого нужно сказать autoconf , где найти новые макросы, которые вы использовали. Для создания файла `aclocal.m4' удобнее всего будет использовать программу aclocal . Но будьте осторожны. у вас уже есть `aclocal.m4' , поскольку вы уже написали несколько собственных макросов для вашей программы. Программа aclocal позволяет вам поместить ваши собственные макросы в файл `acinclude.m4' , так что для сохранения вашей работы просто переименуйте свой файл с макросами, а уж затем запускайте программу aclocal :

Теперь можно запустить automake --add-missing , чтобы создать файл `Makefile.in' , используя дополнительные файлы, и вот, все готово!

Конечно же, GNU Hello использует больше возможностей, чем традиционная двухстроковая программа: GNU Hello работает с разными языками, выполняет обработку ключей командной строки, имеет документацию и набор тестов. GNU Hello является глубоким пакетом.

Вот файл `configure.in' из пакета GNU Hello:

Макросы `AM_' предоставляются Automake (или библиотекой Gettext); остальные макросы является макросами Autoconf.

Файл `Makefile.am' в корневом каталоге выглядит следующим образом:

Как видите, вся работа выполняется в подкаталогах.

Каталоги `po' и `intl' автоматически создаются программой gettextize ; они не будут обсуждаться в этом документе.

В файле `doc/Makefile.am' мы видим строки:

Этого достаточно для сборки, установки и распространения руководства GNU Hello.

Вот содержимое файла `tests/Makefile.am' :

Скрипт `hello' создается configure , и является единственным тестовым случаем. При выполнении make check будет запущен именно этот тест.

В заключение мы приведем содержимое `src/Makefile.am' , где и выполняется вся настоящая работа:

Вот другой, более изощренный пример. Он показывает, как собрать две программы ( ctags и etags ) из одного и того же исходного файла ( `etags.c' ). Самая трудное в том, что каждая компиляция файла `etags.c' требует задания разных флагов для cpp .

Заметьте, что переменная ctags_SOURCES определена как пустая --- при этому не подставляется неявного значения по умолчанию. Для создания etags из файла `etags.o' , однако, используются неявные значения.

Переменная ctags_LDADD используется для вставки `ctags.o' в строку компоновщика. ctags_DEPENDENCIES создается Automake.

Эти явные правила также не работают, если используется де-ANSI-фикация (see section Автоматическая де-ANSI-фикация). Поддержка де-ANSI-фикации требует немного больше работы:

Читайте также: