# autoconf

Инструмент для автоматической генерации скриптов конфигурации, которые адаптируют исходный код программного обеспечения к различным Unix-подобным системам. Он позволяет разработчикам создавать переносимые и настраиваемые пакеты исходного кода, автоматически определяя характеристики целевой системы и настраивая параметры сборки соответствующим образом. Autoconf является частью GNU Build System и широко используется в open-source проектах для упрощения процесса компиляции на различных платформах.

## Особенности

- автоматическое определение наличия библиотек, заголовочных файлов и функций на целевой системе;
- создание переносимых скриптов конфигурации, работающих на различных Unix-подобных системах;
- поддержка создания кроссплатформенных Makefile через интеграцию с automake;
- расширяемость с помощью макросов M4 для пользовательских проверок;
- генерация заголовочных файлов с параметрами конфигурации.

## Основные компоненты

Инструментарий autoconf состоит из нескольких взаимосвязанных программ, которые работают вместе для создания системы сборки (подробнее с документацией можно ознакомиться [здесь](https://www.gnu.org/software/autoconf/)):

### Основные исполняемые программы

Основные утилиты autoconf предоставляют функционал для различных этапов настройки системы сборки:

- **autoconf** — генерирует скрипт `configure` из файла `configure.ac` с использованием макросов M4;
- **autoheader** — создает файл `config.h.in` с шаблонами для `#define` директив, которые затем заполняются скриптом `configure`;
- **autom4te** — кэширующий процессор для M4, используемый autoconf для ускорения обработки макросов;
- **autoreconf** — автоматически запускает `autoconf`, `autoheader`, `aclocal`, `automake`, `libtoolize` и другие необходимые инструменты в правильном порядке;
- **autoscan** — анализирует исходный код и помогает создать начальный вариант файла `configure.ac`;
- **ifnames** — извлекает и показывает, какие символы `#ifdef` используются в исходном коде программы.

### Вспомогательные инструменты и макросы

Autoconf тесно интегрируется с другими инструментами GNU Build System:

- **aclocal** — собирает макросы M4, необходимые для работы autoconf, в один файл `aclocal.m4`;
- **automake** — создает `Makefile.in` из `Makefile.am` (часто используется вместе с autoconf);
- **libtool** — управляет созданием статических и shared библиотек на различных платформах;
- **pkg-config** — используется для получения флагов компиляции и линковки для установленных библиотек.

### Стандартные макросы проверок

Autoconf предоставляет обширный набор предопределенных макросов для проверки различных аспектов системы:

- **AC_PROG_CC** — проверяет наличие компилятора C и устанавливает переменную CC;
- **AC_CHECK_HEADERS** — проверяет наличие указанных заголовочных файлов;
- **AC_CHECK_LIB** — проверяет наличие библиотеки и ее функций;
- **AC_CHECK_FUNC** — проверяет наличие указанной функции в библиотеках;
- **AC_OUTPUT** — определяет выходные файлы, которые должны быть сгенерированы;
- **AC_CONFIG_FILES** — указывает файлы, которые должны быть созданы из шаблонов.

## Процесс работы и генерируемые файлы

Типичный процесс работы с autoconf включает создание нескольких файлов, которые преобразуются в готовую систему сборки:

1. **configure.ac** → **configure** (через `autoconf`);
2. **config.h.in** → **config.h** (через `configure`);
3. **Makefile.am** → **Makefile.in** → **Makefile** (через `automake` и `configure`);
4. Запуск `./configure` создает окончательные **Makefile** и **config.h** для конкретной системы.
