c-cpp-cookies
  • Полезные материалы
    • About
  • Настройка окружения
    • Git
      • Git CLI
      • Git GUI
      • Git Web
      • Git в среде разработке
        • Visual Studio
        • Visual Studio Code
        • CLion
        • Qt Creator
    • Стандарты (они же ISO)
    • Qt about
    • IDE
      • Visual Studio Code
        • Код в Visual Studio Code
        • Разработка в Visual Studio Code
      • Visual Studio
        • Настройки Visual Studio и проектов
        • Код в Visual Studio
        • Visual Studio + GitHub
      • Qt + Qt Creator
        • Установка Qt и QtCreator
        • Примеры проектов на Qt
      • CLion
        • Настройки CLion
        • Код в CLion
        • CLion + GitHub
    • Компиляторы
      • Clang + Visual Studio
      • Clang + CLion
  • Best practices
    • Антипаттерны и способы улучшения кода
      • 0. Освобождение ресурсов
      • 1. Чтение данных из файла
      • 2. Открытие файлов
      • 3. Объявление переменных
      • 4. Выделение памяти
      • 5. Необдуманный код
      • 6. Глубокие if
      • 7. Длинные if
      • 9. Non-void функции
      • 10. Создание массивов
      • 11. Проверка формата файла
  • Сборка программы
    • Сборка программы
    • Системы сборки / Build systems
      • Проект и решение
      • Make
      • Ninja
      • CMake
      • MSBuild
    • Подключение внешних библиотек
    • Библиотеки
  • Отладка
    • Отладка / Debugging
    • Запуск программы
    • Точки останова / Breakpoints
      • Обычные точки останова / General breakpoint
      • Условные точки останова / Conditional breakpoint
      • Зависимые точки останова / Dependent breakpoint
      • Временные точки останова / Temporary breakpoint
      • Точки трассировки / Breakpoint actions и tracepoints
    • Стек вызовов / Call stack
    • Локальные переменные / Locals
    • Просмотр области памяти / Memory view
    • Исключения / Exceptions
  • Анализ
    • Поиск утечек памяти
    • Санитайзеры
  • Возможности IDE
    • Возможности IDE
    • Продвинутый текстовый редактор
    • Закладки / Bookmarks
    • Платформы / Platforms
    • Конфигурации сборки / Build configurations
    • Шаблонные проекты / Project templates
    • Терминал / Terminal
    • Сборка / Build
    • Запуск программы / Run program
    • Code style
    • Работа с Github Actions
  • Тестирование
    • Тестирование
    • Google test
      • Gtest в VS
      • Gtest в CLion
      • Gtest в VSCode
    • Покрытие кода (code coverage)
Powered by GitBook
On this page
  1. Сборка программы
  2. Системы сборки / Build systems

Ninja

PreviousMakeNextCMake

Last updated 9 months ago

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

Пример базового файла build.ninja:

cflags = -Wall

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

build hello.o: cc hello.c

Используемые понятия:

  • Узел (Node) – это просто файл. Входной (исходники), выходной (объектные файлы) – это все узлы или вершины графа.

  • Правило (Rule) – по сути это просто команда с шаблоном аргументов. Например, вызов gcc – правило, а его аргументы – $FLAGS $INCLUDES $DEFINES и еще какие-то общие аргументы.

  • Ребро (Edge) – соединяет несколько входных узлов и один выходной узлов, посредством Правила. Вся система сборки основана на том, что последовательно обходит граф, выполняя команды для ребер. Как только все ребра обработаны, проект собран.

  • Состояние (State) – это контейнер со всем вышеперечисленным, который система сборки и использует.

cmake_generated_build.ninja
# CMAKE generated file: DO NOT EDIT!
# Generated by "Ninja" Generator, CMake Version 3.24
# =============================================================================
# Project: DebuggingExample
# Configurations: Debug
# =============================================================================
ninja_required_version = 1.5
CONFIGURATION = Debug
include CMakeFiles/rules.ninja
cmake_ninja_workdir = .../cmake-build-debug/
...

build CMakeFiles/DebuggingExample.dir/main.c.obj: C_COMPILER__DebuggingExample_Debug .../main.c || cmake_object_order_depends_target_DebuggingExample
  DEP_FILE = CMakeFiles\DebuggingExample.dir\main.c.obj.d
  FLAGS = -g -fdiagnostics-color=always -std=gnu2x
  INCLUDES = -I.../DebuggingExample/.
  OBJECT_DIR = CMakeFiles\DebuggingExample.dir
  OBJECT_FILE_DIR = CMakeFiles\DebuggingExample.dir

build DebuggingExample.exe: C_EXECUTABLE_LINKER__DebuggingExample_Debug CMakeFiles/DebuggingExample.dir/main.c.obj
  FLAGS = -g
  LINK_LIBRARIES = -lkernel32 -luser32 -lgdi32 -lwinspool -lshell32 -lole32 -loleaut32 -luuid -lcomdlg32 -ladvapi32
  OBJECT_DIR = CMakeFiles\DebuggingExample.dir
  POST_BUILD = cd .
  PRE_LINK = cd .
  TARGET_FILE = DebuggingExample.exe
  TARGET_IMPLIB = libDebuggingExample.dll.a
  TARGET_PDB = DebuggingExample.exe.dbg

build DebuggingExample: phony DebuggingExample.exe

build all: phony DebuggingExample.exe

default all
GitHub - ninja-build/ninja: a small build system with a focus on speedGitHub
Logo