> For the complete documentation index, see [llms.txt](https://skkv-itmo.gitbook.io/c-cpp-cookies/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://skkv-itmo.gitbook.io/c-cpp-cookies/build/build-systems.md).

# Системы сборки / Build systems

**Системы сборки** – это специальные программы, которые позволяют автоматически собрать код проекта по заданным правилам.

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

Помимо этого они занимаются *подключением к проекту библиотек и программ*.

Результатом работы системы сборки является директория, в которой находятся сгенерированные файлы, а также файл с дальнейшими командами для подчиненной (более низкоуровневой) системы сборки.

## Автоматизация сборки

**включает**:

* поиск зависимостей (заголовочных файлов и библиотек);
* генерацию различных версий кода в зависимости от платформы, на которой происходит сборка;
* генерация вспомогательных файлов;
* генерация команд для компиляции всех исходный файлов;
* сборка проекта;

**а также**:

* выполнение автотестов;
* развёртывание программы в целевой среде;
* составление сопроводительной документации или описание изменений новой версии;
* конфигурация и подготовка файлов к сборке;
* составление отчётов;
* ...

{% @mermaid/diagram content="stateDiagram-v2
direction TB
state description

```
state "Высоуровневые" as HL
{
state "Gradle" as gradle
state "SCons" as scons
    Meson
    CMake
    Autoconf
    MSBuild
}
state "Низкоуровневые" as LL
{
    state "Bash/pwsh/...<br> скрипт на любом языке" as scripts
    state "Вручную<br>через терминал" as manual
    Make
    Ninja
    NMake
}
MSBuild -->  NMake : used
Autoconf --> Make : used
CMake --> Make : used[unix]
CMake --> Ninja : used[windows]
Meson --> Ninja : used
MSBuild --> Ninja : used" %}
```
