Более сложный пример

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