Давайте предположим, что мы только что закончили писать 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)\"
Вот другой, более изощренный пример. Он показывает, как собрать две
программы (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.