Более сложный пример
Дальше: Интернационализация Вверх: Использование automake Назад: Простой пример
Более сложный пример
Как и в предыдущей главе, приведем и реальный ``боевой'' пример -- Makefile.am из библиотеки glib версии 1.2.0. Он не очень велик, так что его можно привести целиком:
## Process this file with automake to produce Makefile.in AUTOMAKE_OPTIONS = 1.4 SUBDIRS = . gmodule gthread docs tests configincludedir = $(pkglibdir)/include bin_SCRIPTS=glib-config BUILT_SOURCES=glib-config glib-config: glib-config.in INCLUDES = -DG_LOG_DOMAIN=g_log_domain_glib @GLIB_DEBUG_FLAGS@ EXTRA_DIST = \ glib.m4 \ glib.spec.in \ acglib.m4 \ sanity_check \ README.win32 \ glib.def \ makefile.msc \ giowin32.c \ glibconfig.h.win32 \ config.h.win32 lib_LTLIBRARIES = libglib.la libglib_la_SOURCES = \ garray.c \ gcache.c \ gcompletion.c \ gdataset.c \ gdate.c \ gerror.c \ ghash.c \ ghook.c \ giochannel.c \ giounix.c \ glist.c \ gmain.c \ gmem.c \ gmessages.c \ gmutex.c \ gnode.c \ gprimes.c \ grel.c \ gscanner.c \ gslist.c \ gstrfuncs.c \ gstring.c \ gtimer.c \ gtree.c \ gutils.c include_HEADERS = \ glib.h configinclude_DATA = \ glibconfig.h configure: configure.in acglib.m4 BUILT_SOURCES = stamp-gc-h #note: not glibconfig.h glibconfig.h: stamp-gc-h @: stamp-gc-h: config.status CONFIG_FILES= CONFIG_HEADERS= CONFIG_OTHER=glibconfig.h ./config.status echo timestamp > stamp-gc-h libglib_la_LDFLAGS = \ -version-info $(LT_CURRENT):$(LT_REVISION):$(LT_AGE) \ -release $(LT_RELEASE) noinst_PROGRAMS = testglib testgdate testgdateparser testglib_LDADD = libglib.la testgdate_LDADD = libglib.la testgdateparser_LDADD = libglib.la m4datadir = $(datadir)/aclocal m4data_DATA = glib.m4 .PHONY: files release sanity snapshot files: @files=`ls $(DISTFILES) 2> /dev/null `; for p in $$files; do \ echo $$p; \ done release: rm -rf .deps */.deps cd docs && make glib.html $(MAKE) distcheck sanity: ./sanity_check $(VERSION) snapshot: $(MAKE) dist distdir=$(PACKAGE)`date +"%y%m%d"` dist-hook: cp glib.spec $(distdir)
Как и в случае Autoconf, строка AUTOMAKE_OPTIONS = 1.4 требует, чтобы при генерации Makefile.in использовался пакет Automake версии 1.4 или новее. Так как исходные тексты библиотеки расположены в нескольких директориях, переменная SUBDIRS имеет соответствующее значение. Так как исходные тексты располагаются как в корневой директории, так и в нескольких поддиректориях, проект имеет организацию ``shallow''.
Макрос bin_SCRIPTS служит специально для тех случаев, когда необходимо установить программмы, являющиеся скриптами. В данном случае скрипт только один -- glib-config, который используется для сообщения о том, где установлена glib и с какими опциями необходимо компилировать программу, использующую glib, например, таким образом:
[user@host:dir] gcc prog.c -o prog `glib-config --cflags` `glib-config --libs`
Отличительной особенностью этого макроса является то, что он не генерирует и не использует никаких зависимостей, поэтому строку
glib-config: glib-config.inпришлось включить в Makefile.am вручную.
Макрос EXTRA_DIST определяет список файлов, которые войдут в дистрибутив при выполнении специальной цели dist. Эта цель генерируется automake и обычно выполнение ее приводит к созданию .tar.gz-файла, содержащего весь проект. В архив будут включены все исходные тексты, все Makefile.am и Makefile.in, а также файлы из встроенного в automake списка, который можно увидеть, набрав команду automake --help. В данном случае, помимо всего прочего, авторы решили включить в дистрибутив некоторые дополнительные файлы, список которых и задан в качестве аргументов EXTRA_DIST.
Строка lib_LTLIBRARIES = libglib.la означает, что необходимо собрать архивную (.a) и разделяемую (.so) библиотеки. Эта заадча в общем несложная, но правильное ее решение требует точного указания опций компилятора (линкера). Так как на различных платформах они могут очень сильно различаться, эта обязанность возлагается на еще одну вспомогательную программу -- libtool. (Хороший пример того, как инициализировать использование libtool -- файл configure.in из этого же проекта). Следующий макрос, libglib_la_SOURCES, определяет список файлов с исходными текстами, из которых будет состоять библиотека.
И наконец, последний интересный момент -- макрос noinst_PROGRAMS. Его использование говорит о том, что необходимо сгенерировать цели для сборки указанных программ (в нашем случае -- небольших примеров, тестирующих функциональность библиотеки), но устанавливать эти программы при выполнении цели ``install'' не требуется.
Как и в случае с Autoconf, изучение документации и существующих реальных
проектов является основным способом создать правильный Makefile.am.
Dmitry A. Antipov
1999-05-26