Ninja

Программные средства разработки

Модераторы: Olej, vikos

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 12:36

Система сборки Ninja.
Предложена Google взамен много десятилетней системе make.
Аргументация: значительное ускорение сборки крупных проектов (первоначально была применена в сборке Chromium/Chrome, компиляция-сборка которого может идти и часы).

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 12:41

В 2-х словах, "на пальцах", описана в не очень свежей публикации (2012-2013) Ninja:
(перевод) от автора разработки Ninja:
Ninja является системой сборки проектов, аналогичной системе Make. В качестве ее входных данных используются команды, необходимые для преобразования исходных файлов в целевые файлы. Ninja использует эти команды для поддержания целевых файлов в актуальном состоянии. В отличие от многих других систем сборки проектов, главная цель процесса проектирования системы Ninja заключалась в достижении максимальной скорости работы.

Я разрабатывал Ninja во время работы над Google Chrome. Работа над Ninja была начата в рамках эксперимента, нацеленного на установление того, может ли быть ускорена сборка Chrome. Для возможности успешной сборки Chrome была добавлена дополнительная цель процесса проектирования: система Ninja должна была без лишних сложностей интегрироваться в состав более масштабной системы сборки проектов.
Я работал над Chrome с 2007 до 2012 года, а разработку системы Ninja начал в 2010 году. Существует множество факторов, влияющих на производительность процесса сборки такого значительного проекта, как Chrome (на сегодняшний день исходный код проекта состоит из 40000 файлов кода на языке C++, на основе которых генерируется бинарный файл размером около 90МБ). Во время работы я исследовал многие из них, начиная от распределения процесса компиляции между несколькими машинами и заканчивая различными приемами, направленными на оптимизацию процесса связывания. Система Ninja в большей степени использует единственный фактор - фронт сборки. Этот параметр характеризует период времени ожидания с начала сборки до момента выполнения первой операции компиляции. Для понимания важности этого фактора необходимо понять сформулированные нами принципы достижения высокой производительности самого браузера Chrome.
Действительно ли миллисекунды имеют такое большое значение? При рассмотрении более важных проблем программного обеспечения беспокойство о них может оказаться глупым. Однако, после работы над проектами, которые собираются долго, мне показалось, что повышается не только продуктивность работы; быстрый цикл сборки придает ощущение легкости, которое доставляет радость при работе с проектом. А наличие кода, с которым приятно работать, является главной причиной разработки мною программного обеспечения. В этом смысле скорость имеет первоочередное значение.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 12:56

Полное описание системы от разработчиков - более чем "необходимо и достаточно" для использования, The Ninja build system :
v1.10.2, Nov 2020

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 13:36

Olej писал(а):
14 фев 2021, 12:56
Полное описание системы от разработчиков - более чем "необходимо и достаточно" для использования, The Ninja build system :
Простейший пример использования ... который я допишу в уже существующий ранее тест с Makefile ... содержимое файла build.ninja:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ cat build.ninja 
cppflags = -Wall -pedantic -std=c++17

rule cpp
  command = g++ $cppflags -c $in -o $out

build vla: cpp vla.cc
P.S. Тут же, для сравнения, аналогичный файл более привычного Makefile, применявшийся раньше для сборки теста:

Код: Выделить всё

CXX += -Wall -pedantic -std=c++17

all: vla

vla:    vla.cc
        $(CXX) $< -o $@
Аналогия очевидная...
Вложения
VLA.tgz
(7.37 КБ) 39 скачиваний

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 13:44

Olej писал(а):
14 фев 2021, 13:36
Простейший пример использования
Сборка:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ninja
[1/1] g++ -Wall -pedantic -std=c++17 -c vla.cc -o vla
vla.cc: In function ‘int main(int, char**)’:
vla.cc:17:6: warning: ISO C++ forbids variable length array ‘arr_num’ [-Wvla]
   17 |  int arr_num[ num ]; // Variable-Length Arrays (ISO/IEC 9899:1999)
      |      ^~~~~~~
vla.cc:27:7: warning: ISO C++ forbids variable length array ‘arr_log’ [-Wvla]
   27 |  bool arr_log[ num2 ];
      |       ^~~~~~~
Результат:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ls -l vla
-rw-rw-r-- 1 olej olej 26104 фев 14 12:20 vla

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ./vla 30
< -74  51  -8  7  -56  -91  36  36  87  -23  4  67  -94  -90  6  34  -99  -23  -87  -17  38  18  87  70  5  -82  31  -17  40  82 >
< -  +  -  +  -  -  +  +  +  -  +  +  -  -  +  +  -  -  -  -  +  +  +  +  +  -  +  -  +  + >
(это не важно что оно там считает ;-) )

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 14 фев 2021, 13:49

Olej писал(а):
14 фев 2021, 13:44
Сборка:
Варианты запуска:

Код: Выделить всё

olej@nvme:~$ ninja -h
usage: ninja [options] [targets...]

if targets are unspecified, builds the 'default' target (see manual).

options:
  --version      print ninja version ("1.10.0")
  -v, --verbose  show all command lines while building

  -C DIR   change to DIR before doing anything else
  -f FILE  specify input build file [default=build.ninja]

  -j N     run N jobs in parallel (0 means infinity) [default=3 on this system]
  -k N     keep going until N jobs fail (0 means infinity) [default=1]
  -l N     do not start new jobs if the load average is greater than N
  -n       dry run (don't run commands but act like they succeeded)

  -d MODE  enable debugging (use '-d list' to list modes)
  -t TOOL  run a subtool (use '-t list' to list subtools)
    terminates toplevel options; further flags are passed to the tool
  -w FLAG  adjust warnings (use '-w list' to list warnings)
Указание конкретной цели, которых внутри build.ninja может быть много:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ninja vla
[1/1] g++ -Wall -pedantic -std=c++17 -c vla.cc -o vla
vla.cc: In function ‘int main(int, char**)’:
vla.cc:17:6: warning: ISO C++ forbids variable length array ‘arr_num’ [-Wvla]
   17 |  int arr_num[ num ]; // Variable-Length Arrays (ISO/IEC 9899:1999)
      |      ^~~~~~~
vla.cc:27:7: warning: ISO C++ forbids variable length array ‘arr_log’ [-Wvla]
   27 |  bool arr_log[ num2 ];
      |       ^~~~~~~
То же самое, но в 4 параллельных потока сборки:

Код: Выделить всё

olej@nvme:~/2021/OWN_TEST.codes/VLA$ ninja -j4 vla
[1/1] g++ -Wall -pedantic -std=c++17 -c vla.cc -o vla
vla.cc: In function ‘int main(int, char**)’:
vla.cc:17:6: warning: ISO C++ forbids variable length array ‘arr_num’ [-Wvla]
   17 |  int arr_num[ num ]; // Variable-Length Arrays (ISO/IEC 9899:1999)
      |      ^~~~~~~
vla.cc:27:7: warning: ISO C++ forbids variable length array ‘arr_log’ [-Wvla]
   27 |  bool arr_log[ num2 ];
      |       ^~~~~~~

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 19 авг 2021, 15:44

Olej писал(а):
14 фев 2021, 13:36
Простейший пример использования
Следующий вопрос рассмотрения - возможность генерирования build.ninja файла сценария Ninja из-под CMake ... это новая (относительно) возможность, задекларированная сначала под Windows и MacOS.
И есть ли под Linux? ... тут многое будет зависеть от версий!

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 19 авг 2021, 20:29

Olej писал(а):
19 авг 2021, 15:44
Следующий вопрос рассмотрения - возможность генерирования build.ninja файла сценария Ninja из-под CMake ... это новая (относительно) возможность, задекларированная сначала под Windows и MacOS.
И есть ли под Linux? ... тут многое будет зависеть от версий!
Вопрос изучен и ...
Для последних версий CMake, вполне доступных для установки в любой дистрибутив Linux - СMake обеспечивает генерацию скриптов сборки через систему Ninja.
Всё подробно, последовательно по шагам, с примерами, показано (чтобы не повторяться) здесь: CMake.

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 19 авг 2021, 21:02

Вопрос: Почему такой интерес (мой и по публикациям вообще) к Ninja в противовес make?

Ответы (как я их понимаю или предполагаю):

1. Утверждается, что инкрементная сборка Ninja намного быстрее чем традиционного make;
2. Эту систему сборки (вместе с GN) используется и проталкивается Google (Chromium и др.) - все кто хотели бы включить в свои корпоративные проекты какие-то инструментарии Chromium, гораздо легче их включают используя с ними единую систему сборки;
3. Возможно, скрипты мета-генератора GN, используемого Google для Ninja в своих проектах, писать для крупных проектов проще, чем для публичного мета-генератора CMake ... а вручную скрипты Makefile и для Ninja для таких проектов никто не пишет (громоздко и сложно);

Что ещё?

Аватара пользователя
Olej
Писатель
Сообщения: 21338
Зарегистрирован: 24 сен 2011, 14:22
Откуда: Харьков
Контактная информация:

Re: Ninja

Непрочитанное сообщение Olej » 19 авг 2021, 21:09

Olej писал(а):
19 авг 2021, 21:02
инкрементная сборка Ninja намного быстрее чем традиционного make
Но вот конкретных цифр я особенно не нашёл ... а вот такая конкретная публикация Make vs Ninja Performance Comparison
Jan 31, 2015
...
I wanted to measure the performance of Make and Ninja for several projects, namely chrono and ogre.
Chrono 383 files
Ogre 495 files
Здесь утверждается (экспериментально на 2-х проектах) что скорости make и Ninja на полных сборках больших проектов практически не различаются
Вот заключительная фраза статьи:
Ninja и Make очень близки по производительности. У него меньше накладных расходов при выполнении инкрементных сборок, но для полных сборок прирост производительности будет незначительным.

Ответить

Вернуться в «Инструменты программирования»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 3 гостя