# automake

Инструмент для автоматической генерации переносимых Makefile-файлов в соответствии со стандартами GNU Coding Standards. Он работает совместно с autoconf, позволяя разработчикам описывать структуру сборки проекта на высоком уровне абстракции, после чего automake преобразует эти описания в подробные и корректные Makefile-файлы. Automake берет на себя рутинные аспекты создания Makefile, такие как поддержка стандартных целей (all, install, dist, clean), установка зависимостей и правил пересборки, что значительно упрощает процесс создания переносимого программного обеспечения.

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

- автоматическая генерация переносимых Makefile из высокоуровневого описания;
- поддержка стандартных целей сборки, установки и дистрибуции в соответствии с GNU Coding Standards;
- интеграция с autoconf для создания полностью настраиваемой системы сборки;
- поддержка сборки программ, библиотек, скриптов и данных из единого описания;
- автоматическое управление зависимостями и правилами пересборки.

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

Automake предоставляет набор макросов и шаблонов для описания структуры проекта и автоматической генерации Makefile (подробнее с документацией можно ознакомиться [здесь](https://www.gnu.org/software/automake/manual/automake.html)):

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

Ключевые утилиты automake, используемые в процессе создания системы сборки:

- **automake** — генерирует файлы `Makefile.in` из `Makefile.am`; обрабатывает все `Makefile.am` в проекте и создает соответствующие `Makefile.in`, которые затем используются скриптом `configure` для создания окончательных `Makefile`;
- **aclocal** — хотя и является частью **automake**, эта утилита собирает макросы из установленных пакетов и создает файл `aclocal.m4`, который затем используется autoconf и automake; обеспечивает доступ к макросам, определенным в automake и других пакетах.

### Файлы описания проекта

Automake использует специальные файлы для описания структуры и параметров сборки проекта:

- **Makefile.am** — файлы описания сборки для automake; содержат высокоуровневое описание целей сборки (программы, библиотеки, данные), которые automake преобразует в подробные `Makefile.in`;
- **configure.ac** (или **configure.in**) — хотя это файл для autoconf, он содержит макросы, необходимые для работы automake, такие как `AM_INIT_AUTOMAKE`;
- **aclocal.m4** — файл с макросами, собранными утилитой `aclocal`, включая макросы automake.

### Интеграция с autoconf и libtool

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

- **autoconf** — automake полагается на скрипт `configure`, сгенерированный autoconf, для подстановки значений переменных в `Makefile`;
- **libtool** — automake может использовать libtool для сборки и установки разделяемых библиотек единообразным образом на разных платформах;
- **pkg-config** — часто используется в сочетании с automake для получения флагов компиляции и линковки для внешних библиотек.

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

Типичный процесс использования automake в проекте включает следующие шаги:

1. Создание файлов `Makefile.am` для каждого подкаталога проекта с описанием целей сборки;
2. Добавление макроса `AM_INIT_AUTOMAKE` в `configure.ac`;
3. Запуск `aclocal` для сбора макросов в `aclocal.m4`;
4. Запуск `autoconf` для создания скрипта `configure` из `configure.ac`;
5. Запуск `automake --add-missing` для создания `Makefile.in` файлов и копирования вспомогательных скриптов (таких как `install-sh`, `depcomp`);
6. Пользователь запускает `./configure` для создания окончательных `Makefile` из `Makefile.in`;
7. Пользователь запускает `make` для сборки проекта.
