Более сложный пример
Дальше: Использование automake Вверх: Использование Autoconf Назад: Простой пример
Более сложный пример
Теперь рассмотрим более содержательный пример -- файл configure.in из программы wget версии 1.5.3. Он слишком велик, чтобы приводить его целиком, но для понимания лучше все-таки параллельно с чтением того текста смотреть и его. Обратим внимание лишь на некоторые интересные моменты, которых должно хватить внимательному читателю для построения полной картины.
AC_PREREQ(2.12) AC_CONFIG_HEADER(src/config.h)
(стр. 23) Первый макрос означает, что для создания configure.in требуется версия пакета Autoconf 2.12 или новее, в противном случае будет выдано сообщение об ошибке и конфигурация завершится. Второй же сигнализирует о том, что нужно создавать заголовочный файл config.h.
AC_CANONICAL_HOST AC_DEFINE_UNQUOTED(OS_TYPE, "$host_os")
(стр. 38) Определить тип системы и установить переменную host_os. Тип системы определяется в так называемом ``каноническом'' виде и в большинстве случаев содержит название аппаратной платформы, операционной системы и информацию о производителе операционной системы. Примеры ``канонических'' имен -- i586-pc-linux-gnu, sparc-sun-solaris, mips-elf-linux-gnu и т.п.
AC_ARG_WITH(socks, [ --with-socks use the socks library], [AC_DEFINE(HAVE_SOCKS)])
(стр. 44) Это означает, что при указании configure опции -with-socks в заголовочном файле config.h будет объявлен макрос HAVE_SOCKS. Так как config.h по соглашению включается (прямо или косвенно, через другие заголовочные файлы) во все исходные тексты проекта, то таким образом оказывается влияние на ход условной компиляции.
Очень интересный фрагмент:
AC_PROG_CC dnl dnl if the user hasn't specified CFLAGS, then dnl if compiler is gcc, then use -O2 and some warning flags dnl else use os-specific flags or -O dnl if test -n "$auto_cflags"; then if test -n "$GCC"; then CFLAGS="$CFLAGS -O2 -Wall -Wno-implicit" else case "$host_os" in *hpux*) CFLAGS="$CFLAGS +O3" ;; *ultrix* | *osf*) CFLAGS="$CFLAGS -O -Olimit 2000" ;; *) CFLAGS="$CFLAGS -O" ;; esac fi fi
(стр. 91). Хороший пример написания кода теста вручную. Макрос AC_PROG_CC определяет тип компилятора и инициализирует переменную CC именем компилятора. Кроме того, этот макрос определяет, является ли используемый компилятор компилятором GNU и, если да, то инициализирует переменную GCC значением ``yes'', оставляя ее неинициализированной в противном случае. Эта возможность используется здесь для установки наиболее подходящих (по мнению автора программы) опций компилятора для различных систем в случае, если используемый компилятор не gcc. Определение типа системы производится по переменной host_os, устанавливаемой выше.
AC_CHECK_FUNCS(gethostbyname, [], [ AC_CHECK_LIB(nsl, gethostbyname) ])
(стр. 164) Здесь проверяется, доступна ли функция gethostbyname при компиляции без указания каких-либо дополнительных опций компилятора, т.е. примерно такая программа (в момент выполнения теста она находится в файле conftest.c)
main () { gethostbyname (NULL); }должна откомпилироваться командой gcc conftest.c. Если же компиляция завершилась неуспешно (проверяется статус завершения работы gcc, т.е. число, возвращенное им родительскому процессу), то предполагается, что функция gethostbyname() находится в библиотеке libnsl, и проводится компиляция той же самой программы командой gcc conftest.c -lnsl. Если же и эта попытка не увенчается успехом, то (в данном случае) ничего не делается, иначе в выходном потоке к переменной LIBS добавляется -libnsl.
На этом остановимся, иначе дальнейшее описание сведется просто к пересказу содержимого
документации. Важно заметить, что, по-видимому, создание конфигурационных скриптов является
таким же искусством, как и собственно программирование -- каких-либо рецептов ``на все
случаи жизни'' здесь нет и быть не может. Экспериментирование, внимательное чтение документации
и изучение примеров программ -- вот что необходимо для того, чтобы программа стала действительно
переносимой и надежно компилировалась в каких-либо нестандартных условиях.
Dmitry A. Antipov
1999-05-26