[build::eng]
инженерия сборки · учебный курс

ИНЖЕНЕРИЯ СБОРКИ

// на языке C++

Системы сборки — невидимый фундамент больших C++-проектов. Разбираем по шагам: от препроцессора и линковщика до CMake, кэшей и герметичных билдов.

g++ 13.2-std=c++20Ninja 1.12CMake 3.28
dev@builder: ~/engine-lab — zsh
эмуляция: cmake + ninja
01

Конвейер: от исходника до бинарника

STAGE 01

Исходный код

.cpp · .h — текст

То, что пишет человек. Сам по себе — ещё не программа, а набор файлов.

STAGE 02

Препроцессор

#include · макросы

Раскрывает включения и макросы. На выходе — чистый текст без директив.

STAGE 03

Компилятор

→ объектные файлы .o

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

STAGE 04

Линковщик

символы · библиотеки

Сшивает объекты и библиотеки, разрешает ссылки между символами.

STAGE 05

Бинарник

./app — исполняемый файл

Готово. Или классика жанра: «undefined reference to ...».

0

стадий проходит исходник, прежде чем станет программой

0

повторных компиляций гасит ccache в типичном CI

0

реальный разгон сборки на 16 ядрах (не 16 — линковка и зависимости)

0

год рождения Make — создан в Bell Labs Стюартом Фелдманом

02

Что ломается без системы сборки

01

«Собирается только у меня»

Флаги компиляции, версии тулчейна и пути к библиотекам нигде не зафиксированы — сборка невоспроизводима на другой машине.

02

Часы перекомиляции

Правка одного заголовка заставляет компилировать пол-проекта. Без графа зависимостей и кэшей разработчик просто ждёт.

03

Ад зависимостей

Порядок линковки, циклические включения, дубликаты символов. Всё это лечится явным графом целей и декларативными правилами.

04

Дрейф конфигураций

Разные флаги в Debug, Release и CI порождают плавающие баги. Пресеты и зафиксированные тулчейны устраняют разночтения.

Рабочее место инженера сборки CI-ночь · релиз 2.4.1
// сборка — это тоже код: её нужно ревьюить и тестировать
03

Экосистема инструментов

CMake

мета-система · стандарт

Де-факто стандарт индустрии. Описывает цели и зависимости на высоком уровне, генерирует нативные проекты: Make, Ninja, Visual Studio, Xcode.

разбор с примерами →

GNU Make

классика · с 1976

Правила «цель → зависимости → рецепт». Прост для малых проектов, беспощаден на больших.

→ Makefile

Ninja

генератор · скорость

Минималистичный исполнитель, заточенный под миллионы целей. Любимая пара для CMake.

→ build.ninja

Meson

высокий уровень

Питоно-подобный синтаксис, скорость Ninja, дружелюбные сообщения об ошибках.

→ meson.build

Bazel

монорепозитории

Герметичные и воспроизводимые сборки. Масштаб Google: тысячи пакетов, удалённый кэш.

→ сравнение

xmake

Lua · из коробки

Конфигурации на Lua, встроенный менеджер пакетов, быстрый старт без внешней обвязки.

→ сравнение

MSBuild

Windows · .sln

Движок сборки Visual Studio. Файлы проектов .vcxproj и решения .sln.

→ сравнение

SCons

Python как конфиг

Конфигурация — обычный Python-скрипт. Точный учёт зависимостей по хэшам содержимого.

→ сравнение
Готовы разбирать конвейер по винтикам? Раздел 01 · ОсновыРаздел 03 · Практика