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

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