Более сложный пример
Дальше: Интернационализация Вверх: Использование 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
