# gn

Быстрая и гибкая мета-система сборки, которая генерирует входные файлы для системы сборки Ninja. GN разработана для поддержки крупных проектов с множеством модулей и конфигураций, обеспечивая при этом высокую скорость и удобство использования.

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

- высокая скорость генерации файлов сборки даже для больших проектов;
- поддержка множества платформ и конфигураций (кросс-компиляция, различные целевые архитектуры);
- возможность расширения через шаблоны (templates) и пользовательские правила;
- интеграция с системой Ninja для максимально эффективной инкрементальной сборки.

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

GN состоит из нескольких ключевых компонентов, которые обеспечивают генерацию файлов сборки и управление конфигурациями (подробнее с документацией можно ознакомиться [здесь](https://gn.googlesource.com/gn/+/main/docs/)).

### Язык описания сборки

GN использует декларативный язык описания сборки, который позволяет определять цели (targets), их зависимости и параметры сборки. Язык прост для чтения и написания, при этом обладает мощными возможностями.

Основные элементы языка:

- **Цели (targets)**: описание библиотек, исполняемых файлов, групп и других артефактов сборки;
- **Зависимости (dependencies)**: указание отношений между целями;
- **Конфигурации (configs)**: наборы флагов компиляции и других параметров;
- **Шаблоны (templates)**: многократно используемые шаблоны для создания целей;
- **Переменные (variables)**: глобальные и локальные переменные для управления сборкой.

### Генерация файлов Ninja

Основная задача GN — преобразование описания проекта на языке GN в файлы сборки для Ninja. Этот процесс выполняется быстро и позволяет Ninja выполнять инкрементальные сборки с минимальными накладными расходами.

Процесс генерации:

- Парсинг файлов `.gn` и `BUILD.gn` для построения графа зависимостей;
- Разрешение конфигураций и применений их к целям;
- Генерация файлов `.ninja` для каждого каталога сборки;
- Создание файла `build.ninja` в корневой директории сборки.

### Управление конфигурациями и вариантами сборки

GN предоставляет гибкие механизмы для управления конфигурациями сборки, позволяя легко переключаться между различными вариантами (debug, release, для разных платформ и архитектур).

Возможности управления конфигурациями:

- Предопределенные конфигурации для компиляторов и целевых платформ;
- Возможность создания пользовательских конфигураций и вариантов сборки;
- Поддержка кросс-компиляции и сборки для нескольких целевых архитектур в одном дереве;
- Наследование и переопределение конфигураций.

### Встроенные функции и шаблоны

GN включает богатый набор встроенных функций и шаблонов для выполнения общих задач сборки, таких как компиляция библиотек, создание исполняемых файлов, копирование файлов и другие.

Встроенные функции:

- `executable()` — создание исполняемого файла;
- `static_library()` и `shared_library()` — создание статических и динамических библиотек;
- `source_set()` — группа исходных файлов, которые не требуют отдельной библиотеки;
- `group()` — объединение нескольких целей в одну;
- `copy()` — копирование файлов в выходной каталог;
- `action()` и `action_foreach()` — выполнение пользовательских команд.

### Расширяемость и пользовательские шаблоны

Разработчики могут создавать собственные шаблоны для инкапсуляции повторяющихся паттернов сборки, что позволяет уменьшить дублирование кода и упростить поддержку больших проектов.

Создание пользовательских шаблонов:

- Определение шаблонов с помощью `template()`;
- Передача параметров в шаблоны и их использование в целях;
- Использование шаблонов для генерации сложных целей с минимальным описанием;
- Совместное использование шаблонов между разными проектами.

### Инструменты командной строки

GN предоставляет набор инструментов командной строки для управления сборкой, генерации файлов, анализа зависимостей и других задач.

Основные команды:

- `gn gen` — генерация файлов Ninja для указанной конфигурации;
- `gn check` — проверка целостности и корректности файлов `.gn` и `BUILD.gn`;
- `gn desc` — вывод информации о целях и их зависимостях;
- `gn format` — автоматическое форматирование файлов `.gn` и `BUILD.gn`;
- `gn clean` — очистка сгенерированных файлов.
