Перейти к основному содержимому

Build System

Система сборки

DCR поддерживает 4 бэкенда компиляции. Выбор происходит автоматически на основе расширения файла и target triple.

БэкендФайлыКогда используется
unix_cc.c, .cpp, .cxx, .cc, .s, .Sgcc/clang на Linux/macOS/BSD
msvc.c, .cpp, .cxx, .ccWindows (cl, clang-cl)
gas.s, .SARM/ARM64 ассемблер
nasm.asmx86/x86_64 ассемблер

Unix CC

  • Компилятор определяется через resolve_compiler(): CC/CXX из [toolchain], DCR_COMPILER/env, PATH
  • Поддерживает генерацию .d файлов для header dependency tracking
  • Флаги: -std=, -MMD -MF, -c -o, -I, -L, -l

MSVC

  • Поддерживает cl.exe и clang-cl.exe
  • Флаги: /std:, /Fo:, /Fe:, /I, /link

GAS / NASM

  • GAS: -I, -c -o, --defsym
  • NASM: -I, -c -o, -D, -f (формат: win64/elf64/macho64/macho32/elf32)

Incremental Builds

Три уровня инкрементальности:

  1. mtime — если выходной файл новее всех входных, файл не перекомпилируется
  2. .d files — отслеживание изменений в заголовочных файлах (включая транзитивные)
  3. SHA256 fingerprint — если флаги компиляции изменились, файл перекомпилируется (fingerprint хранится в .dcr_fingerprint)

Parallel Compilation

  • Используется thread::scope для создания пула потоков
  • Атомарная очередь задач (AtomicU64)
  • Мьютекс на запись в stdout (OUTPUT_MUTEX)
  • Количество потоков = available_parallelism()

Build Kinds

KindТипВыход
binИсполняемый файлtarget/<profile>/<name> (.exe)
staticlibСтатическая библиотекаtarget/<profile>/lib<name>.a (.lib)
sharedlibДинамическая библиотекаtarget/<profile>/lib<name>.so (.dll/.dylib)
efiUEFI приложениеtarget/<profile>/<name>.efi
elfELF без стандартной библиотекиtarget/<profile>/<name>
noneТолько компиляция, без линковки
customПолный контроль filename + extensiontarget/<profile>/<filename>.<extension>

Build Steps

DCR поддерживает pre-build и post-build шаги через Qt codegen:

  • moc — Meta-Object Compiler: {stem}.h → moc_{stem}.cpp
  • uic — UI Compiler: {stem}.ui → ui_{stem}.h
  • rcc — Resource Compiler: {stem}.qrc → qrc_{stem}.cpp

Подстановки: {stem}, {in}, {out}.

pkg-config

Автоматический поиск:

[build]
pkg_config = ["sdl2", "gl"]

DCR вызывает pkg-config --cflags sdl2 gl и pkg-config --libs sdl2 gl и добавляет результат в флаги компиляции/линковки.

Variable Substitution

В полях cflags, ldflags, filename, extension, out_dir, cmd поддерживаются подстановки:

ПеременнаяОписание
{version}Версия пакета
{profile}Имя профиля (debug/release/...)
{name}Имя пакета