# gnu-config

Набор скриптов и утилит, являющихся частью GNU Build System, которые предоставляют стандартизированный способ определения характеристик системы и создания переносимых configure-скриптов. Эти инструменты автоматически определяют архитектуру системы, доступные компиляторы, библиотеки и другие параметры, необходимые для настройки сборки программного обеспечения под различные Unix-подобные платформы.

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

- автоматическое определение характеристик системы (архитектура, компиляторы, библиотеки, доступные функции);
- генерация переносимых configure-скриптов для адаптации сборки к разным платформам;
- поддержка кросс-компиляции и сборки для различных целевых систем;
- интеграция с инструментами GNU Build System (autoconf, automake, libtool).

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

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

### Скрипты определения системы

Основные скрипты config.guess и config.sub используются для определения характеристик системы в стандартизированном формате GNU triplet. Эти скрипты являются фундаментальными компонентами системы, обеспечивая единообразное определение архитектуры и операционной системы на различных платформах.

Ключевые скрипты:

- `config.guess` — автоматическое определение типа системы, на которой запускается скрипт;
- `config.sub` — нормализация и валидация спецификаторов системы (канонические имена);
- `install-sh` — переносимый скрипт для установки файлов (замена команды install);
- `mkinstalldirs` — создание иерархии директорий с установкой правильных прав доступа;
- `depcomp` — управление зависимостями компиляции для различных компиляторов;
- `compile` — обёртка для компиляторов, обеспечивающая единообразное поведение;
- `ylwrap` — обёртка для генераторов лексических анализаторов (lex/yacc).

### Макросы проверки системы

Autoconf предоставляет сотни макросов для проверки возможностей системы, которые используются в файлах configure.ac для создания настраиваемых скриптов сборки. Эти макросы позволяют автоматически определять доступные функции, библиотеки и системные характеристики.

Основные категории макросов:

- **Проверка компиляторов**: `AC_PROG_CC`, `AC_PROG_CXX`, `AC_PROG_F77`;
- **Проверка библиотек**: `AC_CHECK_LIB`, `AC_SEARCH_LIBS`;
- **Проверка заголовочных файлов**: `AC_CHECK_HEADERS`, `AC_CHECK_HEADER`;
- **Проверка функций**: `AC_CHECK_FUNCS`, `AC_CHECK_FUNCTION`;
- **Проверка типов данных**: `AC_CHECK_TYPES`, `AC_TYPE_SIZE_T`;
- **Проверка структур**: `AC_CHECK_MEMBERS`;
- **Настройка параметров сборки**: `AC_ARG_ENABLE`, `AC_ARG_WITH`.

### Интеграция с pkg-config

GNU Config может интегрироваться с pkg-config для автоматического обнаружения зависимостей и получения флагов компиляции. Эта интеграция упрощает управление внешними библиотеками и обеспечивает правильную настройку параметров сборки.

Функции интеграции:

- `PKG_CHECK_MODULES` — проверка наличия и версий библиотек через pkg-config;
- Автоматическое добавление флагов компиляции и линковки;
- Поддержка статических и динамических библиотек;
- Проверка совместимости версий зависимостей.

### Поддержка кросс-компиляции

GNU Build System предоставляет развитую поддержку кросс-компиляции, позволяя собирать программное обеспечение для целевых платформ, отличных от системы сборки. Это особенно важно для разработки под встраиваемые системы и различные архитектуры процессоров.

Механизмы кросс-компиляции:

- **Спецификация хоста и цели**: `--host`, `--build`, `--target` параметры configure;
- **Настройка инструментов**: автоматическое определение или указание кросс-компиляторов;
- **Проверки во время выполнения**: разделение проверок для системы сборки и целевой системы;
- **Поддержка эмуляции**: возможность запуска тестов через эмулятор (qemu и др.);
- **Инструменты обёртки**: адаптация путей к компиляторам и системным утилитам.

### Интеграция и использование

GNU Config и GNU Build System широко используются в open-source сообществе для обеспечения переносимости программного обеспечения между различными Unix-подобными системами. Они интегрируются в процесс разработки через стандартные файлы configure.ac и Makefile.am.

**Типичные сценарии использования:**
- Создание переносимых configure-скриптов для open-source библиотек и приложений;
- Автоматическая настройка параметров сборки для различных дистрибутивов Linux;
- Кросс-компиляция для встраиваемых систем и различных архитектур процессоров;
- Управление сложными зависимостями в крупных проектах;
- Стандартизация процесса сборки и установки программного обеспечения.
