Содержание
Необходимые пакеты |
---|
autoconf |
automake |
Описание
- В этой заметке описываются шаги, которые должен предпринять разработчик, желающий, чтобы его проект уровня “hello world!” использовал систему сборки autotools: создание своего скрипта configure для проекта,а также генерация Makefile.
Написание программы
Прежде чем разбираться с вопросом автоматизации сборки своей копии программы “hello, world!” будьте уверены, что вы можете её написать. В любом случае, вот вам пример этой программы на языке Си:
#include <stdio.h> int main(void) { printf("Hello, world!\n"); return 0; }
Создание configure.in
Нужно создать файл configure.in, поместив в него необходимые макросы autoconf. После создания этого файла необходимо запустить http://ru.wikipedia.org/wiki/Autoconf для того чтобы сгенерировать скрипт configure.
Те, кто внимательно прочитал всю, или хотя бы бОльшую часть мануала (см. раздел Ссылки), без особых усилий смогут самостоятельно создать configure.in. Для таких же новичков как мы была создана программа autoscan, которая сканирует текущий каталог и создаёт заготовку для будущего configure.in файла. После запуска autoscan найдите в текущем каталоге файл configure.scan
Вот пример configure.scan, который получился у меня:
# -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ(2.59) AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS) AC_CONFIG_SRCDIR([hello.c]) AC_CONFIG_HEADER([config.h]) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT
Переименуйте этот файл в configure.in и отредактируйте.
Все строчки, начинающиеся со знака # являются комментариями. Все комментарии такого вида попадут в генерируемый configure скрипт в неизменном виде. Если же вы хотите, чтобы ваши комментарии не встречались где-либо за рамками configure.in файла, то используйте встроенный макрос m4 — dnl, «который отбрасывает текст вплоть до начала новой строки».
Первым макросом идёт AC_PREREQ. Он указывает, что требуется autoconf версии 2.59 и никак не меньше. В случае, если мы попытаемся создать configure скрипт с помощью autoconf более младшей версии мы получим ошибку.
Любой configure.in должен начинаться с макроса AC_INIT и заканчиваться макросом AC_OUTPUT. В качестве аргументов AC_INIT принимает название программы, её версию, и, как необязательный аргумент, ваш email-адрес, куда пользователи смогут отправлять отчеты об ошибках.
- AC_CONFIG_SRCDIR принимает в качестве параметра путь к файлу, с которого начинается сборка. Т.к. в нашей программе файл пока всего один, то именно он и является аргументом этого макроса.
- AC_CONFIG_HEADER можете смело удалить, т.к. для программы уровня “hello world!” он не нужен.( Использование файла config.h?)
- AC_PROG_CC ищет компилятор для языка Си и выставляет переменную CC соответствующим образом.
- AC_OUTPUT заканчивает файл configure.in и заставляет autoconf начать генерацию configure-скрипта.
Более подробное описание для всех этих макросов вы можете найти в разделе ссылок внизу 1).
После всех правок я получил следующий configure.in:
AC_PREREQ(2.59) AC_INIT([hello], [1.0], [basinbug at yahoo.com]) AC_CONFIG_SRCDIR([hello.c]) # Checks compiler AC_PROG_CC AC_OUTPUT
Теперь запустите программу autoconf, а после получившийся configure скрипт:
[user@ubuntu ~/autotools-hello]$ ./configure checking for gcc... gcc checking for C compiler default output file name... a.out checking whether the C compiler works... yes checking whether we are cross compiling... no checking for suffix of executables... checking for suffix of object files... o checking whether we are using the GNU C compiler... yes checking whether gcc accepts -g... yes checking for gcc option to accept ANSI C... none needed configure: creating ./config.status
Создание Makefile.am и src/Makefile.am
Но работающего скрипта configure недостаточно. Наша цель, чтобы программа также собиралась по команде make и устанавливалась по make install. За это отвечает уже automake. Для него нам потребуется создать два файла: корневой Makefile.am и Makefile.am для каталога src/, в котором и должен располагаться файл hello.c
Для нашей программы они очень простые:
Makefile.am
SUBDIRS = src
src/Makefile.am:
bin_PROGRAMS = hello hello_SOURCES = hello.c
SUBDIRS сообщает make'у о каталоге src, в который обязательно необходимо «заглянуть»
bin_PROGRAMS задаёт имя нашей программы, а позже мы указываем какие исходные файлы нужно будет компилировать. Более нам ничего не нужно указывать — automake сам всё поймёт.
Некоторые изменения также нужно внести в configure.in, чтобы при вызове configure создавались необходимые Makefile'ы:
AC_PREREQ(2.59) AC_INIT([hello], [1.0], [basinbug at yahoo.com]) -AC_CONFIG_SRCDIR([hello.c]) +AC_CONFIG_SRCDIR([src/hello.c]) AM_INIT_AUTOMAKE # Checks compiler AC_PROG_CC AC_CONFIG_FILES([Makefile src/Makefile]) AC_OUTPUT
Объясню подробнее назначение добавленных макросов: AM_INIT_AUTOMAKE сообщает autoconf о том, что мы намерены использовать automake. AC_CONFIG_FILES говорит, что из указанных файлов, с постфиксом .in, нужно создать результирующие файлы с приведёнными именами. Иными словами, во время вызова configure из файла Makefile.in будет создаваться Makefile. (А Makefile.in создаётся автоматически из Makefile.am)
- использование дополнительных аргументов макроса AM_INIT_AUTOMAKE для передачи аргументов программе automake
Далее выполните:
aclocal automake --foreign --add-missing autoconf
После чего будут сгенерированы все нужные Makefile'ы, создан configure скрипт и наша программа готова к распространению. Остался лишь один штрих: make dist и вуаля — hello-1.0.tar.gz готов к использованию и распространению между пользователями.
Ссылки
- Описание AC_CONFIG_SRCDIR-http://www.gnu.org/software/autoconf/manual/autoconf-2.57/html_node/autoconf_18.html
- Описание AM_INIT_AUTOMAKE-http://ftp.gnu.org/gnu/Manuals/automake-1.7.2/html_node/automake_24.html
- Описание AC_CONFIG_FILES-http://www.gnu.org/software/autoconf/manual/autoconf-2.57/html_node/autoconf_21.html
- Создание программного обеспечения для нескольких UNIX-платформ-http://www-128.ibm.com/developerworks/ru/library/multiunix-i/
- Внедрение поддержки Autotools на примере программы CodeParser-http://credmp.org/UsingAutotools.html
- autotut: Using GNU auto{conf,make,header}-http://www.seul.org/docs/autotut/
- Средства обеспечения переносимости и распространения-http://www.linuxcenter.ru/lib/books/linuxdev/linuxdev5.phtml
- Autotools: a practitioner's guide to autoconf, automake and libtool-http://www.freesoftwaremagazine.com/books/autotools_a_guide_to_autoconf_automake_libtool
- Официальная документация по autoconf - http://www.gnu.org/software/autoconf/manual/html_node/index.html
- Официальная документация по automake - http://sources.redhat.com/automake/automake.html
- Документация по autoconf - http://www.opennet.ru/docs/RUS/autoconf/
- Документация по automake - http://www.opennet.ru/docs/RUS/automake/
- Оригинал этой статьи - http://www.freesource.info/wiki/Autotools/hello