Русская Википедия:Ninja (система сборки)

Материал из Онлайн справочника
Перейти к навигацииПерейти к поиску

Шаблон:Другие значения Шаблон:Программа Ninja (МФА Шаблон:МФА2; Шаблон:Tr-en) — это кроссплатформенная консольная утилита, представляющая из себя систему сборки программного обеспечения из исходного кода. Утилита Ninja была разработана Эваном Мартином, сотрудником компании Google[1][2].

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

История

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

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

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

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

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

Философия

Примерный перевод раздела о философии из руководства Ninja. Шаблон:Начало цитаты Там, где другие системы сборки являются языками высокого уровня, Ninja стремится быть ассемблером.

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

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

Пример кода

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

cflags = -Wall

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

build foo.o: cc foo.c

Критика

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

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

См. также

Примечания

Шаблон:Примечания

Ссылки

Шаблон:Системы автоматизации сборки