Autoconf

Pause

Autoconf — инструмент для создания программных пакетов, собираемых из исходных текстов. Основная задача Autoconf — устранение различий между операционными системами и предоставление стандартного процесса установки, включающего распаковку исходного архива, сборку (build) программ и установку созданных файлов, с минимальной необходимостью в детальном знании целевой системы.

Autoconf может применяться на системах, где доступны Bourne shell и утилита make. Инструмент поддерживает сборку программ на различных языках программирования, включая C, C++, Fortran, Fortran 77, Erlang и Objective-C.

Скрипт configure запускает серию тестов для адаптации исходных текстов к сборке и установке на конкретной целевой системе. В процессе он генерирует заголовочные файлы и make-файлы (Makefile) из шаблонов. В комплекте с программами Automake и Libtool Autoconf входит в GNU Build System, который также включает ряд вспомогательных инструментов, в том числе Autoheader.

Общие сведения
Что важно знать
Autoconf
Тип система автоматической конфигурации сборочных пакетов
Автор Дэвид Маккензи
Разработчик Free Software Foundation
Написана на m4, Bourne shell
Интерфейс командная строка
Операционные системы кроссплатформенное ПО (работает на ОС с Bourne shell и make)
Первый выпуск лето 1991
Последняя версия
Репозиторий git.savannah.gnu.org/git…
Лицензия GPL
Сайт gnu.org/software/autocon…

Назначение программы Autoconf

undefined

Autoconf предназначен для создания программных пакетов, собираемых из исходного кода. Обычно такие пакеты распространяются в виде файлов .tar.gz. Autoconf позволяет преодолеть различия между системами, так что для распаковки, сборки и установки пакета достаточно выполнить стандартную последовательность команд:

$ tar zxvf пакет-версия.tar.gz
$ cd пакет-версия
$ ./configure
$ make
$ /bin/su -
$ make install

История

Autoconf был создан летом 1991 года Дэвидом Маккензи для поддержки своей работы в Free Software Foundation. В последующие годы инструмент был усовершенствован многочисленными авторами и стал наиболее распространённым решением для создания переносимых пакетов в мире свободного ПО.

Философия

Автоконф близок по концепции к пакету Metaconfig, использовавшемуся для Perl, а также к системе imake, применявшейся до версии X11R6.9 для сборки X Window System, однако имеет иную философию.

В области портируемости Autoconf делает акцент на проверке доступности возможностей, а не на определении номеров версий. К примеру, родной компилятор C в SunOS 4 не поддерживал ISO-расширения, однако администратор мог установить совместимый с ISO компилятор. Определить его наличие простым анализом версии системы нельзя, а скрипт configure, полагаясь на тесты возможностей, способен обнаружить нужный компилятор. Такой подход даёт следующие преимущества:

  • скрипт configure можно применять даже на новых и неизвестных системах
  • если на системе установлены обновлённые версии средств разработки, возможно использовать их преимущества
  • отпадает необходимость поддерживать детализированные списки соответствия версий и возможностей

Скрипт configure

К команде ./configure можно добавить параметры — их перечень выводится командой:

$ ./configure --help

Среди важных параметров — --prefix=PREFIX (определяет корневой каталог для установки программ пакета) и --exec-prefix=EPREFIX (каталог для бинарных файлов). Также для задания конкретных директорий существуют параметры:

  --bindir=DIR           пользовательские исполняемые файлы [EPREFIX/bin]
  --sbindir=DIR          системные утилиты администратора [EPREFIX/sbin]
  --libexecdir=DIR       дополнительные исполняемые файлы [EPREFIX/libexec]
  --datadir=DIR          архитектурно-независимые данные только для чтения [PREFIX/share]
  --sysconfdir=DIR       одноузловые данные только для чтения [PREFIX/etc]
  --sharedstatedir=DIR   изменяемые архитектурно-независимые данные [PREFIX/com]
  --localstatedir=DIR    изменяемые локальные данные [PREFIX/var]
  --libdir=DIR           библиотеки объектного кода [EPREFIX/lib]
  --includedir=DIR       файлы заголовков C [PREFIX/include]
  --oldincludedir=DIR    файлы заголовков C для не-gcc [/usr/include]
  --infodir=DIR          документация info [PREFIX/info]
  --mandir=DIR           документация man [PREFIX/man]

Начиная с версии 1.3 automake, можно использовать переменную окружения при установке:

$ DESTDIR=корень make install

Это позволяет установить структуру файлов в указанный каталог (например, при создании RPM-пакетов или установке на удалённый диск, смонтированный через NFS).

Если пакет поддерживает различные функции или зависимости, можно выбирать их через такие параметры:

  --enable-ФУНКЦИЯ
  --enable-ФУНКЦИЯ=значение
  --disable-ФУНКЦИЯ
  --with-ПАКЕТ
  --without-ПАКЕТ

Дополнительные параметры configure могут задаваться через переменные вида имя=значение — например:

Переменная Назначение
CC команда вызова компилятора C
CFLAGS параметры компилятора C
LDFLAGS параметры компоновщика (например, -Lпуть для поиска библиотек вне стандартных директорий)
CPPFLAGS параметры препроцессора C (например, -Iпуть для не-standard заголовочных файлов)
CPP команда для препроцессора C

Для указания архитектуры применяются параметры --build=АРХИТЕКТУРА; при кросс-компиляции — --host=АРХИТЕКТУРА или --target=АРХИТЕКТУРА.

Программа automake из файла Makefile.am генерирует Makefile.in, после чего autoconf создаёт итоговые файлы без суффикса .in.

Пример использования Autoconf

Пример «Hello, world»:

  1. Создайте исходный файл hello.c:
#include <stdio.h>

int main() {
    printf("Hello, world!\n");
    return 0;
}
  1. Создайте Makefile.am с содержимым:
bin_PROGRAMS = hello
hello_SOURCES = hello.c
  1. Запустите autoscan. Будут выведены сообщения об ошибках:
autom4te: configure.ac: no such file or directory
autoscan: /usr/bin/autom4te failed with exit status: 1

и созданы autoscan.log и configure.scan:

#                                               -*- Autoconf -*-
# Process this file with autoconf to produce a configure script.

AC_PREREQ(2.59)
AC_INIT(FULL-PACKAGE-NAME, VERSION, BUG-REPORT-ADDRESS)
AC_CONFIG_SRCDIR([hello.c])
AC_CONFIG_HEADER([config.h])

# Checks for programs.
AC_PROG_CC

# Checks for libraries.

# Checks for header files.

# Checks for typedefs, structures, and compiler characteristics.

# Checks for library functions.

AC_CONFIG_FILES([Makefile])
AC_OUTPUT
  1. Переименуйте configure.scan в configure.ac и дополните строку AC_INIT конкретными данными.
  2. Запустите autoheader; будет создан autom4te.cache с файлами output.0, requests, traces.0 и config.h.in:
/* config.h.in.  Generated from configure.ac by autoheader.  */

/* Define to the address where bug reports for this package should be sent. */
#undef PACKAGE_BUGREPORT

/* Define to the full name of this package. */
#undef PACKAGE_NAME

/* Define to the full name and version of this package. */
#undef PACKAGE_STRING

/* Define to the one symbol short name of this package. */
#undef PACKAGE_TARNAME

/* Define to the version of this package. */
#undef PACKAGE_VERSION
  1. В configure.ac после AC_INIT добавьте строку:
AM_INIT_AUTOMAKE
  1. Запустите aclocal; будет создан aclocal.m4 и обновлён autom4te.cache.
  2. Запустите automake --add-missing --copy — появятся сообщения:
configure.ac: installing `./install-sh'
configure.ac: installing `./missing'
Makefile.am: installing `./INSTALL'
Makefile.am: required file `./NEWS' not found
Makefile.am: required file `./README' not found
Makefile.am: required file `./AUTHORS' not found
Makefile.am: required file `./ChangeLog' not found
Makefile.am: installing `./COPYING'
Makefile.am: installing `./depcomp'

и создадутся нужные файлы и обновится кэш.

  1. Запустите autoconf; появится configure.
  2. Для сборки используйте стандартные команды:
$ ./configure
$ make
$ /bin/su -
$ make install
  1. После изменений в исходных текстах снова выполните autoscan, обновите configure.ac и выполните autoreconf.

Критика

Автоконф часто критикуют за использование устаревших технологий, наличие ограничений и сложных для освоения сценариев даже при простых нуждах. К часто выделяемым недостаткам системы относят:

  • Сложность использования — для многих проектов требуется многократное повторение одних и тех же действий[2][3].
  • Сгенерированный скрипт configure исполняется в Bourne shell, из-за чего процесс генерации Makefile может быть медленным.
  • Считается, что скрипты configure, созданные через autoconf, представляют собой в основном ручной интерфейс командной строки без стандартизации[4]. Несмотря на это, стандарты существуют и их использование становится всё более распространённым[5].
  • Для добавления нестандартных проверок требуется освоить относительно малоизвестный макропроцессор M4[4][6].
  • Из-за слабой совместимости между версиями приходится использовать обёрточные скрипты[7].
  • Автоматически сгенерированные скрипты обычно получаются очень объёмными и иногда сложными для отладки.

По этим причинам ряд проектов, ранее использовавших GNU Build System, перешли на альтернативные инструменты, такие как CMake и SCons[2][8].

Примечания

  1. ↑ Weinberg Z. autoconf-2.72 released [stable] — 2023.
  2. ↑ 1 2 Alexander Neundorf. Why the KDE project switched to CMake -- and how (англ.). lwn.net (21 июня 2006). Дата обращения: 13 июня 2024. Архивировано 9 сентября 2025 года.
  3. ↑ Poul-Henning Kamp. A Generation Lost in the Bazaar (англ.), ACM Queue (15 August 2012). Архивировано 27 сентября 2025 года. Дата обращения: 13 июня 2024.
  4. ↑ 1 2 Andrew McCall. Stop the autoconf insanity! Why we need a new build system (англ.). freshmeat.net (21 июня 2003). Дата обращения: 13 июня 2024. Архивировано 26 марта 2009 года.
  5. ↑ GNU Coding Standards (англ.). gnu.org. Дата обращения: 13 июня 2024. Архивировано 3 октября 2025 года.
  6. ↑ Poul-Henning Kamp. Did you call them autocrap tools? (англ.) (20 апреля 2010). Дата обращения: 10 апреля 2018. Архивировано 11 сентября 2017 года.
  7. ↑ Thomas Dickey. why i still use autoconf 2.13 (англ.). invisible-island.net. Дата обращения: 13 июня 2024. Архивировано 18 сентября 2025 года.
  8. ↑ Build Systems (Blender) (англ.). Дата обращения: 13 июня 2024. Архивировано 2 декабря 2008 года.

Ссылки

Pause