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


Некоторые примеры пакетов

Простой пример, от начала до конца

Давайте предположим, что мы только что закончили писать 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


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