Changelog
Unreleased
- Download mirrors in
dcrup—--mirror auto|cf|gh|sf|yaandDCRUP_MIRROR. Defaultautotries cf → gh → sf → ya (CloudFlare CDN, GitHub, SourceForge, Yandex CDN). - Removed
install.sh/install.ps1/install_bsd.sh— superseded bydcrup.
0.8.5 (2026-08-08)
package.dcr-version— optional CLI version pin indcr.toml.dcr new/dcr initwrite the current version. On config load:- missing / empty pin → warn "add dcr-version";
- dcr older than pin → warn "update dcr";
- dcr newer than pin → warn "check changelog, update pin";
- equal → silent. Commands do not fail, warning only (once per path per process).
0.8.4 (2026-08-04)
Added:
.dcr/directory — shared machine-readable build facts for IDE integrations:.dcr/compile_commands.json.dcr/build-info.json(schemaVersion,artifact_path,profile, …).dcr/toolchain.json(compiler/debugger paths, moc/uic/rcc).dcr/ide/(placeholder for IDE lock files)
dcr gen project-info—target,target_dir,artifact_path,artifact_kind,source_roots,include_globs,exclude_globs; absolute/canonical paths.dcr build --print-artifact-path— one absolute artifact path line on stdout after a successful build.dcr gen … --quiet/-q— suppress human success logs for gen subcommands..clangd— created on first gen withCompilationDatabase: .dcr(# managed by dcr gen); custom.clangdis not overwritten.- Helpers
canonicalize_path,atomic_write,ensure_dcr_dir; pureresolve_artifact_pathviaplatform::*. dcr new/dcr init— add.dcr/to.gitignore.
Changed (breaking):
compile_commands.jsonmoved from project root to.dcr/compile_commands.json.
clangd discovers it via.clangd/--compile-commands-dir=.dcr.
CLion and VSCode generators updated accordingly.- Atomic write for compile_commands (tmp + rename).
gen vscode/gen clionlaunch/run — use the same artifact path resolver asproject-info/build-info.json.
Fixed:
- Launch configs no longer hardcode
target/<profile>/<name>without the Linux triple segment. - Symlink/mount roots: best-effort canonicalize for root and compile database paths.
0.8.3 (2026-08-03)
Added
dcr run -- <args>...— cargo-style argument forwarding after a bare--
(dcr run --release -- --test_help). Applies to direct binary runs and[run].cmd.- Tests — host target section
ldflagswithout CLI--target; run-arg forwarding;split_double_dashunit tests.
Changed
- Native builds resolve the host triple — without
--target/ packagebuild.target, host sections such as
[build.x86_64-unknown-linux-gnu]apply again (cflags/ldflags/ toolchain).
Previously the target was empty and those sections were ignored while artifacts already used the host triple path. - Empty target — no more
Unknown target ''warning. dcr run --help/ mandcr-run— document--forwarding.
Fixed
- Native artifact paths on Windows and macOS — without an explicit
--target/build.target, artifacts usetarget/<profile>, sodcr runand flat-bin find the build output. - Target-specific
ldflagsmissing on native host builds (e.g. micro-lang +libsct-elf). - Spurious empty-target warning.
0.8.2 (2026-07-22)
Added
- Compile progress
[N/M]— live TTY status line (compile pkg v0.1.0 [12/41]) so long mono-package builds do not look hung. - DCR status style — fixed-width verbs:
project,compile,dep,ready,pack,done,run. - Cargo feature
archive— optional FAT packing viafatfs(cargo build --features archive). Release CI builds with the feature; without it[archive]fails with a clear message. - Tests —
flat_bin_nasm_build, packagebuild.targetwithout CLI--target, stricter workspaceclean --all. - CI expansion — unit + integration on Linux/macOS/Windows, archive feature job, rust-cache, clippy default + all-features (see
.github/workflows/ci.yml).
Changed
- No forced host triple from CLI — without
--target, package/memberbuild.targetis honored (bare-metal / ISOpost_stepspaths). - Relative include/lib flags (
-I,-i,-isystem,-idirafter,-L,-T) absolutized against the package root under workspace builds. dcr clean --all— no spam for members without a localtarget/(shared roottarget/).error/warn— red / yellow on stderr; CLI fully English (Hint:).- Help / man — list
add,lint,setup; unknown command exits with code 1. - Tool NotFound —
linker not found: ld.lld …/{tool} not found …instead of rawos error 2.
0.8.1 (2026-07-20)
Added
build.kind = "flat-bin"— raw binary (default.bin) for OS-dev payloads:- NASM —
-f bin→<stem>.bin - FASM — direct output (
format binaryin source) - GAS / MASM / LLC — object →
objcopy -O binary→<stem>.bin - C/C++ — objects → freestanding link →
objcopy -O binary→<name>.bin - Requires
llvm-objcopy/objcopy/gobjcopyexcept for NASM/FASM direct emit
- NASM —
[archive]section — FAT12/16/32 disk images after build (output,format,size,offset,label,bootsector,layout). From 0.8.2 requires featurearchive.- Single-file
build.roots— a root may be a single source or header file, not only a directory.
Changed
--forcealso re-runsbuild.stepsandbuild.post_steps.dcr runon workspace-only root — if[run].cmdis set, run that after build; otherwise delegate to a workspace member.
0.8.0 (2026-07-18)
Added
- Dedicated Build Engine (
src/core/build/engine.rs) — decoupled the build orchestration logic completely from the CLI front-end wrapper insrc/cli/build.rsto a reusable, decoupled core build engine. - Polymorphic Language Model (
Languagetrait) — introduced the abstractLanguagetrait (src/core/build/language/mod.rs). File scanning, compiler resolution, and flags handling are now encapsulated in dedicated language modules for C, C++ (including Qt code generation), LLVM IR, and ASM (GAS, NASM, FASM, MASM). - Polymorphic Compilation Dispatch (
Buildertrait) — introduced theBuildertrait to generalize builder invocations (src/core/build/builder/mod.rs). Consolidated GCC/Clang logic intobuilder/cc_common.rsand Microsoft Visual C++ logic intobuilder/msvc/. - Per-Language Configuration overrides (
[build.<lang>]) — introduced support for configuring language-specific compiler, standard, and flags (e.g.[build.c],[build.cxx],[build.asm]) independently indcr.toml. - Automatic Workspace Dependency Injection — during workspace builds, include/lib paths of dependent workspace members (including their source headers, local
include/folders, and build targettarget/include/target/libfolders) are automatically resolved and injected. BuildReporterEvent System — decoupled build orchestration output into a structured event-driven reporter model (src/core/build/report.rs), making DCR suitable for library embedding and IDE integrations without stderr capturing.- Build Cancellation Support — introduced thread-safe cancellation tokens (
Arc<AtomicBool>) allowing clients to safely abort compile runs mid-execution. - TOML Formatting & Custom Keys Preservation — migrated the config editor to
toml_edit, preserving all unknown/user-defined TOML keys, structures, and comments during file write operations (e.g., indcr add). - Path Dependencies Target Include Resolution — local path dependencies configured via tables now correctly expose headers built and packaged into their
target/includefolder to consumer packages. - Modular Integration Test Suite — refactored the monolith
tests/cli_basic.rsfile into clean, specialized integration tests:cli_build.rs,cli_deps.rs,cli_lint.rs,cli_new.rs,cli_qt.rs,cli_test.rs,cli_workspace.rs.
Changed
- Consolidated Linking and Archiving — artifact generation (linking executables/shared libraries and archiving static libraries) consolidated into a single
src/core/build/builder/artifact.rsmodule. - Workspace-Aware member execution —
dcr runexecuted at the workspace root of aworkspace_onlyproject now triggers the member build inside the workspace context using the--workspaceparameter, preventing standalone build issues. - Elimination of Global State — removed global variables and states from the build core, encapsulating build logic inside isolated
BuildContextstructs for thread safety. - Build Cache Separation — relocated mtime tracking, incremental caching, and header-dependency checking logic to
src/core/build/cache.rs. - Modularized Pre-build Steps — decoupled generator scripts and pre-build commands parsing into
src/core/build/steps.rs.
0.7.4 (2026-06-17)
Added
- Native Qt support — automatic meta-object handling (MOC, UIC, RCC) added when
build.qt = trueis set indcr.toml. dcr lintcommand — C/C++ static analysis viaclang-tidy. Supports--fixfor automatic fixes. Respectsbuild.rootsandbuild.src_disablefrom config.- Three new assembler backends:
- MASM (
compiler = "ml"/"ml64") — Microsoft Macro Assembler. - FASM (
compiler = "fasm") — Flat Assembler. - LLVM IR (
compiler = "llc") — compiles.llfiles viallc -filetype=obj.
- MASM (
- Shared ASM pipeline — linking and archiving logic consolidated into
core/builder/asm.rs. Adding a new assembler backend now takes ~30 lines. - Filesystem utilities —
to_hex()andhome_dir()extracted toutils/fs.rs. - Build utilities —
normalize_target(),normalize_kind(),normalize_platform(),default_profile_flags()extracted toutils/build.rs. - Backend helpers —
asm_lang_flag(),source_extensions(),elapsed_secs()added tocore/builder/common.rs. - Full Bare-Metal / Freestanding Automation — introduced the
build.freestanding = trueconfiguration option. When enabled (or when a bare-metal target is detected), DCR automatically injects-ffreestandingduring compilation and both-nostdliband-staticduring linking. - Artifact Optimization (LTO & Strip) — added
build.lto(auto-injects-fltofor compiler and linker) andbuild.strip(automatically strips debug symbols via linker-sflag) options todcr.toml. - Compilation Thread Control — added the
build.codegen-unitsoption to strictly limit the maximum number of parallel jobs utilized by the customparallel_buildworker pool. - Panic Behavior Management — added
build.panic = "abort"support. For C++ targets, it automatically strips exception handling and unwind tables via-fno-exceptions,-fno-unwind-tables, and-fno-asynchronous-unwind-tables.
Changed
- Intelligent Default Flags Generation — automated injection of fallback optimization (
-O3/-O0), debug (-g), and warning (-Wall -Wextra) flags is now suppressed for bare-metal and freestanding builds ifbuild.cflagsare overridden. - Centralized Bare-Metal Detection — relocated the
is_bare_metal_targethelper to common build utilities (src/utils/build.rs) for unified access across the building core. - Architectural Refactoring:
- Renamed
src/config.rstosrc/templates.rs. - Started consolidation of configuration and build orchestration logic.
- Renamed
0.7.3 (2026-06-13)
Added
--vcsoption fornewandinitcommands — introduced explicit version control system selection via--vcs <git|none>.- Git metadata integration in
--version— the CLI now appends the current short commit hash and a-dirtysuffix if there are uncommitted changes in the DCR repository. - Automatic
.gitignoregeneration — Git repository initialization now automatically writes a.gitignorefile excluding the/targetdirectory. - Nested repository prevention — automatic Git initialization is now skipped if
dcr newordcr initis executed inside an already existing Git repository. - VCS verification tests — added
new_vcs_options_workandinit_vcs_options_workintegration tests to ensure reliable repository behavior.
Changed
- Complete removal of
git2dependency — all Git actions (dependency fetching, VCS setup, status checks) are now delegated to the systemgitexecutable viaCommand. This simplifies compilation and drops the need forvendoredandopensslfeatures. - Migrated from
reqwesttoureq— replaced the heavyreqwestcrate inflag_update.rswith the lightweight synchronousureq 2.10client, reducing overhead and the final binary size.
0.7.2 (2026-06-07)
Added
default_target_triple()now respectstarget_env— Linux (gnu/musl) and Windows (msvc/gnu) use the correct environment instead of hardcoded values.
Fixed
- macOS Apple Silicon builds failed with
_mainundefined —--target=is now passed to ldflags, not just cflags.default_target_triple()usesstd::env::consts::ARCHon macOS instead of hardcodedx86_64. - GitHub Stars and GPL-3.0 badges not rendering in README — badge block converted to pure HTML.
Changed
- Default target resolution extracted into shared
default_target_triple()— removed duplication across build, run, clean.
0.7.1 (2026-06-02)
Added
--helpfor all commands —dcr build --help,dcr run --help,dcr new --help,dcr init --help,dcr clean --help,dcr add --help,dcr fmt --help,dcr setup --help,dcr tree --help,dcr gen --help,dcr --update --help,dcr test --help. All output uses styled headers (green) and usage lines (cyan).- Man pages — 12 troff pages in
man/man1/:dcr.1,dcr-build.1,dcr-run.1,dcr-new.1,dcr-init.1,dcr-clean.1,dcr-add.1,dcr-test.1,dcr-gen.1,dcr-fmt.1,dcr-tree.1,dcr-setup.1. - Man pages in all packaging — install.sh, install_bsd.sh, AUR PKGBUILD, Debian (cargo-deb), RPM (cargo-generate-rpm), Nix (postInstall), Homebrew (resource), Snap, GitHub Release assets.
- Project name validation —
dcr initanddcr newnow validate names before creating files. Only ASCII letters, digits,_and-are allowed. documentationandhomepagefields — added toCargo.toml.- Release profile optimizations —
opt-level = "z", LTO,codegen-units = 1,panic = "abort",strip = truefor smaller binaries. - Linux i686, armv7, riscv64 targets — added to release workflow and install scripts.
- Linux musl i686, armv7 targets — cross-compiled via zigbuild in CI.
- AUR packages —
dcr-dev,dcr-dev-binpublishing workflow. - Snap publishing — automated Snapcraft publishing in CI.
- Snap badge — in README.
Changed
validate_package_namemade public — callable from CLI commands.- README platform table — reorganized: libc variants as separate OS rows, removed extra columns. Linux architecture list updated.
gen.rsno-args output — now uses styled output instead of raweprintln!.tree.rs,fmt.rs, andsetup.rs— now accept arguments for--help.- README install commands —
| bash→| shfor POSIX compatibility.
Fixed
dcr new <invalid-name>creates directory then fails — validation now happens before any file operations.dcr initon invalid directory name — same fix.- Man pages missing in installed packages — now shipped in all formats.
- Windows drive letter false positive — in dependency file parser.
- CRLF (
\r\n) breaks dependency parser — now handles mixed line endings. - Newline after backslash not consumed — in
parse_d_fileescape handling.
0.7.0 (2026-06-01)
Added
- OpenBSD and NetBSD target support — full platform routing with dynamic target triples using
std::env::consts::ARCHandstd::env::consts::OS. Affectsbuild,run,cleancommands and the platform module. src/platform/bsd.rs— new BSD platform module (shared by FreeBSD, OpenBSD, NetBSD) providingbin_path,lib_path,elf_path,efi_path,shared_lib_path.build.out_dirconfig option — custom output directory that overrides the defaulttarget/<triple>/<profile>path for final artifacts. Supported inbuild,run, and config validation.dcr fmtcommand — new CLI command that formats all C/C++ source files (*.c,*.cpp,*.h,*.hpp) insrc/andtests/usingclang-format.- Incremental linking —
needs_link()incommon.rschecks if any object file is newer than the linked output, skipping unnecessary relinking. Implemented for all backends (unix_cc,msvc,gas,nasm). build.kind = "none"and"custom"— two new project kinds for special build scenarios that don't produce standard artifacts.install_bsd.sh— POSIX-compliant installation script for BSD systems (FreeBSD, OpenBSD, NetBSD) with binary download and source build modes.- Linux ARM64 support in
install.sh— addedLinux:aarch64|Linux:arm64target detection for pre-built binary downloads. - BSD OS detection in
install.sh— detects FreeBSD, OpenBSD, NetBSD and determines target triple. rust-toolchain.toml— explicit toolchain pinning tostablechannel.- Integration tests —
build_with_target_config(verifiesbuild.target = "linux") andbuild_with_out_dir(validates custom output directory). get_build_string_with_profilemadepub— sorun.rscan determine custom output directory configuration.
Changed
build.targetsemantics changed — now strictly contains a target triple (e.g.,x86_64-unknown-linux-gnu) or short name (linux,macos,windows). No longer used as custom output directory — this functionality moved tobuild.out_dir.build.standardmade optional — changed fromStringtoOption<String>. Validation only enforces non-empty for non-ASM languages. Skipped indcr.tomloutput if empty.dcr runwithout_dir— now determines target directory respectingbuild.out_dirviaget_build_string_with_profile()frombuild.rs.collect_sources()returns empty vector instead of error when no sources are found, allowingkind = "none"orkind = "custom"projects with no source files.- CI/CD release workflow refactored —
git2made target-specific (no vendored-openssl on Windows), Zig-based cross-compilation for non-x86_64 Linux targets, Arch Linux package version cleanup (dashes → dots),gmakesymlink for NetBSD. - README compatibility table — FreeBSD, OpenBSD, NetBSD build/run status upgraded from "community/best-effort" to "officially supported".
- Documentation updated —
build-section.mddescribes newbuild.targetandbuild.out_dirfields.target-directory.mdrewritten to clarify the distinction.
Fixed
- stdout/stderr not inherited in
dcr run— child process output was captured and manually printed, breaking interactive programs. Fixed by switching toCommand::status(). - Race condition in release CI — matrix build jobs could upload assets to a release that didn't exist yet. Fixed by adding a dedicated
create-releasejob. - Release GHA — stable toolchain override — fixed Rust toolchain override issues in CI.
- Arch Linux package version sanitization — version strings with dashes (e.g.,
0.7.0-dev) are invalid forpkgver. Fixed by replacing dashes with dots. - GPG permissions after Docker — Docker operations changed GPG directory ownership. Fixed by running
chownafter Docker commands. - RPM artifact paths — RPM artifacts were placed in
rpm/x86_64/instead offedora/x86_64/. Fixed in Dexoron Packages Index workflow. - JSON parsing reliability in
install.sh— addedjqas primary parser withpython3fallback for dev channel release lookup.
Removed
format_roots()helper function — removed fromcommon.rs. Was only used by the old error handling path incollect_sources().- Per-distribution artifact download steps — three separate
actions/download-artifactsteps replaced with unifiedgh release download --clobber.