Ninja (система сборки)

Ninja (МФА [nˈiɪnʤə], с англ. ninjaниндзя) — это кроссплатформенная консольная утилита, представляющая из себя систему сборки программного обеспечения из исходного кода. Утилита Ninja была разработана Эваном Мартином, сотрудником компании Google[7][1]. Ninja представляет собой улучшенную и доработанную версию утилиты Make. Главная цель которой — автоматизация сборки и её ускорение, а также ускорение последующих пересборок, на основе сгенерированных утилитой файлов и решение типовых проблем при кроссплатформенной разработке.

Ninja

Процесс конфигурирования dav1d (кодек-декодер из проекта VideoLAN) при помощи Ninja в связке с Meson
Тип
Разработчик Эван Мартин (Evan Martin)[1]
Написана на C++, Python[2]
Интерфейс CLI
Операционная система
Языки интерфейса английский
Первый выпуск 6 февраля 2011[1][4]
Аппаратная платформа кроссплатформенность
Последняя версия 1.10.2[5] (20 ноября 2020)
Состояние активное
Лицензия Apache License 2.0[6]
Сайт ninja-build.org
 Медиафайлы на Викискладе

История создания

Система сборки Ninja, была разработана с целью заменить устаревшие системы сборки, не рассчитанные на крупные проекты с большим количеством кода. Кодовая база таких проектов как браузер Google Chrome и операционная система Android, уже на то время (2007—2012) составляла несколько миллионов строк кода и более 40 тыс. вхождений. Первоначально разработчики использовали систему сборки SCons, основанную на Python, но по заверению Эвана Мартина, SCons оказался слишком медленным и отнимал около 40 секунд на один лишь только запуск, перед тем как начиналась сама сборка. После чего, была предпринята попытка перевода проектов на систему Make, но после проведения очередных тестов, оказалось — что Make, также отнимал около 10 секунд на запуск и (10—20) секунд на инкрементальную сборку. Помимо этого, Make и SCons зачастую вызывали различные проблемы с кроссплатформенной разработкой. Это не устраивало Эвана и сподвигло его к разработке новой системы сборки, не имеющей таких недостатков[7][8].

Впервые Эван Мартин сообщил о планах и причинах разработки Ninja, в своём блоге — 6 февраля 2011 года[9]. На следующий год (8 мая 2012), состоялся первой выпуск Ninja[1], версии 120508 и был размещён на GitHub репозитории[4].

О системе сборки

В ходе разработки, система сборки Ninja, приобрела множество новых особенностей, увеличивших скорость сборки[10][11][12]. Из таких особенностей можно отметить:

Сам Эван не рекомендует писать сборочные скрипты Ninja вручную, по той простой причине, что синтаксис скриптов Ninja остался подобен Make синтаксису. Скорее всего, это было сделано, ради упрощения перевода программ с Make на Ninja и в угоду скорости исполнения, так как Make имеет довольно простую синтаксическую структуру и подобен языку ассемблера. По этой причине, написание на нём скриптов человеком, может быть затруднительным, а чтение и анализ синтаксиса программами, остаются тривиальными. Вместо ручного написания, рекомендуется использовать Ninja в сочетании с более «умными» системами мета-сборки (GYP, CMake, Meson и т. п.), имеющими встроенный генератор файлов Ninja[3].

Философия

Примерный перевод раздела о философии из руководства Ninja.

Эван Мартин. «The Ninja build system manual: Philosophical overview»[15]:

Там, где другие системы сборки являются языками высокого уровня, Ninja стремится быть ассемблером.

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

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

Пример кода

Далее, приведён пример базового «.ninja» файла, демонстрирующего основную часть синтаксиса[16].

cflags = -Wall

rule cc
  command = gcc $cflags -c $in -o $out

build foo.o: cc foo.c

Критика

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

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

См. также

Примечания

  1. Эван Мартин. Google Groups: ninja-build (англ.). Google Groups (8 мая 2012). Дата обращения: 15 января 2022.
  2. The Ninja (build system) on Open Hub: Languages Page (англ.). Open Hub. Дата обращения: 15 января 2022.
  3. Эван Мартин. The Ninja build system manual: Using Ninja for your project (англ.). ninja-build.org. Дата обращения: 15 января 2022.
  4. First release (англ.). GitHub (8 мая 2012). Дата обращения: 15 января 2022.
  5. Latest release (англ.). GitHub. Дата обращения: 15 января 2022.
  6. COPYING (англ.). GitHub. Дата обращения: 15 января 2022.
  7. Разработчики из компании Google открыли код системы сборки Ninja. OpenNET (8 февраля 2011). Дата обращения: 15 января 2022.
  8. Эван Мартин. Ninja (англ.). aosabook.org. Дата обращения: 15 января 2022.
  9. Эван Мартин. Chromium Notes: Ninja, a new build system (англ.). neugierig.org (6 февраля 2011). Дата обращения: 15 января 2022.
  10. Ninja - small build system similar to make. OpenNET (18 февраля 2011). Дата обращения: 15 января 2022.
  11. Эван Мартин. The Ninja build system manual: Comparison to Make (англ.). ninja-build.org. Дата обращения: 15 января 2022.
  12. Дэвид Ротлис. Benchmarking the Ninja build system (англ.). rothlis.net (2016-11-4). Дата обращения: 15 января 2022.
  13. Benchmarks (англ.). re2c.org. Дата обращения: 31 января 2022.
  14. Ulya Trofimovich. RE2C: A lexer generator based on lookahead-TDFA (англ.) (PDF). re2c.org (2020). Дата обращения: 31 января 2022.
  15. Эван Мартин. The Ninja build system manual: Philosophical overview (англ.). ninja-build.org. Дата обращения: 15 января 2022.
  16. Эван Мартин. The Ninja build system manual: Syntax example (англ.). ninja-build.org. Дата обращения: 15 января 2022.

Ссылки

This article is issued from Wikipedia. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.