automake - Некоторые примеры пакетов
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.