gn
Быстрая и гибкая мета-система сборки, которая генерирует входные файлы для системы сборки Ninja. GN разработана для поддержки крупных проектов с множеством модулей и конфигураций, обеспечивая при этом высокую скорость и удобство использования.
Особенности
- высокая скорость генерации файлов сборки даже для больших проектов;
- поддержка множества платформ и конфигураций (кросс-компиляция, различные целевые архитектуры);
- возможность расширения через шаблоны (templates) и пользовательские правила;
- интеграция с системой Ninja для максимально эффективной инкрементальной сборки.
Основные компоненты
GN состоит из нескольких ключевых компонентов, которые обеспечивают генерацию файлов сборки и управление конфигурациями (подробнее с документацией можно ознакомиться здесь).
Язык описания сборки
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— очистка сгенерированных файлов.