Алексей Махоткин

домашняя страница

Autoconf

Go to the first, previous, next, last section, table of contents.


Обновление с версии 1

@anchor{Upgrading}

По большей части Autoconf версии 2 обратно совместим с версией 1. Однако же, в нем появились более удобные способы решения некоторых вещей, а некоторые особенно уродливые способы из версии 1 не поддерживаются. Так что, в зависимости от сложности ваших файлов `configure.in’, вам, может быть, придется вручную скорректировать ваши файлы, чтобы использовать их с Autoconf версии 2. Этот раздел описывает некоторые проблемы, которых можно ожидать при переходе к новой версии. Также, возможно, ваши скрипты configure получат выгоду от использования новых возможностей версии 2; список изменений приведен в файле `NEWS’ дистрибутива Autoconf.

В первую очередь убедитесь, что у вас установлен GNU m4 версии 1.1 или более свежей, предпочтительней использовать версию 1.3 или следующие. Версии до 1.1 имели ошибку, которая препятствовала их работе с Autoconf версии 2. Версии 1.3 и более поздние работают быстрее, чем более ранние версии, поскольку с версии 1.3 GNU m4 имеет более эффективную реализацию diversions и может сохранить свое состояние в файле, который потом может быстро считан обратно.

Измененные имена файлов

@anchor{Changed File Names}

Если у вас есть файл `aclocal.m4’, установленный вместе с Autoconf (а не в каталоге с исходными текстами), то вы должны переименовать его в `acsite.m4’. See section Использование программы autoconf для создания скрипта configure.

Если вы распространяете с вашим пакетом файл `install.sh’, то переименуйте его в `install-sh’, так что встроенные правила make не будут создавать на его основе файл `install’. AC_PROG_INSTALL ищет файл, пользуясь обоими именами, но лучше использовать новое имя.

Если вы используете `config.h.top’ или `config.h.bot’, то вы все равно сможете их использовать, но будет лучше, если вы объедините их в файл `acconfig.h’. See section Использование autoheader для создания `config.h.in’.

Измененные файлы Makefile

@anchor{Changed Makefiles}

Добавьте `@CFLAGS@’, `@CPPFLAGS@’ и `@LDFLAGS@’ в ваши файлы `Makefile.in’, чтобы туда попадали значения соответствующих переменных среды, установленные при запуске configure. Это необязательно, но удобно для пользователей.

Также добавьте `@configure_input@’ в комментарий каждого из входных файлов макроса AC_OUTPUT, кроме файлов `Makefile’, чтобы выходные файлы содержали сообщение о том, что они созданы скриптом configure. Автоматический выбор синтаксиса для комментариев в файлах, для которых вызывается AC_OUTPUT, было бы слишком сложно.

Добавьте `config.log’ и `config.cache’ в список файлов, которые вы удаляете с помощью цели distclean.

Если у вас в `Makefile.in’ имеется следующее:

prefix = /usr/local
exec_prefix = ${prefix}

то вы должны изменить эту запись на следующую:

prefix = @prefix@
exec_prefix = @exec_prefix@

Старое поведение замены переменных без знаков `@’ вокруг них было удалено.

Измененные макросы

@anchor{Changed Macros}

В Autoconf версии 2 многие макросы были переименованы. Вы все равно можете использовать старые имена, но новые имена макросов более понятны и для них легче найти документацию. See section Старые имена макросов, где приведена таблица соответствия новых имен старым именам. Используйте программу autoupdate для преобразования ваших файлов `configure.in’ для использования новых имен макросов. See section Использование autoupdate для обновления configure.

Некоторые макросы были заменены аналогичными, которые лучше выполняют нужную задачу, но несовместимы по параметрам вызова. Если вы получаете предупреждения о вызове устаревших макросов во время запуска autoconf, то можете спокойно игнорировать эти предупреждения, но ваш скрипт configure, вообще, будет работать лучше, если вы последуете советам заменить устаревший макрос на новый. Аналогичным образом был изменен механизм выдачи результатов тестов. Если вы использовали команды echo или AC_VERBOSE (может быть, посредством AC_COMPILE_CHECK), то вывод вашего скрипта configure будет выглядеть лучше, если вы станете использовать макросы AC_MSG_CHECKING и AC_MSG_RESULT. See section Выдача сообщений. Эти макросы лучше всего работают при использовании кэшированных переменных. See section Кэширование результатов.

Использование autoupdate для обновления configure

@anchor{Invoking autoupdate}

Программа autoupdate обновляет файл `configure.in’ заменяя вызовы старых макросов Autoconf на вызовы макросов с новыми именами. В Autoconf версии 2 большинство макросов были переименованы для использования более общей и понятной схемы наименования. Для описания новой схемы именования See section Имена макросов. Хотя макросы со старыми именами все равно работают (see section Старые имена макросов, где приведен список старых имен макросов и соответствующих им новых имен), но если вы обновите свои файлы для соответствия новым именам макросов, то файлы `configure.in’ станут читабельнее, а использовать свежую документацию по Autoconf станет проще.

Если autoupdate запущена без аргументов, то она обновляет `configure.in’, делая резервную копию оригинальной версии файла с использованием суффикса `~’ (или значения переменной среды SIMPLE_BACKUP_SUFFIX, если она установлена). Если вы зададите аргумент программе autoupdate, то она будет считывать данные из этого файла вместо `configure.in’ и выводить данные в поток стандартного вывода.

autoupdate распознает следующие ключи командной строки:

–help
-h
Выдает список ключей командной строки и прекращает работу.
–macrodir=dir
-m dir
Ищет файлы с макросами Autoconf в каталоге dir, а не в каталоге, в который производилась установка. Вы также задать путь к этому каталогу в переменной среды AC_MACRODIR; использование этого ключа перекрывает переменную среды.
–version
Выдает номер версии autoupdate и прекращает работу.

Измененные результаты

@anchor{Changed Results}

Если вы проверяли результаты предыдущих тестов путем проверки переменной командного процессора DEFS, то теперь вам необходимо переключиться на проверку значений переменных кэша для данных тестов. Переменная DEFS больше не существует во время запуска configure; она создается только при генерации выходных файлов. Это изменение поведения было сделано потому, что правильное экранирование содержимого этой переменной оказалось слишком громоздким и неэффективным при каждом вызове макроса AC_DEFINE. See section Имена переменных кэша.

Например, вот фрагмент `configure.in’, написанного для Autoconf версии 1:

AC_HAVE_FUNCS(syslog)
case “$DEFS” in
*-DHAVE_SYSLOG*) ;;
*) # syslog не находится в библиотеках по умолчанию. Смотрим, есть ли он в
   # других библиотеках.
  saved_LIBS=”$LIBS”
  for lib in bsd socket inet; do
    AC_CHECKING(for syslog in -l$lib)
    LIBS=”$saved_LIBS -l$lib”
    AC_HAVE_FUNCS(syslog)
    case “$DEFS” in
    *-DHAVE_SYSLOG*) break ;;
    *) ;;
    esac
    LIBS=”$saved_LIBS”
  done ;;
esac

Вот как это записывается для версии 2:

AC_CHECK_FUNCS(syslog)
if test $ac_cv_func_syslog = no; then
  # syslog не находится в библиотеках по умолчанию. Смотрим, есть ли он в
  # других библиотеках.
  for lib in bsd socket inet; do
    AC_CHECK_LIB($lib, syslog, [AC_DEFINE(HAVE_SYSLOG)
      LIBS=”$LIBS $lib”; break])
  done
fi

Если вы обходили ошибку в макросе AC_DEFINE_UNQUOTED, добавляя символы обратной косой черты перед кавычками, то теперь вам придется удалить их. Этот макрос сейчас работает предсказуемо и не рассматривает особым образом кавычки (кроме обратных). See section Установка выходных переменных.

Все логические переменные командного процессора, устанавливаемые макросами Autoconf, используют `yes’ для истинных переменных. Большинство из них использует `no’ для ложных значений, хотя для обратной совместимости некоторые из них используют пустую строку. Если вы полагались, что переменная командного процессора будет установлена в что-нибудь типа `1’ или `t’ для истинного значения, то вам необходимо изменить ваши тесты.

Измененное написание макросов

@anchor{Changed Macro Writing}

При определении ваших собственных макросов вы должны использовать макрос AC_DEFUN вместо define. AC_DEFUN автоматически вызывает макрос AC_PROVIDE и проверяет, что макросы, вызываемые через AC_REQUIRE, не прерывают другие макросы, для предотвращения вложенных сообщений `checking…’ на экране. На самом деле, старый способ не причинит вреда, но он менее удобен и менее привлекателен. See section Определение макросов.

Вы, вероятно, рассматривали макросы, поставляемые с Autoconf, как руководство по написанию макросов. Посмотрите на новую их версию, потому что стиль некоторых макросов сильно улучшен, а новые возможности активно используются.

Если вы делали хитрые вещи, используя недокументированные свойства Autoconf (макросы, переменные, diversions), то проверьте, не нужно ли изменить что-нибудь, чтобы учесть сделанные в Autoconf изменения. Может быть, теперь вы можете пользоваться стандартной возможностью версии 2, вместо того, чтобы упражняться в изобретательности. Или нет.

Для ускорения работы написанных вами макросов добавьте в них поддержку кэширования. Просмотрите все ваши тесты, может быть их нужно оформить в виде макросов, которые вы сможете использовать в разных пакетах.


Go to the first, previous, next, last section, table of contents.

Comments