Build System
Compiler Backends
DCR supports 4 compilation backends. Selection is automatic based on file extension.
| Backend | Files | When used |
|---|---|---|
unix_cc | .c, .cpp, .cxx, .cc, .S | gcc/clang on Linux/macOS/BSD |
msvc | .c, .cpp, .cxx, .cc | Windows (cl, clang-cl) |
gas | .s | ARM/ARM64 assembler (no preprocessor) |
nasm | .asm | x86/x86_64 assembler |
Unix CC
- Compiler resolved via
resolve_compiler():DCR_COMPILER>DCR_CC>[toolchain]>build.compiler>PATH - Supports
.dfiles for header dependency tracking - Flags:
-std=,-MMD -MF,-c -o,-I,-L,-l
MSVC
- Supports cl.exe and clang-cl.exe
- Flags:
/std:,/Fo:,/Fe:,/I,/link
GAS / NASM
- GAS:
-I,-c -o,--defsym - NASM:
-I,-o,-D,-f(format: win64/elf64/macho64/macho32/elf32)
Incremental Builds
Three levels of incrementality:
- mtime — if output is newer than all inputs, skip
.dfiles — header change tracking (including transitive)- SHA256 fingerprint — recompile if compiler flags changed (stored in
.dcr_fingerprint)
Parallel Compilation
thread::scopefor thread pool- Atomic task queue (
AtomicU64) - Mutex on stdout (
OUTPUT_MUTEX) - Thread count =
available_parallelism()
Build Kinds
| Kind | Type | Path (Linux example) |
|---|---|---|
bin | Executable | target/<triple>/<profile>/<name> (.exe on Windows) |
staticlib | Static library | target/<triple>/<profile>/lib<name>.a (.lib) |
sharedlib | Dynamic library | target/<triple>/<profile>/lib<name>.so (.dll/.dylib) |
efi | UEFI application | target/<triple>/<profile>/<name>.efi |
elf | ELF without stdlib | target/<triple>/<profile>/<name> |
none | Compile only, no link | — |
custom | Full filename+extension control | target/<triple>/<profile>/<filename>.<extension> |
Build Steps
DCR supports pre-build and post-build steps:
build.steps— commands before compilationbuild.post_steps— commands after compilation
Substitutions: {stem}, {in}, {out}, {profile}, {version}, {name}.
Example Qt codegen via build steps:
[build.steps]
moc = "moc {in} -o {out}"
pkg-config
Automatic lookup (read from raw config):
[build]
pkg_config = ["sdl2", "gl"]
DCR runs pkg-config --cflags sdl2 gl and pkg-config --libs sdl2 gl and adds results to compiler/linker flags.
Variable Substitution
Supported variables:
| Variable | Description |
|---|---|
{version} | Package version |
{version_major} | Major version part |
{version_minor} | Minor version part |
{version_patch} | Patch version |
{version_suffix} | Suffix (e.g., -rc1) |
{version_suffix_dash} | Suffix with dash |
{profile} | Profile name (debug/release) |
{name} | Package name |