ИНЖЕНЕРИЯ СБОРКИ
Системы сборки — невидимый фундамент больших C++-проектов. Разбираем по шагам: от препроцессора и линковщика до CMake, кэшей и герметичных билдов.
Конвейер: от исходника до бинарника
Исходный код
.cpp · .h — текстТо, что пишет человек. Сам по себе — ещё не программа, а набор файлов.
Препроцессор
#include · макросыРаскрывает включения и макросы. На выходе — чистый текст без директив.
Компилятор
→ объектные файлы .oКаждая единица трансляции переводится в машинный код независимо от других.
Линковщик
символы · библиотекиСшивает объекты и библиотеки, разрешает ссылки между символами.
Бинарник
./app — исполняемый файлГотово. Или классика жанра: «undefined reference to ...».
стадий проходит исходник, прежде чем станет программой
повторных компиляций гасит ccache в типичном CI
реальный разгон сборки на 16 ядрах (не 16 — линковка и зависимости)
год рождения Make — создан в Bell Labs Стюартом Фелдманом
Что ломается без системы сборки
«Собирается только у меня»
Флаги компиляции, версии тулчейна и пути к библиотекам нигде не зафиксированы — сборка невоспроизводима на другой машине.
Часы перекомиляции
Правка одного заголовка заставляет компилировать пол-проекта. Без графа зависимостей и кэшей разработчик просто ждёт.
Ад зависимостей
Порядок линковки, циклические включения, дубликаты символов. Всё это лечится явным графом целей и декларативными правилами.
Дрейф конфигураций
Разные флаги в Debug, Release и CI порождают плавающие баги. Пресеты и зафиксированные тулчейны устраняют разночтения.
Экосистема инструментов
CMake
мета-система · стандартДе-факто стандарт индустрии. Описывает цели и зависимости на высоком уровне, генерирует нативные проекты: Make, Ninja, Visual Studio, Xcode.
разбор с примерами →GNU Make
классика · с 1976Правила «цель → зависимости → рецепт». Прост для малых проектов, беспощаден на больших.
→ MakefileNinja
генератор · скоростьМинималистичный исполнитель, заточенный под миллионы целей. Любимая пара для CMake.
→ build.ninjaMeson
высокий уровеньПитоно-подобный синтаксис, скорость Ninja, дружелюбные сообщения об ошибках.
→ meson.buildBazel
монорепозиторииГерметичные и воспроизводимые сборки. Масштаб Google: тысячи пакетов, удалённый кэш.
→ сравнениеxmake
Lua · из коробкиКонфигурации на Lua, встроенный менеджер пакетов, быстрый старт без внешней обвязки.
→ сравнениеMSBuild
Windows · .slnДвижок сборки Visual Studio. Файлы проектов .vcxproj и решения .sln.
→ сравнениеSCons
Python как конфигКонфигурация — обычный Python-скрипт. Точный учёт зависимостей по хэшам содержимого.
→ сравнение