150 Commits

Author SHA1 Message Date
06a2387e5d New translations workspaces.mdx (Ukrainian)
[ci skip]
2026-07-18 20:08:53 +08:00
92e5b3ce8f New translations workspaces.mdx (Russian)
[ci skip]
2026-07-18 20:08:52 +08:00
887e3b919c New translations workspaces.mdx (Polish)
[ci skip]
2026-07-18 20:08:51 +08:00
74fda0b894 New translations workspaces.mdx (German)
[ci skip]
2026-07-18 20:08:50 +08:00
2bc30de0ab New translations dependencies.mdx (Ukrainian)
[ci skip]
2026-07-18 20:08:48 +08:00
0a32df1d0d New translations dependencies.mdx (Russian)
[ci skip]
2026-07-18 20:08:47 +08:00
df476cec1a New translations dependencies.mdx (Polish)
[ci skip]
2026-07-18 20:08:46 +08:00
b2036ba46c New translations dependencies.mdx (German)
[ci skip]
2026-07-18 20:08:45 +08:00
154e6d27d0 New translations dcr-toml.mdx (Ukrainian)
[ci skip]
2026-07-18 20:08:43 +08:00
6000a27708 New translations dcr-toml.mdx (Russian)
[ci skip]
2026-07-18 20:08:42 +08:00
de0007d16c New translations dcr-toml.mdx (Polish)
[ci skip]
2026-07-18 20:08:41 +08:00
2ac38e6cce New translations dcr-toml.mdx (German)
[ci skip]
2026-07-18 20:08:39 +08:00
952b0488db New translations multi-package-workspace.mdx (Ukrainian)
[ci skip]
2026-07-18 20:08:38 +08:00
085c14e5a9 New translations multi-package-workspace.mdx (Russian)
[ci skip]
2026-07-18 20:08:37 +08:00
fe6191265c New translations multi-package-workspace.mdx (Polish)
[ci skip]
2026-07-18 20:08:36 +08:00
4bcf793a39 New translations multi-package-workspace.mdx (German)
[ci skip]
2026-07-18 20:08:34 +08:00
87585f3524 New translations license.mdx (Ukrainian)
[ci skip]
2026-07-18 20:08:33 +08:00
bc322577f9 New translations license.mdx (Russian)
[ci skip]
2026-07-18 20:08:32 +08:00
53e0ad953a New translations license.mdx (Polish)
[ci skip]
2026-07-18 20:08:31 +08:00
bc2c2a48f6 New translations license.mdx (German)
[ci skip]
2026-07-18 20:08:30 +08:00
df3a45dd7a New translations installation.mdx (Ukrainian)
[ci skip]
2026-07-18 20:08:28 +08:00
6c7a7ad03e New translations installation.mdx (Russian)
[ci skip]
2026-07-18 20:08:27 +08:00
377b244db4 New translations installation.mdx (Polish)
[ci skip]
2026-07-18 20:08:26 +08:00
d6d08fac57 New translations installation.mdx (German)
[ci skip]
2026-07-18 20:08:25 +08:00
a566e33051 New translations faq.mdx (Ukrainian)
[ci skip]
2026-07-18 20:08:24 +08:00
255663822b New translations faq.mdx (Russian)
[ci skip]
2026-07-18 20:08:23 +08:00
f3952c1c0d New translations faq.mdx (Polish)
[ci skip]
2026-07-18 20:08:21 +08:00
13b5616069 New translations faq.mdx (German)
[ci skip]
2026-07-18 20:08:20 +08:00
6ed40d0aad New translations system-commands.mdx (Ukrainian)
[ci skip]
2026-07-18 20:08:19 +08:00
7d07863c86 New translations system-commands.mdx (Russian)
[ci skip]
2026-07-18 20:08:18 +08:00
47592c952d New translations system-commands.mdx (Polish)
[ci skip]
2026-07-18 20:08:17 +08:00
9873a8d513 New translations system-commands.mdx (German)
[ci skip]
2026-07-18 20:08:16 +08:00
c41b3e7970 New translations project-commands.mdx (Ukrainian)
[ci skip]
2026-07-18 20:08:15 +08:00
37f1887011 New translations project-commands.mdx (Russian)
[ci skip]
2026-07-18 20:08:13 +08:00
c03fd37c14 New translations project-commands.mdx (Polish)
[ci skip]
2026-07-18 20:08:12 +08:00
1f5b8cdcee New translations project-commands.mdx (German)
[ci skip]
2026-07-18 20:08:11 +08:00
2f2c4aa208 New translations test-framework.mdx (Ukrainian)
[ci skip]
2026-07-07 11:22:40 +08:00
87bad94848 New translations test-framework.mdx (Russian)
[ci skip]
2026-07-07 11:22:39 +08:00
39bba3cea8 New translations test-framework.mdx (Polish)
[ci skip]
2026-07-07 11:22:38 +08:00
d498e67782 New translations test-framework.mdx (German)
[ci skip]
2026-07-07 11:22:36 +08:00
82de72ce8d New translations running-tests.mdx (Ukrainian)
[ci skip]
2026-07-07 11:22:35 +08:00
ffaf1f1dd1 New translations running-tests.mdx (Russian)
[ci skip]
2026-07-07 11:22:34 +08:00
c050ffb8c4 New translations running-tests.mdx (Polish)
[ci skip]
2026-07-07 11:22:33 +08:00
e9908f359d New translations running-tests.mdx (German)
[ci skip]
2026-07-07 11:22:32 +08:00
024bbfcaa9 New translations self-update.mdx (Ukrainian)
[ci skip]
2026-07-07 11:22:31 +08:00
4b8d78dac7 New translations self-update.mdx (Russian)
[ci skip]
2026-07-07 11:22:29 +08:00
50a2c59fed New translations self-update.mdx (Polish)
[ci skip]
2026-07-07 11:22:28 +08:00
184c44902c New translations self-update.mdx (German)
[ci skip]
2026-07-07 11:22:27 +08:00
44cb4f3665 New translations workspaces.mdx (Ukrainian)
[ci skip]
2026-07-07 11:22:26 +08:00
98fc25c40d New translations workspaces.mdx (Russian)
[ci skip]
2026-07-07 11:22:25 +08:00
fc968d07bd New translations workspaces.mdx (Polish)
[ci skip]
2026-07-07 11:22:24 +08:00
ba20bf7d3d New translations workspaces.mdx (German)
[ci skip]
2026-07-07 11:22:23 +08:00
787e89f779 New translations platform-support.mdx (Ukrainian)
[ci skip]
2026-07-07 11:22:21 +08:00
a67729a673 New translations platform-support.mdx (Russian)
[ci skip]
2026-07-07 11:22:20 +08:00
25cc7b8f3b New translations platform-support.mdx (Polish)
[ci skip]
2026-07-07 11:22:19 +08:00
bddbc3603a New translations platform-support.mdx (German)
[ci skip]
2026-07-07 11:22:18 +08:00
666794d33d New translations environment-variables.mdx (Ukrainian)
[ci skip]
2026-07-07 11:22:17 +08:00
e35f5e0ad1 New translations environment-variables.mdx (Russian)
[ci skip]
2026-07-07 11:22:16 +08:00
4ce4632a92 New translations environment-variables.mdx (Polish)
[ci skip]
2026-07-07 11:22:14 +08:00
aaa6c99795 New translations environment-variables.mdx (German)
[ci skip]
2026-07-07 11:22:13 +08:00
fe6ac220e6 New translations dependencies.mdx (Ukrainian)
[ci skip]
2026-07-07 11:22:12 +08:00
6622353ff8 New translations dependencies.mdx (Russian)
[ci skip]
2026-07-07 11:22:11 +08:00
b3f14d1e68 New translations dependencies.mdx (Polish)
[ci skip]
2026-07-07 11:22:09 +08:00
4cb8985bfb New translations dependencies.mdx (German)
[ci skip]
2026-07-07 11:22:08 +08:00
95bb204884 New translations dcr-toml.mdx (Ukrainian)
[ci skip]
2026-07-07 11:22:07 +08:00
bebda1fe8a New translations dcr-toml.mdx (Russian)
[ci skip]
2026-07-07 11:22:06 +08:00
f0e587b12b New translations dcr-toml.mdx (Polish)
[ci skip]
2026-07-07 11:22:02 +08:00
476f13676a New translations dcr-toml.mdx (German)
[ci skip]
2026-07-07 11:22:01 +08:00
fcf21b2b2e New translations cross-compilation.mdx (Ukrainian)
[ci skip]
2026-07-07 11:22:00 +08:00
cb519cc4fd New translations cross-compilation.mdx (Russian)
[ci skip]
2026-07-07 11:21:56 +08:00
32911212e8 New translations cross-compilation.mdx (Polish)
[ci skip]
2026-07-07 11:21:52 +08:00
3f506e79af New translations cross-compilation.mdx (German)
[ci skip]
2026-07-07 11:21:48 +08:00
fc657b8a99 New translations build-system.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:46 +08:00
462c53d93f New translations build-system.mdx (Russian)
[ci skip]
2026-07-07 11:21:45 +08:00
c9ff114b25 New translations build-system.mdx (Polish)
[ci skip]
2026-07-07 11:21:44 +08:00
746a26bae9 New translations build-system.mdx (German)
[ci skip]
2026-07-07 11:21:42 +08:00
b6b171b2a9 New translations build-profiles.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:41 +08:00
a1ccaebfd3 New translations build-profiles.mdx (Russian)
[ci skip]
2026-07-07 11:21:40 +08:00
a15470e669 New translations build-profiles.mdx (Polish)
[ci skip]
2026-07-07 11:21:39 +08:00
901ea9ebaa New translations build-profiles.mdx (German)
[ci skip]
2026-07-07 11:21:38 +08:00
75cf0af9b4 New translations multi-package-workspace.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:37 +08:00
54f5f78e2c New translations multi-package-workspace.mdx (Russian)
[ci skip]
2026-07-07 11:21:36 +08:00
bb27b4e2e6 New translations multi-package-workspace.mdx (Polish)
[ci skip]
2026-07-07 11:21:35 +08:00
9d9422b45b New translations multi-package-workspace.mdx (German)
[ci skip]
2026-07-07 11:21:33 +08:00
b37aa2a380 New translations library-project.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:32 +08:00
af96ba2ac2 New translations library-project.mdx (Russian)
[ci skip]
2026-07-07 11:21:31 +08:00
2d73d07923 New translations library-project.mdx (Polish)
[ci skip]
2026-07-07 11:21:30 +08:00
d193dc1314 New translations library-project.mdx (German)
[ci skip]
2026-07-07 11:21:29 +08:00
8ddf4c3fb9 New translations cross-to-windows.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:28 +08:00
f7c0a50e0e New translations cross-to-windows.mdx (Russian)
[ci skip]
2026-07-07 11:21:27 +08:00
f4748173f9 New translations cross-to-windows.mdx (Polish)
[ci skip]
2026-07-07 11:21:26 +08:00
1ed2cd9a71 New translations cross-to-windows.mdx (German)
[ci skip]
2026-07-07 11:21:25 +08:00
d77fcf6b29 New translations license.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:23 +08:00
458cda2da2 New translations license.mdx (Russian)
[ci skip]
2026-07-07 11:21:22 +08:00
af9b67edec New translations license.mdx (Polish)
[ci skip]
2026-07-07 11:21:21 +08:00
72654896c0 New translations license.mdx (German)
[ci skip]
2026-07-07 11:21:20 +08:00
82a2b38132 New translations ide-integration.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:19 +08:00
c936c03fbf New translations ide-integration.mdx (Russian)
[ci skip]
2026-07-07 11:21:17 +08:00
0fecd4c2b7 New translations ide-integration.mdx (Polish)
[ci skip]
2026-07-07 11:21:16 +08:00
1e6a1ae9c1 New translations ide-integration.mdx (German)
[ci skip]
2026-07-07 11:21:15 +08:00
813354c5da New translations installation.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:14 +08:00
a02f302c48 New translations installation.mdx (Russian)
[ci skip]
2026-07-07 11:21:13 +08:00
a1d2d41fb0 New translations installation.mdx (Polish)
[ci skip]
2026-07-07 11:21:12 +08:00
c11c1a83df New translations installation.mdx (German)
[ci skip]
2026-07-07 11:21:10 +08:00
98db98d353 New translations first-steps.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:09 +08:00
6c326c21d4 New translations first-steps.mdx (Russian)
[ci skip]
2026-07-07 11:21:08 +08:00
2e895619bf New translations first-steps.mdx (Polish)
[ci skip]
2026-07-07 11:21:07 +08:00
03146c2857 New translations first-steps.mdx (German)
[ci skip]
2026-07-07 11:21:06 +08:00
6c1e041037 New translations faq.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:05 +08:00
fc545c6af9 New translations faq.mdx (Russian)
[ci skip]
2026-07-07 11:21:04 +08:00
4e2688d66f New translations faq.mdx (Polish)
[ci skip]
2026-07-07 11:21:02 +08:00
1eca47feb5 New translations faq.mdx (German)
[ci skip]
2026-07-07 11:21:01 +08:00
12f4177a91 New translations contributing.mdx (Ukrainian)
[ci skip]
2026-07-07 11:21:00 +08:00
84eb7c0c52 New translations contributing.mdx (Russian)
[ci skip]
2026-07-07 11:20:59 +08:00
ce643077b3 New translations contributing.mdx (Polish)
[ci skip]
2026-07-07 11:20:58 +08:00
bc71ee7202 New translations contributing.mdx (German)
[ci skip]
2026-07-07 11:20:57 +08:00
42312e10bb New translations system-commands.mdx (Ukrainian)
[ci skip]
2026-07-07 11:20:56 +08:00
7e54cb7155 New translations system-commands.mdx (Russian)
[ci skip]
2026-07-07 11:20:55 +08:00
4c40e74dbb New translations system-commands.mdx (Polish)
[ci skip]
2026-07-07 11:20:54 +08:00
8aa350629c New translations system-commands.mdx (German)
[ci skip]
2026-07-07 11:20:52 +08:00
49d63a1ea1 New translations quality-commands.mdx (Ukrainian)
[ci skip]
2026-07-07 11:20:51 +08:00
f87112faf0 New translations quality-commands.mdx (Russian)
[ci skip]
2026-07-07 11:20:50 +08:00
ab0ad58925 New translations quality-commands.mdx (Polish)
[ci skip]
2026-07-07 11:20:49 +08:00
f5b465446c New translations quality-commands.mdx (German)
[ci skip]
2026-07-07 11:20:48 +08:00
f4124ea268 New translations project-commands.mdx (Ukrainian)
[ci skip]
2026-07-07 11:20:46 +08:00
d10358bdab New translations project-commands.mdx (Russian)
[ci skip]
2026-07-07 11:20:45 +08:00
fd5150f3db New translations project-commands.mdx (Polish)
[ci skip]
2026-07-07 11:20:44 +08:00
82e10cc75d New translations project-commands.mdx (German)
[ci skip]
2026-07-07 11:20:43 +08:00
b7c9edb35e New translations gen-commands.mdx (Ukrainian)
[ci skip]
2026-07-07 11:20:42 +08:00
04fcedc428 New translations gen-commands.mdx (Russian)
[ci skip]
2026-07-07 11:20:41 +08:00
548808a8d8 New translations gen-commands.mdx (Polish)
[ci skip]
2026-07-07 11:20:40 +08:00
dcb8e676f1 New translations gen-commands.mdx (German)
[ci skip]
2026-07-07 11:20:38 +08:00
1b0ee1402a New translations dependency-commands.mdx (Ukrainian)
[ci skip]
2026-07-07 11:20:37 +08:00
6c6fa8d5d4 New translations dependency-commands.mdx (Russian)
[ci skip]
2026-07-07 11:20:36 +08:00
c2c3a7bd7a New translations dependency-commands.mdx (Polish)
[ci skip]
2026-07-07 11:20:35 +08:00
23149d8149 New translations dependency-commands.mdx (German)
[ci skip]
2026-07-07 11:20:34 +08:00
801a164da9 New translations build-commands.mdx (Ukrainian)
[ci skip]
2026-07-07 11:20:33 +08:00
e3ec2c198d New translations build-commands.mdx (Russian)
[ci skip]
2026-07-07 11:20:32 +08:00
312af43702 New translations build-commands.mdx (Polish)
[ci skip]
2026-07-07 11:20:30 +08:00
3ca1db4f7c New translations build-commands.mdx (German)
[ci skip]
2026-07-07 11:20:29 +08:00
0af619907a New translations changelog.mdx (Ukrainian)
[ci skip]
2026-07-07 11:20:28 +08:00
e257afde70 New translations changelog.mdx (Russian)
[ci skip]
2026-07-07 11:20:27 +08:00
cd3ef3a7f5 New translations changelog.mdx (Polish)
[ci skip]
2026-07-07 11:20:26 +08:00
966018c1e0 New translations changelog.mdx (German)
[ci skip]
2026-07-07 11:20:25 +08:00
180f927e85 New translations readme.mdx (Ukrainian)
[ci skip]
2026-07-07 11:20:23 +08:00
7ba9d296a1 New translations readme.mdx (Russian)
[ci skip]
2026-07-07 11:20:22 +08:00
93a894e66a New translations readme.mdx (Polish)
[ci skip]
2026-07-07 11:20:21 +08:00
c7dd8fecaa New translations readme.mdx (German)
[ci skip]
2026-07-07 11:20:20 +08:00
a3f8444c20 Replace GitLab pipeline trigger with Cloudflare build 2026-07-05 18:24:47 +08:00
1f3fc62cb6 Add GitHub Actions workflow to trigger site rebuild 2026-07-05 18:16:45 +08:00
85 changed files with 1162 additions and 3554 deletions

View File

@@ -0,0 +1,14 @@
name: Trigger site rebuild
on:
push:
branches: [master]
paths:
- 'docs/**'
jobs:
trigger:
runs-on: ubuntu-latest
steps:
- name: Trigger Cloudflare Pages build
run: curl -sS -X POST "${{ secrets.CF_PAGES_DEPLOY_HOOK }}"

View File

@@ -8,11 +8,8 @@ sidebar_label: Introduction
<summary>Quick reference</summary> <summary>Quick reference</summary>
```bash ```bash
# Installation (dcrup) # Installation
curl -fsSL https://sh.dcr-tool.ru | sh -s -- self-install curl -fsSL https://dcr.dexoron.su/install.sh | sh
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable # auto: cf → gh → sf → ya
# dcrup install stable --mirror cf # CloudFlare / GitHub / SourceForge / Yandex
# Create a project # Create a project
dcr new my-app dcr new my-app
@@ -54,9 +51,8 @@ dcr gen vscode
* **Incremental builds** — mtime + `.d` headers + SHA256 fingerprint * **Incremental builds** — mtime + `.d` headers + SHA256 fingerprint
* **Parallel compilation** — thread::scope, atomic task queue * **Parallel compilation** — thread::scope, atomic task queue
* **7 backends** — gcc/clang (unix_cc), MSVC/clang-cl (msvc), GAS, NASM, MASM, FASM, LLVM IR * **4 backends** — gcc/clang, MSVC/clang-cl, GAS (ARM), NASM (x86)
* **8 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom, flat-bin * **7 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom
* **Disk images** — optional `[archive]` packs FAT12/16/32 images after build
* **Cross-compilation** — short names and full triples * **Cross-compilation** — short names and full triples
* **Profiles** — debug / release with field overrides * **Profiles** — debug / release with field overrides
* **Workspaces** — multi-package projects with topological sort * **Workspaces** — multi-package projects with topological sort

View File

@@ -4,209 +4,6 @@ sidebar_label: Changelog
# Changelog # Changelog
## 0.9.5 (2026-10-21)
* **Structured CLI output** — shared helpers now provide Cargo-like human, plain, and JSON output modes.
* **Color and diagnostics policy** — `--color`, `NO_COLOR`, `--quiet`, and `--verbose` are applied consistently across commands.
* **Build reporting** — lifecycle events and compiler diagnostics are available as structured JSON events.
* **Output lab** — sandbox scenarios cover help, lifecycle commands, compiler warnings/errors, stream capture, and broken pipes.
## 0.9.1 (2026-09-13)
* **`pkg-config` dependencies** — declare `fmt = { pkg-config = "fmt" }` or multiple package names in `[dependencies]`; DCR applies `.pc` compiler/linker flags and records the resolved package in `dcr.lock`.
* **`dcr add` support for `pkg-config`** — easily add system package dependencies with `dcr add fmt pkg-config:fmt` or `dcr add openssl pkg:openssl,libcrypto`.
* **`dcr tree` & IDE integration** — `pkg-config` packages are marked in `dcr tree` and resolved into compiler flags in `dcr gen` (`compile_commands.json`).
* **Fixed `dcr new` in non-ASCII / spaced paths** — initializing projects from folders with non-ASCII characters or spaces no longer fails validation.
## 0.9.0 (2026-08-31)
* **Download mirrors in `dcrup`** — `--mirror auto|cf|gh|sf|ya` and `DCRUP_MIRROR`.
Default `auto` tries **cf → gh → sf → ya** (CloudFlare CDN, GitHub, SourceForge, Yandex CDN).
* **Complete Path/Git dependencies** — DCR packages from `path` and `git` are built before their consumer. Git sources are cached in `~/.dcr/git`, support `branch`/`tag`/`rev`, and record the exact commit in `dcr.lock`.
* **Build and prebuild modes** — `path` and `git` dependencies can build a DCR package from `dcr.toml` or link existing `include`/`lib`/`libs` artifacts; `mode = "build"` / `"prebuild"` selects explicitly when both forms are present.
* **Prebuilt dependency examples** — documentation now shows the `dcr-math-lib` Git repository and recommended build/prebuilt layouts for both `git` and `path`.
* **Transitive dependency builds and cycle reporting** — DCR recursively builds DCR packages and reports a clear dependency chain for cycles.
* **Bare path arguments for `dcr add`** — `dcr add mylib ../mylib` now works in addition to the explicit `path:` form.
* **Removed `install.sh` / `install.ps1` / `install_bsd.sh`** — superseded by `dcrup`.
## 0.8.5 (2026-08-08)
* **`package.dcr-version`** — optional CLI version pin in `dcr.toml`.
`dcr new` / `dcr init` write 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 with `CompilationDatabase: .dcr` (`# managed by dcr gen`); custom `.clangd` is not overwritten.
* **Helpers** `canonicalize_path`, `atomic_write`, `ensure_dcr_dir`; pure `resolve_artifact_path` via `platform::*`.
* **`dcr new` / `dcr init`** — add `.dcr/` to `.gitignore`.
**Changed (breaking):**
* **`compile_commands.json` moved** 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 clion` launch/run** — use the same artifact path resolver as `project-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 `ldflags` without CLI `--target`; run-arg forwarding; `split_double_dash` unit tests.
### Changed
* **Native builds resolve the host triple** — without `--target` / package `build.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` / man `dcr-run`** — document `--` forwarding.
### Fixed
* **Native artifact paths on Windows and macOS** — without an explicit `--target` / `build.target`, artifacts use `target/\<profile>`, so `dcr run` and flat-bin find the build output.
* Target-specific `ldflags` missing 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 via `fatfs` (`cargo build --features archive`). Release CI builds with the feature; without it `[archive]` fails with a clear message.
* **Tests** — `flat_bin_nasm_build`, package `build.target` without CLI `--target`, stricter workspace `clean --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/member `build.target` is honored (bare-metal / ISO `post_steps` paths).
* **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 local `target/` (shared root `target/`).
* **`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 raw `os 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 binary` in source)
* **GAS / MASM / LLC** — object → `objcopy -O binary` → `\<stem>.bin`
* **C/C++** — objects → freestanding link → `objcopy -O binary` → `\<name>.bin`
* Requires `llvm-objcopy` / `objcopy` / `gobjcopy` except for NASM/FASM direct emit
* **`[archive]` section** — FAT12/16/32 disk images after build (`output`, `format`, `size`, `offset`, `label`, `bootsector`, `layout`). From 0.8.2 requires feature `archive`.
* **Single-file `build.roots`** — a root may be a single source or header file, not only a directory.
### Changed
* **`--force`** also re-runs `build.steps` and `build.post_steps`.
* **`dcr run` on workspace-only root** — if `[run].cmd` is 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 in `src/cli/build.rs` to a reusable, decoupled core build engine.
* **Polymorphic Language Model (`Language` trait)** — introduced the abstract `Language` trait (`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 (`Builder` trait)** — introduced the `Builder` trait to generalize builder invocations (`src/core/build/builder/mod.rs`). Consolidated GCC/Clang logic into `builder/cc_common.rs` and Microsoft Visual C++ logic into `builder/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 in `dcr.toml`.
* **Automatic Workspace Dependency Injection** — during workspace builds, include/lib paths of dependent workspace members (including their source headers, local `include/` folders, and build target `target/include` / `target/lib` folders) are automatically resolved and injected.
* **`BuildReporter` Event 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., in `dcr add`).
* **Path Dependencies Target Include Resolution** — local path dependencies configured via tables now correctly expose headers built and packaged into their `target/include` folder to consumer packages.
* **Modular Integration Test Suite** — refactored the monolith `tests/cli_basic.rs` file 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.rs` module.
* **Workspace-Aware member execution** — `dcr run` executed at the workspace root of a `workspace_only` project now triggers the member build inside the workspace context using the `--workspace` parameter, preventing standalone build issues.
* **Elimination of Global State** — removed global variables and states from the build core, encapsulating build logic inside isolated `BuildContext` structs 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 = true` is set in `dcr.toml`.
* **`dcr lint` command** — C/C++ static analysis via `clang-tidy`. Supports `--fix` for automatic fixes. Respects `build.roots` and `build.src_disable` from config.
* **Three new assembler backends**:
* **MASM** (`compiler = "ml"` / `"ml64"`) — Microsoft Macro Assembler.
* **FASM** (`compiler = "fasm"`) — Flat Assembler.
* **LLVM IR** (`compiler = "llc"`) — compiles `.ll` files via `llc -filetype=obj`.
* **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()` and `home_dir()` extracted to `utils/fs.rs`.
* **Build utilities** — `normalize_target()`, `normalize_kind()`, `normalize_platform()`, `default_profile_flags()` extracted to `utils/build.rs`.
* **Backend helpers** — `asm_lang_flag()`, `source_extensions()`, `elapsed_secs()` added to `core/builder/common.rs`.
* **Full Bare-Metal / Freestanding Automation** — introduced the `build.freestanding = true` configuration option. When enabled (or when a bare-metal target is detected), DCR automatically injects `-ffreestanding` during compilation and both `-nostdlib` and `-static` during linking.
* **Artifact Optimization (LTO & Strip)** — added `build.lto` (auto-injects `-flto` for compiler and linker) and `build.strip` (automatically strips debug symbols via linker `-s` flag) options to `dcr.toml`.
* **Compilation Thread Control** — added the `build.codegen-units` option to strictly limit the maximum number of parallel jobs utilized by the custom `parallel_build` worker 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 if `build.cflags` are overridden.
* **Centralized Bare-Metal Detection** — relocated the `is_bare_metal_target` helper to common build utilities (`src/utils/build.rs`) for unified access across the building core.
* **Architectural Refactoring**:
* Renamed `src/config.rs` to `src/templates.rs`.
* Started consolidation of configuration and build orchestration logic.
## 0.7.3 (2026-06-13)
### Added
* **`--vcs` option for `new` and `init` commands** — 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 `-dirty` suffix if there are uncommitted changes in the DCR repository.
* **Automatic `.gitignore` generation** — Git repository initialization now automatically writes a `.gitignore` file excluding the `/target` directory.
* **Nested repository prevention** — automatic Git initialization is now skipped if `dcr new` or `dcr init` is executed inside an already existing Git repository.
* **VCS verification tests** — added `new_vcs_options_work` and `init_vcs_options_work` integration tests to ensure reliable repository behavior.
### Changed
* **Complete removal of `git2` dependency** — all Git actions (dependency fetching, VCS setup, status checks) are now delegated to the system `git` executable via `Command`. This simplifies compilation and drops the need for `vendored` and `openssl` features.
* **Migrated from `reqwest` to `ureq`** — replaced the heavy `reqwest` crate in `flag_update.rs` with the lightweight synchronous `ureq 2.10` client, reducing overhead and the final binary size.
## 0.7.2 (2026-06-07)
### Added
* `default_target_triple()` now respects `target_env` — Linux (gnu/musl) and Windows (msvc/gnu) use the correct environment instead of hardcoded values.
### Fixed
* **macOS Apple Silicon builds failed with `_main` undefined** — `--target=` is now passed to ldflags, not just cflags. `default_target_triple()` uses `std::env::consts::ARCH` on macOS instead of hardcoded `x86_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) ## 0.7.1 (2026-06-02)
### Added ### Added

View File

@@ -13,7 +13,7 @@ dcr build # debug profile
dcr build --release # release build dcr build --release # release build
dcr build --debug # explicit debug dcr build --debug # explicit debug
dcr build --target aarch64-unknown-linux-gnu dcr build --target aarch64-unknown-linux-gnu
dcr build --force # full rebuild (also re-runs build.steps / post_steps) dcr build --force # full rebuild
dcr build --clean # clean + build dcr build --clean # clean + build
dcr build --verbose # show compilation commands dcr build --verbose # show compilation commands
dcr build --workspace pkg-a # build specific workspace package dcr build --workspace pkg-a # build specific workspace package
@@ -21,8 +21,6 @@ dcr build --workspace pkg-a # build specific workspace package
Artifacts: `target/\<triple>/\<profile>/\<binary-name>` (Linux with explicit target). Artifacts: `target/\<triple>/\<profile>/\<binary-name>` (Linux with explicit target).
With `[archive]` in `dcr.toml`, a FAT disk image is packed after a successful build.
## `dcr run` ## `dcr run`
Builds (if sources are newer than artifacts) and runs the binary. Builds (if sources are newer than artifacts) and runs the binary.
@@ -30,11 +28,8 @@ Builds (if sources are newer than artifacts) and runs the binary.
```bash ```bash
dcr run dcr run
dcr run --release dcr run --release
dcr run --force # force rebuild then run
``` ```
On a **workspace-only** root: if `[run].cmd` is set, that command is used after build; otherwise DCR delegates to a workspace member.
## `dcr clean` ## `dcr clean`
Removes `target/` directory (or `target/\<target>/\<profile>`). Removes `target/` directory (or `target/\<target>/\<profile>`).

View File

@@ -15,8 +15,6 @@ dcr add mylib path:./lib # explicit path prefix
dcr add mylib git:https://github.com/user/repo # explicit git prefix dcr add mylib git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub shorthand dcr add mylib github:user/repo # GitHub shorthand
dcr add mylib gitlab:user/repo # GitLab shorthand dcr add mylib gitlab:user/repo # GitLab shorthand
dcr add fmt pkg-config:fmt # system package via pkg-config
dcr add openssl pkg:openssl,libcrypto # multiple pkg-config packages
``` ```
Source prefixes: Source prefixes:
@@ -25,7 +23,6 @@ Source prefixes:
* `git:` — generic git URL * `git:` — generic git URL
* `github:` — expands to `https://github.com/\<user>/\<repo>` * `github:` — expands to `https://github.com/\<user>/\<repo>`
* `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>` * `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>`
* `pkg-config:` / `pkg:` — one or more packages resolved by `pkg-config`
* `http://` / `https://` / `git@` — full URL * `http://` / `https://` / `git@` — full URL
Flags: Flags:
@@ -34,12 +31,7 @@ Flags:
* `--tag \<name>` — git tag * `--tag \<name>` — git tag
* `--rev \<hash>` — git commit * `--rev \<hash>` — git commit
If source is omitted — DCR searches connected registries. A bare relative or absolute path is accepted as a path dependency. If source is omitted — DCR searches connected registries.
For `pkg-config` dependencies, the referenced packages must already be installed
and provide `.pc` files. DCR invokes `pkg-config` during the build (using
`PATH` and `PKG_CONFIG_PATH`) and forwards the returned compiler and linker
flags; it does not download or build these packages.
## `dcr tree` ## `dcr tree`

View File

@@ -8,7 +8,6 @@ sidebar_label: Contributing
```bash ```bash
git clone https://github.com/dexoron/dcr git clone https://github.com/dexoron/dcr
# or a source mirror: GitVerse / SourceCraft / SourceForge / GitLab (see README)
cd dcr cd dcr
cargo build cargo build
``` ```
@@ -43,11 +42,10 @@ cargo test --all-targets
## CI ## CI
CI runs (see `.github/workflows/ci.yml`): CI runs:
* `cargo fmt --check` * `cargo fmt --check`
* `cargo clippy` (default + `--all-features`) * `cargo clippy --all-targets -- -D warnings`
* `cargo check --all-targets --all-features` * `cargo test --all-targets`
* Unit + integration tests on Linux, macOS, Windows * Build on Linux, macOS, Windows
* Extra Linux job with `--features archive` (FAT images) * Integration tests
* Tools on runners: clang, nasm, clang-format/tidy (Linux)

View File

@@ -39,6 +39,27 @@ which clang
Or specify explicitly via `[toolchain]` in `dcr.toml`. Or specify explicitly via `[toolchain]` in `dcr.toml`.
## openssl-sys build failed
When building DCR from source:
```
error: failed to run custom build command for openssl-sys
```
**Solution:** Install OpenSSL development headers:
```bash
# Ubuntu/Debian
sudo apt install libssl-dev
# Fedora
sudo dnf install openssl-devel
# macOS
brew install openssl
```
## Ctrl+C during build ## Ctrl+C during build
DCR handles SIGINT: interrupts the current compilation and exits with non-zero code. DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
@@ -55,21 +76,6 @@ See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
See [Workspace Recipe](/docs/recipes/multi-package-workspace). See [Workspace Recipe](/docs/recipes/multi-package-workspace).
## Bootloader / pure NASM OS image
Use `kind = "flat-bin"` (NASM `-f bin`) and optional `[archive]` for a FAT disk image.
See [OS-dev recipe](/docs/recipes/os-flat-bin-archive).
## How do I choose a download mirror?
`dcrup install` uses `--mirror auto` by default and tries **cf → gh → sf → ya**.
```bash
dcrup install stable --mirror cf
export DCRUP_MIRROR=ya
```
## Lock file ## Lock file
`dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`. `dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`.

View File

@@ -70,10 +70,3 @@ dcr test # run tests
```bash ```bash
dcr fmt # clang-format with .clang-format dcr fmt # clang-format with .clang-format
``` ```
## Linting
```bash
dcr lint # clang-tidy checks
dcr lint --fix # apply fixes automatically
```

View File

@@ -4,75 +4,28 @@ sidebar_label: Installation
# Installation # Installation
## dcrup (recommended) ## Linux (Dexoron Packages)
Install and switch DCR versions (stable / dev / night, pin `0.8.2`, optional build from source). Configure your package manager at https://pkg.dexoron.su and install:
### Linux / macOS / BSD / Windows (bash) **Arch Linux**
```sh ```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- self-install sudo pacman -Sy dcr
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable
``` ```
Non-interactive install of DCR in one shot: **Debian/Ubuntu**
```sh ```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- install stable sudo apt update && sudo apt install dcr
export PATH="$HOME/.dcr/bin:$PATH"
``` ```
### Windows (PowerShell) **Fedora/RHEL**
```powershell
& ([scriptblock]::Create((irm https://ps1.dcr-tool.ru))) self-install
# $env:Path += ";$env:USERPROFILE\.dcr\bin"
dcrup install stable
```
After `self-install`, the command is **`dcrup`** (no `.sh` / `.ps1`) and is installed in `~/.dcr/bin` (Unix) or `%USERPROFILE%\.dcr\bin` (Windows).
### Common dcrup commands
```sh ```sh
dcrup install stable # latest stable prebuilt (auto: cf → gh → sf → ya) sudo dnf install dcr
dcrup install 0.8.2 # pin → 0.8.2@stable
dcrup install 0.8.2@dev
dcrup install stable --libc musl # Linux: musl asset (default: gnu)
dcrup install stable --mirror cf # CloudFlare CDN
dcrup install stable --mirror ya # Yandex CDN (RU fallback)
dcrup install stable --build # cargo build --features archive
dcrup install night # always build from branch dev HEAD
dcrup default 0.8.2
dcrup update
dcrup list
dcrup show
dcrup which
dcrup uninstall 0.8.2 # remove one installed version
dcrup uninstall --all # remove all installed versions
``` ```
Layout: `~/.dcr/toolchains/\<id>/dcr` and `~/.dcr/bin/dcr` → active version.
### Download mirrors
Prebuilt installs try **cf → gh → sf → ya** unless you pin a host.
| Code | URL | Notes |
| ---- | ------------------------------------------------------------------------------------------------------------ | -------------------------- |
| `cf` | `https://cdn-global.dcr-tool.ru/\<tag>/\<asset>` | CloudFlare CDN (worldwide) |
| `gh` | `https://github.com/dexoron/dcr/releases/download/\<tag>/\<asset>` | GitHub Releases |
| `sf` | `https://sourceforge.net/projects/dcr-tool/files/\<tag>/\<asset>/download` | SourceForge |
| `ya` | `https://cdn-ru.dcr-tool.ru/\<tag>/\<asset>` | Yandex CDN (RU fallback) |
```sh
dcrup install stable --mirror auto # default
export DCRUP_MIRROR=cf # persist for this shell
```
---
## Arch Linux (AUR) ## Arch Linux (AUR)
```sh ```sh
@@ -92,12 +45,11 @@ brew install dcr
sudo snap install dcrup sudo snap install dcrup
``` ```
> If classic Snap Store publishing is unavailable, install the `.snap` from [GitHub Releases](https://github.com/dexoron/dcr/releases/latest) with `--dangerous`.
## Nix (flake) ## Nix (flake)
```sh ```sh
nix run github:dexoron/dcr nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr nix profile install github:dexoron/dcr
``` ```
@@ -107,37 +59,48 @@ nix profile install github:dexoron/dcr
cargo install dcr cargo install dcr
``` ```
Note: crates.io builds may omit optional features. For FAT disk images (`[archive]`), prefer release binaries or: ## Linux / macOS (script)
```sh ```sh
cargo install dcr --features archive curl -fsSL https://dcr.dexoron.su/install.sh | sh
```
## BSD (script)
```sh
curl -fsSL https://dcr.dexoron.su/install_bsd.sh | sh
```
## Windows (PowerShell)
```powershell
irm https://dcr.dexoron.su/install.ps1 | iex
``` ```
## From source ## From source
```sh ```sh
git clone https://github.com/dexoron/dcr.git git clone https://github.com/dexoron/dcr.git
cd dcr cd dcr && cargo build --release
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
``` ```
## Post-install ## Post-install
Verify the installation:
```bash ```bash
dcr --version dcr --version
dcrup show # if installed via dcrup
``` ```
Man pages (package installs / release assets): Man pages are available after installation:
```bash ```bash
man dcr man dcr
man dcr-build man dcr-build
``` ```
Registry (optional) — `~/.dcr/config.toml`: To use the registry, create `~/.dcr/config.toml`:
```toml ```toml
[registry.default] [registry.default]

View File

@@ -6,13 +6,6 @@ sidebar_label: IDE Integration
## VS Code ## VS Code
Install the recommended [DCR extension by Dexoron-Labs](https://marketplace.visualstudio.com/items?itemName=Dexoron-Labs.dcr). Do not install Microsoft C/C++ extensions for DCR projects: DCR uses `clangd`. MS C/C++ is acceptable only when you need its debugger.
Recommended companion extensions:
* [Even Better TOML](https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml)
* [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb), or MS C/C++ for debugger support only
```bash ```bash
dcr gen vscode dcr gen vscode
``` ```

View File

@@ -1,89 +0,0 @@
---
sidebar_label: OS-dev (flat-bin + archive)
---
# Pure ASM / boot image (flat-bin + archive)
Minimal OS-dev style pipeline: assemble raw binaries with NASM, then pack a FAT floppy/image with an optional boot sector.
## Project layout
```
myos/
dcr.toml
src/
boot.asm # boot sector (512 bytes)
kernel.asm # payload
```
For multiple flat artifacts, use a **workspace** (one member per binary) or separate packages; a single `flat-bin` package produces one binary per source stem.
## Boot package (`flat-bin`)
```toml
[package]
name = "boot"
version = "0.1.0"
[build]
language = "asm"
compiler = "nasm"
kind = "flat-bin"
extension = "bin"
roots = ["src/boot.asm"]
```
```bash
dcr build
# → target/<…>/debug/boot.bin (NASM -f bin, no link)
```
## Disk image after build
```toml
[archive]
output = "target/{profile}/disk.img"
format = "fat12"
size = "1440K"
label = "MYOS"
bootsector = "target/{profile}/boot.bin"
[[archive.layout]]
from = "target/{profile}/kernel.bin"
to = "KERNEL.BIN"
```
* `format`: `fat12`, `fat16`, or `fat32`
* `size`: bytes or `K`/`KB`/`M`/`MB`/`G`/`GB` (default ~1.44 MiB)
* `bootsector`: written only when `offset` is omitted or `0`
* `from` may be a glob; `{profile}` is substituted in paths
## C kernel → flat binary
```toml
[build]
language = "c"
compiler = "clang"
kind = "flat-bin"
freestanding = true
filename = "kernel"
extension = "bin"
ldflags = ["-T", "linker.ld"]
```
Pipeline: objects → temporary linked ELF → `objcopy -O binary` → `kernel.bin`. Requires `objcopy` / `llvm-objcopy` in PATH.
## Other assemblers
| Tool | Notes |
| -------- | --------------------------------------------------------------------------------------- |
| **FASM** | Write `format binary` in the source; DCR writes `\<stem>.bin` directly |
| **GAS** | Assemble `.s` → obj → `objcopy -O binary` |
| **LLC** | `language = "llvm_ir"` → obj → objcopy |
| **MASM** | COFF obj → objcopy (needs binutils/LLVM objcopy) |
## Notes
* Single-file `roots` are supported: `roots = ["src/boot.asm"]`.
* `--force` re-runs `build.steps` / `build.post_steps` as well as recompilation.
* Prefer `kind = "elf"` if you need a relocatable ELF kernel without stripping to raw binary.

View File

@@ -56,7 +56,7 @@ moc = "moc {in} -o {out}"
### GAS / NASM / MASM / FASM / LLVM-IR ### GAS / NASM / MASM / FASM / LLVM-IR
* GAS: `-I`, `-c -o`, `--defsym` * GAS: `-I`, `-c -o`, `--defsym`
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32; **`bin` when `kind = "flat-bin"`**) * NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32)
* MASM: `/nologo /c /Fo\<obj> <source>` * MASM: `/nologo /c /Fo\<obj> <source>`
* FASM: `<source> \<output>` (output path is the object file) * FASM: `<source> \<output>` (output path is the object file)
* LLVM IR: `-filetype=obj <source> -o \<output>` * LLVM IR: `-filetype=obj <source> -o \<output>`
@@ -79,7 +79,7 @@ Three levels of incrementality:
## Build Kinds ## Build Kinds
| Kind | Type | Path (Linux example) | | Kind | Type | Path (Linux example) |
| ----------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | ----------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) | | `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) |
| `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) | | `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) |
| `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) | | `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) |
@@ -87,11 +87,6 @@ Three levels of incrementality:
| `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` | | `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` |
| `none` | Compile only, no link | — | | `none` | Compile only, no link | — |
| `custom` | Full filename+extension control | `target/\<triple>/\<profile>/\<filename>.\<extension>` | | `custom` | Full filename+extension control | `target/\<triple>/\<profile>/\<filename>.\<extension>` |
| `flat-bin` | Raw binary | ASM: `\<stem>.bin` (NASM `-f bin` / FASM / GAS·MASM·LLC via objcopy); C/C++: `\<name>.bin` (link + objcopy) |
## Disk images (`[archive]`)
After a successful build, if `[archive]` is present in `dcr.toml`, DCR formats a FAT volume and copies files from `layout` into the image. See [dcr.toml → archive](/docs/reference/dcr-toml#archive).
## Build Steps ## Build Steps

View File

@@ -1,34 +0,0 @@
---
sidebar_label: CLI output
---
# CLI output (experimental)
The structured output implementation is being developed incrementally.
Currently these global options apply to diagnostics emitted through the logger:
```sh
dcr --output plain build
dcr --output json build
dcr --color never build
dcr --quiet build
dcr --verbose build
```
`--output` accepts `human` (default), `plain`, or `json`.
Diagnostics are written to stderr. JSON diagnostics are newline-delimited objects
with `schema_version: 1`, `event`, and `message` fields. Command statuses use the
shared output helpers, build reporting emits structured lifecycle events, and
compiler output is represented as JSON events with its original stream and text.
The protocol is still experimental: some raw command data and subprocess stdout
remain unstructured.
`--color` accepts `auto`, `always`, or `never`. Automatic coloring requires a
terminal and respects `NO_COLOR`. Plain and JSON diagnostics never add colors.
Quiet mode preserves warnings, errors, and compiler diagnostics; verbose mode
enables debug and trace logging. Arguments following `--` are passed through
unchanged.
Remaining work includes migrating the remaining raw command data and subprocess
stdout, improving progress rendering and contextual errors, and expanding
integration coverage for stdout/stderr and closed pipes.

View File

@@ -57,8 +57,14 @@ dcr build --target aarch64-none-elf
## Target Directory ## Target Directory
By default, the compilation output directories are structured as follows: On Linux with explicit target:
* **Linux and BSD**: Always output to `target/\<triple>/\<profile>/` (using host triple if no target is specified). ```
* **macOS and Windows (without target)**: Output to `target/\<profile>/`. target/<triple>/<profile>/
* **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`. ```
On macOS/Windows or without target:
```
target/<profile>/
```

View File

@@ -33,18 +33,14 @@ Main project configuration file. Located at the project root.
[run] [run]
# run settings # run settings
[archive]
# optional: pack FAT disk image after build
``` ```
## [package] ## [package]
| Field | Required | Description | | Field | Required | Description |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------- | | --------- | -------- | ------------------------------------------- |
| `name` | yes | Project name | | `name` | yes | Project name |
| `version` | yes | Semantic version of the **project** | | `version` | yes | Semantic version |
| `dcr-version` | no | Semver of the **dcr tool** this project targets. Written by `dcr new` / `dcr init` to the current tool version. |
| `type` | no | `app`, `lib`, `none` (defaults to `"none"`) | | `type` | no | `app`, `lib`, `none` (defaults to `"none"`) |
| `license` | no | SPDX license identifier | | `license` | no | SPDX license identifier |
| `author` | no | Author | | `author` | no | Author |
@@ -53,26 +49,11 @@ Main project configuration file. Located at the project root.
[package] [package]
name = "my-app" name = "my-app"
version = "0.1.0" version = "0.1.0"
dcr-version = "0.8.4"
type = "app" type = "app"
license = "MIT" license = "MIT"
author = "John Doe" author = "John Doe"
``` ```
### `package.dcr-version`
Optional pin of the DCR CLI the project was written for. On every `dcr.toml` load:
| Situation | Behaviour |
| ------------------------------ | ---------------------------------------------------------- |
| Field missing / empty | Warning: add `dcr-version` (set by `dcr new` / `dcr init`) |
| Running dcr **older** than pin | Warning: upgrade dcr (`dcr --update`) |
| Running dcr **newer** than pin | Warning: review changelog, bump the pin when ready |
| Equal | Silent |
| Invalid semver | Warning once, field ignored |
Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) are ignored for comparison (`1.0.0-dev` ≡ `1.0.0`).
## [build] ## [build]
... ...
@@ -80,19 +61,19 @@ Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) ar
* `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`. * `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`.
| Field | Default | Description | | Field | Default | Description |
| ---------------- | ------------- | --------------------------------------------------------------------------------------------------------- | | ---------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) | | `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"` (optional, defaults to `"c"`) |
| `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) | | `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) |
| `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) | | `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) |
| `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) | | `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom`, `flat-bin` | | `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom` |
| `target` | host | Target triple for cross-compilation | | `target` | host | Target triple for cross-compilation |
| `platform` | `"native"` | `native`, `efi` | | `platform` | `"native"` | `native`, `efi` |
| `cflags` | `[]` | Additional C/C++/ASM flags | | `cflags` | `[]` | Additional C/C++/ASM flags |
| `ldflags` | `[]` | Additional linker flags | | `ldflags` | `[]` | Additional linker flags |
| `filename` | `""` | Custom output file name | | `filename` | `""` | Custom output file name |
| `extension` | `""` | Custom file extension (for `flat-bin`, default is `bin`) | | `extension` | `""` | Custom file extension |
| `roots` | `["src"]` | Source roots: directories and/or individual source/header files | | `roots` | `["src"]` | Source root directories |
| `exclude` | `[]` | Exclude patterns | | `exclude` | `[]` | Exclude patterns |
| `include` | `[]` | Additional include directories | | `include` | `[]` | Additional include directories |
| `src_disable` | `false` | Disable auto source discovery | | `src_disable` | `false` | Disable auto source discovery |
@@ -112,16 +93,11 @@ Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) ar
Settings from raw config (not in typed struct): Settings from raw config (not in typed struct):
* `pkg_config` — list of packages queried for build-wide compiler/linker flags * `pkg_config` — list of pkg-config packages
Dependencies can also declare a system package directly, for example
`fmt = { pkg-config = "fmt" }`. This records the package in `dcr.lock` and applies
the flags returned by `pkg-config --cflags` and `pkg-config --libs`.
* `ldscript` — linker script path * `ldscript` — linker script path
* `build.steps` / `build.post_steps` — codegen steps * `build.steps` / `build.post_steps` — codegen steps
## Per-language overrides: `[build.c]`, `[build.cxx]`, `[build.asm]`, `[build.llvm_ir]` ## Per-language overrides: `[build.c]`, `[build.cxx]`, `[build.asm]`
Each language can have its own table that overrides the flat `[build]` settings: Each language can have its own table that overrides the flat `[build]` settings:
@@ -141,9 +117,6 @@ compiler = "g++"
[build.asm] [build.asm]
compiler = "nasm" compiler = "nasm"
flags = ["-felf64"] flags = ["-felf64"]
[build.llvm_ir]
compiler = "llc"
``` ```
The flat `[build]` acts as fallback; per-language tables take precedence for their language. The flat `[build]` acts as fallback; per-language tables take precedence for their language.
@@ -201,84 +174,3 @@ Default `cmd` = `./target/{profile}/{name}` (macOS/Windows) or `./target/\<tripl
## [workspace] ## [workspace]
See [workspaces](/docs/reference/workspaces). See [workspaces](/docs/reference/workspaces).
## [archive]
Optional post-build step: format a FAT volume and copy built artifacts into a disk image. Runs after a successful package build (and after workspace member builds that define `[archive]`).
Requires DCR built with the `archive` Cargo feature (`cargo build --features archive`). Release binaries include this feature.
| Field | Required | Description |
| ------------ | -------- | ------------------------------------------------------------------------------------------- |
| `output` | yes | Image path relative to project root (`{profile}` allowed) |
| `format` | yes | `fat12`, `fat16`, or `fat32` |
| `size` | no | Image size: bytes or `K`/`KB`/`M`/`MB`/`G`/`GB` (default `1474560` ≈ 1.44 MiB) |
| `offset` | no | Byte offset of the FAT volume inside the image (default `0`) |
| `label` | no | Volume label (max 11 chars, default `VOLUME`) |
| `bootsector` | no | Path to a 512-byte boot sector written at offset 0 when `offset` is 0 (`{profile}` allowed) |
| `layout` | no | List of `{ from, to }` entries (files or globs → path inside the volume) |
```toml
[archive]
output = "target/{profile}/disk.img"
format = "fat12"
size = "1440K"
label = "MYOS"
bootsector = "target/{profile}/boot.bin"
[[archive.layout]]
from = "target/{profile}/kernel.bin"
to = "KERNEL.BIN"
[[archive.layout]]
from = "assets/*"
to = "/"
```
Typical pairing with `kind = "flat-bin"` (NASM `-f bin`) for bootloaders and pure-ASM OS images.
## `flat-bin` (kind)
Produces a raw binary (default extension `bin`) for boot sectors, kernels, and freestanding payloads.
### Assemblers
| Tool | Language / compiler | How flat-bin is produced |
| ---- | ------------------------------------------ | -------------------------------------------- |
| NASM | `language = "asm"`, `compiler = "nasm"` | `-f bin` → `\<stem>.bin` |
| FASM | `compiler = "fasm"` | direct write (use `format binary` in source) |
| GAS | `compiler = "as"` / `"gas"` | assemble → `objcopy -O binary` |
| MASM | `compiler = "ml"` / `"ml64"` | assemble → `objcopy -O binary` |
| LLC | `language = "llvm_ir"`, `compiler = "llc"` | `-filetype=obj` → `objcopy -O binary` |
```toml
[build]
language = "asm"
compiler = "nasm"
kind = "flat-bin"
extension = "bin"
roots = ["src/boot.asm"]
```
### C / C++
Compile all sources, link with `-nostdlib -static` (plus your `ldflags` / `ldscript`), then convert the intermediate ELF/PE with `objcopy -O binary` to `\<filename|name>.bin`.
```toml
[build]
language = "c"
compiler = "clang"
kind = "flat-bin"
freestanding = true
filename = "kernel"
extension = "bin"
ldscript = "linker.ld"
ldflags = ["-T", "linker.ld"]
```
Notes:
* Multi-file **ASM** packages emit one `\<stem>.bin` per source; **C/C++** emit a single project binary.
* `objcopy` tools tried in order: `llvm-objcopy`, `objcopy`, `gobjcopy`.
* Incompatible with `build.qt = true`.
* `dcr run` rejects `flat-bin` (not a host executable).

View File

@@ -6,7 +6,7 @@ sidebar_label: Dependencies
## Formats ## Formats
The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies: The `[dependencies]` section supports three formats:
### String (registry) ### String (registry)
@@ -23,10 +23,10 @@ The version string is used as-is for registry lookup.
```toml ```toml
[dependencies] [dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0" } fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
``` ```
Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`. Fields: `git`, `branch`, `tag`, `rev`.
### Table (path) ### Table (path)
@@ -35,32 +35,6 @@ Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`.
mylib = { path = "../mylib" } mylib = { path = "../mylib" }
``` ```
For a prebuilt external library, specify its layout explicitly. The three
arrays are paths relative to the dependency root (`include`, `lib`) and linker
names (`libs`):
```toml
[dependencies]
dcr-math = { path = "../deps/dcr-math", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
### Table (`pkg-config`)
Use an installed `.pc` package when the library is provided by the operating system
or another system package manager. DCR invokes `pkg-config --cflags` and
`pkg-config --libs`, preserving include, library, linker, and other flags:
```toml
[dependencies]
fmt = { pkg-config = "fmt" }
openssl = { pkg-config = ["openssl", "libcrypto"] }
```
The `pkg-config` executable must be available in `PATH`. The named `.pc` files must
be available through pkg-config's standard search paths or via `PKG_CONFIG_PATH`.
These dependencies are not downloaded or built by DCR; they are recorded in
`dcr.lock` with a `pkg-config+...` source.
## Registry ## Registry
DCR uses a package registry for dependency lookup by name. DCR uses a package registry for dependency lookup by name.
@@ -68,7 +42,7 @@ DCR uses a package registry for dependency lookup by name.
```toml ```toml
# ~/.dcr/config.toml # ~/.dcr/config.toml
[registry.default] [registry.default]
url = "https://index.dcr.dexoron.tech" url = "https://index.dcr.pm"
priority = 1 priority = 1
``` ```
@@ -76,23 +50,7 @@ Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrid
## Git dependencies ## Git dependencies
Git dependencies are cloned into `~/.dcr/git/`; their exact checked-out commit is written to `dcr.lock`. Git dependencies are parsed and recorded in `dcr.lock`. DCR supports specifying branch/tag/rev for git sources:
Both Git and path dependencies have two modes:
* **DCR package:** the source has `dcr.toml`. DCR builds it before the consumer and uses the package name from its manifest for linking.
* **Prebuilt library:** it provides existing headers and binaries through `include`, `lib`, and `libs`. DCR passes them to the compiler/linker without building the dependency.
The mode is normally detected automatically. Use `mode = "build"` or `mode = "prebuild"` when a source contains both a manifest and prebuilt artifacts and you need to choose explicitly.
`dcr-math-lib` publishes both forms. Select its prebuilt library explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
DCR supports specifying branch/tag/rev for git sources:
* `branch` — switch to a branch * `branch` — switch to a branch
* `tag` — switch to a tag * `tag` — switch to a tag
@@ -101,7 +59,7 @@ DCR supports specifying branch/tag/rev for git sources:
## Path dependencies ## Path dependencies
Local paths may point at a DCR package or a prebuilt external library. A path DCR package is built before its consumer, including its own path/git dependencies. DCR detects dependency cycles. A prebuilt library is never built by DCR; it is linked from the directories declared in its dependency entry. Local paths. DCR automatically discovers include and lib directories from the neighbor's `dcr.toml`.
```toml ```toml
[dependencies] [dependencies]
@@ -109,51 +67,16 @@ mylib = { path = "/abs/path/to/lib" }
mylib = { path = "../relative/path" } mylib = { path = "../relative/path" }
``` ```
For DCR packages, the package name from `dcr.toml` is used for linking (so the dependency key may differ from the library name). Header resolution includes the packaged `target/include` directory and link search includes `target/lib`.
### Recommended library layouts
Buildable DCR library:
```text
dcr-math-lib/
├── dcr.toml
└── src/
├── dcr_math.c
└── dcr_math.h
```
Prebuilt library:
```text
dcr-math-lib/
├── include/
│ └── dcr_math.h
└── lib/
└── libdcr-math.a # or .so / .lib
```
`libs` contains linker names without the `lib` prefix and file extension: use
`["dcr-math"]` for `libdcr-math.a`.
If one repository contains both forms, keep the prebuilt files in `include/` and `lib/` and select the mode explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
For a local copy, replace `git` with `path = "../dcr-math-lib"`. In `prebuild` mode DCR does not run the dependency build, even when `dcr.toml` is present.
## dcr.lock ## dcr.lock
Dependency lock file. Contains package names and sources. Dependency lock file. Contains package names and sources.
Created during `dcr build` for resolved registry, path, and Git dependencies. Not updated during `dcr add` — only on the next `dcr build`. Created during `dcr build` when registry dependencies are present. Not updated during `dcr add` — only on the next `dcr build`.
## Resolution process ## Resolution process
1. Resolve dependency sources (registry → git → path) 1. Load all dependencies (registry → git → path)
2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref 2. For path deps: recursively read their `dcr.toml`
3. Build DCR package dependencies recursively 3. For registry deps: search `index.json`
4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler 4. For git deps: clone to cache
5. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler

View File

@@ -58,27 +58,3 @@ export DCR_INDEX_PATH=/custom/path/index.json
``` ```
Default: `~/.dcr/index.json`. Default: `~/.dcr/index.json`.
## DCRUP_MIRROR
Download mirror for `dcrup` (prebuilt binaries only).
```bash
export DCRUP_MIRROR=auto # cf → gh → sf → ya (default)
export DCRUP_MIRROR=cf # CloudFlare CDN
export DCRUP_MIRROR=gh # GitHub Releases
export DCRUP_MIRROR=sf # SourceForge
export DCRUP_MIRROR=ya # Yandex CDN (RU fallback)
```
CLI override: `dcrup install stable --mirror cf`.
## DCRUP_HOME / DCRUP_BIN / DCRUP_REPO
Installer layout and source clone URL:
```bash
export DCRUP_HOME=~/.dcr
export DCRUP_BIN=~/.dcr/bin
export DCRUP_REPO=https://github.com/dexoron/dcr
```

View File

@@ -11,18 +11,17 @@ DCR normalizes target triples. Short platform names are expanded to full triples
### Linux ### Linux
``` ```
target/<arch>-unknown-linux-<env>/<profile>/ target/<arch>-unknown-linux-gnu/<profile>/
``` ```
Architectures: `x86_64`, `aarch64`, `i686`, `armv7`, `riscv64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
Environments: `gnu` (default), `musl`.
Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib). Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib).
### macOS ### macOS
``` ```
target/<profile>/ (default) or target/<triple>/<profile>/ (with target) target/<profile>/
``` ```
Architectures: `x86_64`, `aarch64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
@@ -32,11 +31,10 @@ Extensions: `.dylib` (sharedlib), `.a` (staticlib).
### Windows ### Windows
``` ```
target/<profile>/ (default) or target/<triple>/<profile>/ (with target) target/<profile>/
``` ```
Architectures: `x86_64`, `aarch64`. Architectures: `x86_64`, `aarch64`.
Environments: `msvc` (default), `gnu` (MinGW).
Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI). Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI).

View File

@@ -43,10 +43,7 @@ dcr build # build all packages in dependency order
dcr build --workspace app # build only app (dependencies built automatically) dcr build --workspace app # build only app (dependencies built automatically)
``` ```
When building a workspace, DCR automatically injects include and library paths of dependent workspace members: When building a workspace, member outputs (libraries) are automatically added to include/lib paths of dependent packages.
* **Include Paths**: Automatically resolves and injects header directories of dependencies, including the member's `src/` directory, local `include/` directory, and the packaged `target/include` directory.
* **Library Paths**: Injects compiled library search paths (`target/lib` as well as target-specific build folders) to allow automatic linking with member libraries.
## Clean ## Clean

View File

@@ -8,11 +8,8 @@ sidebar_label: Introduction
<summary>Quick reference</summary> <summary>Quick reference</summary>
```bash ```bash
# Installation (dcrup) # Installation
curl -fsSL https://sh.dcr-tool.ru | sh -s -- self-install curl -fsSL https://dcr.dexoron.su/install.sh | sh
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable # auto: cf → gh → sf → ya
# dcrup install stable --mirror cf # CloudFlare / GitHub / SourceForge / Yandex
# Create a project # Create a project
dcr new my-app dcr new my-app
@@ -54,9 +51,8 @@ dcr gen vscode
* **Incremental builds** — mtime + `.d` headers + SHA256 fingerprint * **Incremental builds** — mtime + `.d` headers + SHA256 fingerprint
* **Parallel compilation** — thread::scope, atomic task queue * **Parallel compilation** — thread::scope, atomic task queue
* **7 backends** — gcc/clang (unix_cc), MSVC/clang-cl (msvc), GAS, NASM, MASM, FASM, LLVM IR * **4 backends** — gcc/clang, MSVC/clang-cl, GAS (ARM), NASM (x86)
* **8 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom, flat-bin * **7 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom
* **Disk images** — optional `[archive]` packs FAT12/16/32 images after build
* **Cross-compilation** — short names and full triples * **Cross-compilation** — short names and full triples
* **Profiles** — debug / release with field overrides * **Profiles** — debug / release with field overrides
* **Workspaces** — multi-package projects with topological sort * **Workspaces** — multi-package projects with topological sort

View File

@@ -4,209 +4,6 @@ sidebar_label: Changelog
# Changelog # Changelog
## 0.9.5 (2026-10-21)
* **Structured CLI output** — shared helpers now provide Cargo-like human, plain, and JSON output modes.
* **Color and diagnostics policy** — `--color`, `NO_COLOR`, `--quiet`, and `--verbose` are applied consistently across commands.
* **Build reporting** — lifecycle events and compiler diagnostics are available as structured JSON events.
* **Output lab** — sandbox scenarios cover help, lifecycle commands, compiler warnings/errors, stream capture, and broken pipes.
## 0.9.1 (2026-09-13)
* **`pkg-config` dependencies** — declare `fmt = { pkg-config = "fmt" }` or multiple package names in `[dependencies]`; DCR applies `.pc` compiler/linker flags and records the resolved package in `dcr.lock`.
* **`dcr add` support for `pkg-config`** — easily add system package dependencies with `dcr add fmt pkg-config:fmt` or `dcr add openssl pkg:openssl,libcrypto`.
* **`dcr tree` & IDE integration** — `pkg-config` packages are marked in `dcr tree` and resolved into compiler flags in `dcr gen` (`compile_commands.json`).
* **Fixed `dcr new` in non-ASCII / spaced paths** — initializing projects from folders with non-ASCII characters or spaces no longer fails validation.
## 0.9.0 (2026-08-31)
* **Download mirrors in `dcrup`** — `--mirror auto|cf|gh|sf|ya` and `DCRUP_MIRROR`.
Default `auto` tries **cf → gh → sf → ya** (CloudFlare CDN, GitHub, SourceForge, Yandex CDN).
* **Complete Path/Git dependencies** — DCR packages from `path` and `git` are built before their consumer. Git sources are cached in `~/.dcr/git`, support `branch`/`tag`/`rev`, and record the exact commit in `dcr.lock`.
* **Build and prebuild modes** — `path` and `git` dependencies can build a DCR package from `dcr.toml` or link existing `include`/`lib`/`libs` artifacts; `mode = "build"` / `"prebuild"` selects explicitly when both forms are present.
* **Prebuilt dependency examples** — documentation now shows the `dcr-math-lib` Git repository and recommended build/prebuilt layouts for both `git` and `path`.
* **Transitive dependency builds and cycle reporting** — DCR recursively builds DCR packages and reports a clear dependency chain for cycles.
* **Bare path arguments for `dcr add`** — `dcr add mylib ../mylib` now works in addition to the explicit `path:` form.
* **Removed `install.sh` / `install.ps1` / `install_bsd.sh`** — superseded by `dcrup`.
## 0.8.5 (2026-08-08)
* **`package.dcr-version`** — optional CLI version pin in `dcr.toml`.
`dcr new` / `dcr init` write 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 with `CompilationDatabase: .dcr` (`# managed by dcr gen`); custom `.clangd` is not overwritten.
* **Helpers** `canonicalize_path`, `atomic_write`, `ensure_dcr_dir`; pure `resolve_artifact_path` via `platform::*`.
* **`dcr new` / `dcr init`** — add `.dcr/` to `.gitignore`.
**Changed (breaking):**
* **`compile_commands.json` moved** 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 clion` launch/run** — use the same artifact path resolver as `project-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 `ldflags` without CLI `--target`; run-arg forwarding; `split_double_dash` unit tests.
### Changed
* **Native builds resolve the host triple** — without `--target` / package `build.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` / man `dcr-run`** — document `--` forwarding.
### Fixed
* **Native artifact paths on Windows and macOS** — without an explicit `--target` / `build.target`, artifacts use `target/\<profile>`, so `dcr run` and flat-bin find the build output.
* Target-specific `ldflags` missing 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 via `fatfs` (`cargo build --features archive`). Release CI builds with the feature; without it `[archive]` fails with a clear message.
* **Tests** — `flat_bin_nasm_build`, package `build.target` without CLI `--target`, stricter workspace `clean --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/member `build.target` is honored (bare-metal / ISO `post_steps` paths).
* **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 local `target/` (shared root `target/`).
* **`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 raw `os 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 binary` in source)
* **GAS / MASM / LLC** — object → `objcopy -O binary` → `\<stem>.bin`
* **C/C++** — objects → freestanding link → `objcopy -O binary` → `\<name>.bin`
* Requires `llvm-objcopy` / `objcopy` / `gobjcopy` except for NASM/FASM direct emit
* **`[archive]` section** — FAT12/16/32 disk images after build (`output`, `format`, `size`, `offset`, `label`, `bootsector`, `layout`). From 0.8.2 requires feature `archive`.
* **Single-file `build.roots`** — a root may be a single source or header file, not only a directory.
### Changed
* **`--force`** also re-runs `build.steps` and `build.post_steps`.
* **`dcr run` on workspace-only root** — if `[run].cmd` is 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 in `src/cli/build.rs` to a reusable, decoupled core build engine.
* **Polymorphic Language Model (`Language` trait)** — introduced the abstract `Language` trait (`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 (`Builder` trait)** — introduced the `Builder` trait to generalize builder invocations (`src/core/build/builder/mod.rs`). Consolidated GCC/Clang logic into `builder/cc_common.rs` and Microsoft Visual C++ logic into `builder/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 in `dcr.toml`.
* **Automatic Workspace Dependency Injection** — during workspace builds, include/lib paths of dependent workspace members (including their source headers, local `include/` folders, and build target `target/include` / `target/lib` folders) are automatically resolved and injected.
* **`BuildReporter` Event 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., in `dcr add`).
* **Path Dependencies Target Include Resolution** — local path dependencies configured via tables now correctly expose headers built and packaged into their `target/include` folder to consumer packages.
* **Modular Integration Test Suite** — refactored the monolith `tests/cli_basic.rs` file 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.rs` module.
* **Workspace-Aware member execution** — `dcr run` executed at the workspace root of a `workspace_only` project now triggers the member build inside the workspace context using the `--workspace` parameter, preventing standalone build issues.
* **Elimination of Global State** — removed global variables and states from the build core, encapsulating build logic inside isolated `BuildContext` structs 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 = true` is set in `dcr.toml`.
* **`dcr lint` command** — C/C++ static analysis via `clang-tidy`. Supports `--fix` for automatic fixes. Respects `build.roots` and `build.src_disable` from config.
* **Three new assembler backends**:
* **MASM** (`compiler = "ml"` / `"ml64"`) — Microsoft Macro Assembler.
* **FASM** (`compiler = "fasm"`) — Flat Assembler.
* **LLVM IR** (`compiler = "llc"`) — compiles `.ll` files via `llc -filetype=obj`.
* **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()` and `home_dir()` extracted to `utils/fs.rs`.
* **Build utilities** — `normalize_target()`, `normalize_kind()`, `normalize_platform()`, `default_profile_flags()` extracted to `utils/build.rs`.
* **Backend helpers** — `asm_lang_flag()`, `source_extensions()`, `elapsed_secs()` added to `core/builder/common.rs`.
* **Full Bare-Metal / Freestanding Automation** — introduced the `build.freestanding = true` configuration option. When enabled (or when a bare-metal target is detected), DCR automatically injects `-ffreestanding` during compilation and both `-nostdlib` and `-static` during linking.
* **Artifact Optimization (LTO & Strip)** — added `build.lto` (auto-injects `-flto` for compiler and linker) and `build.strip` (automatically strips debug symbols via linker `-s` flag) options to `dcr.toml`.
* **Compilation Thread Control** — added the `build.codegen-units` option to strictly limit the maximum number of parallel jobs utilized by the custom `parallel_build` worker 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 if `build.cflags` are overridden.
* **Centralized Bare-Metal Detection** — relocated the `is_bare_metal_target` helper to common build utilities (`src/utils/build.rs`) for unified access across the building core.
* **Architectural Refactoring**:
* Renamed `src/config.rs` to `src/templates.rs`.
* Started consolidation of configuration and build orchestration logic.
## 0.7.3 (2026-06-13)
### Added
* **`--vcs` option for `new` and `init` commands** — 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 `-dirty` suffix if there are uncommitted changes in the DCR repository.
* **Automatic `.gitignore` generation** — Git repository initialization now automatically writes a `.gitignore` file excluding the `/target` directory.
* **Nested repository prevention** — automatic Git initialization is now skipped if `dcr new` or `dcr init` is executed inside an already existing Git repository.
* **VCS verification tests** — added `new_vcs_options_work` and `init_vcs_options_work` integration tests to ensure reliable repository behavior.
### Changed
* **Complete removal of `git2` dependency** — all Git actions (dependency fetching, VCS setup, status checks) are now delegated to the system `git` executable via `Command`. This simplifies compilation and drops the need for `vendored` and `openssl` features.
* **Migrated from `reqwest` to `ureq`** — replaced the heavy `reqwest` crate in `flag_update.rs` with the lightweight synchronous `ureq 2.10` client, reducing overhead and the final binary size.
## 0.7.2 (2026-06-07)
### Added
* `default_target_triple()` now respects `target_env` — Linux (gnu/musl) and Windows (msvc/gnu) use the correct environment instead of hardcoded values.
### Fixed
* **macOS Apple Silicon builds failed with `_main` undefined** — `--target=` is now passed to ldflags, not just cflags. `default_target_triple()` uses `std::env::consts::ARCH` on macOS instead of hardcoded `x86_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) ## 0.7.1 (2026-06-02)
### Added ### Added

View File

@@ -13,7 +13,7 @@ dcr build # debug profile
dcr build --release # release build dcr build --release # release build
dcr build --debug # explicit debug dcr build --debug # explicit debug
dcr build --target aarch64-unknown-linux-gnu dcr build --target aarch64-unknown-linux-gnu
dcr build --force # full rebuild (also re-runs build.steps / post_steps) dcr build --force # full rebuild
dcr build --clean # clean + build dcr build --clean # clean + build
dcr build --verbose # show compilation commands dcr build --verbose # show compilation commands
dcr build --workspace pkg-a # build specific workspace package dcr build --workspace pkg-a # build specific workspace package
@@ -21,8 +21,6 @@ dcr build --workspace pkg-a # build specific workspace package
Artifacts: `target/\<triple>/\<profile>/\<binary-name>` (Linux with explicit target). Artifacts: `target/\<triple>/\<profile>/\<binary-name>` (Linux with explicit target).
With `[archive]` in `dcr.toml`, a FAT disk image is packed after a successful build.
## `dcr run` ## `dcr run`
Builds (if sources are newer than artifacts) and runs the binary. Builds (if sources are newer than artifacts) and runs the binary.
@@ -30,11 +28,8 @@ Builds (if sources are newer than artifacts) and runs the binary.
```bash ```bash
dcr run dcr run
dcr run --release dcr run --release
dcr run --force # force rebuild then run
``` ```
On a **workspace-only** root: if `[run].cmd` is set, that command is used after build; otherwise DCR delegates to a workspace member.
## `dcr clean` ## `dcr clean`
Removes `target/` directory (or `target/\<target>/\<profile>`). Removes `target/` directory (or `target/\<target>/\<profile>`).

View File

@@ -15,8 +15,6 @@ dcr add mylib path:./lib # explicit path prefix
dcr add mylib git:https://github.com/user/repo # explicit git prefix dcr add mylib git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub shorthand dcr add mylib github:user/repo # GitHub shorthand
dcr add mylib gitlab:user/repo # GitLab shorthand dcr add mylib gitlab:user/repo # GitLab shorthand
dcr add fmt pkg-config:fmt # system package via pkg-config
dcr add openssl pkg:openssl,libcrypto # multiple pkg-config packages
``` ```
Source prefixes: Source prefixes:
@@ -25,7 +23,6 @@ Source prefixes:
* `git:` — generic git URL * `git:` — generic git URL
* `github:` — expands to `https://github.com/\<user>/\<repo>` * `github:` — expands to `https://github.com/\<user>/\<repo>`
* `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>` * `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>`
* `pkg-config:` / `pkg:` — one or more packages resolved by `pkg-config`
* `http://` / `https://` / `git@` — full URL * `http://` / `https://` / `git@` — full URL
Flags: Flags:
@@ -34,12 +31,7 @@ Flags:
* `--tag \<name>` — git tag * `--tag \<name>` — git tag
* `--rev \<hash>` — git commit * `--rev \<hash>` — git commit
If source is omitted — DCR searches connected registries. A bare relative or absolute path is accepted as a path dependency. If source is omitted — DCR searches connected registries.
For `pkg-config` dependencies, the referenced packages must already be installed
and provide `.pc` files. DCR invokes `pkg-config` during the build (using
`PATH` and `PKG_CONFIG_PATH`) and forwards the returned compiler and linker
flags; it does not download or build these packages.
## `dcr tree` ## `dcr tree`

View File

@@ -8,7 +8,6 @@ sidebar_label: Contributing
```bash ```bash
git clone https://github.com/dexoron/dcr git clone https://github.com/dexoron/dcr
# or a source mirror: GitVerse / SourceCraft / SourceForge / GitLab (see README)
cd dcr cd dcr
cargo build cargo build
``` ```
@@ -43,11 +42,10 @@ cargo test --all-targets
## CI ## CI
CI runs (see `.github/workflows/ci.yml`): CI runs:
* `cargo fmt --check` * `cargo fmt --check`
* `cargo clippy` (default + `--all-features`) * `cargo clippy --all-targets -- -D warnings`
* `cargo check --all-targets --all-features` * `cargo test --all-targets`
* Unit + integration tests on Linux, macOS, Windows * Build on Linux, macOS, Windows
* Extra Linux job with `--features archive` (FAT images) * Integration tests
* Tools on runners: clang, nasm, clang-format/tidy (Linux)

View File

@@ -39,6 +39,27 @@ which clang
Or specify explicitly via `[toolchain]` in `dcr.toml`. Or specify explicitly via `[toolchain]` in `dcr.toml`.
## openssl-sys build failed
When building DCR from source:
```
error: failed to run custom build command for openssl-sys
```
**Solution:** Install OpenSSL development headers:
```bash
# Ubuntu/Debian
sudo apt install libssl-dev
# Fedora
sudo dnf install openssl-devel
# macOS
brew install openssl
```
## Ctrl+C during build ## Ctrl+C during build
DCR handles SIGINT: interrupts the current compilation and exits with non-zero code. DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
@@ -55,21 +76,6 @@ See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
See [Workspace Recipe](/docs/recipes/multi-package-workspace). See [Workspace Recipe](/docs/recipes/multi-package-workspace).
## Bootloader / pure NASM OS image
Use `kind = "flat-bin"` (NASM `-f bin`) and optional `[archive]` for a FAT disk image.
See [OS-dev recipe](/docs/recipes/os-flat-bin-archive).
## How do I choose a download mirror?
`dcrup install` uses `--mirror auto` by default and tries **cf → gh → sf → ya**.
```bash
dcrup install stable --mirror cf
export DCRUP_MIRROR=ya
```
## Lock file ## Lock file
`dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`. `dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`.

View File

@@ -70,10 +70,3 @@ dcr test # run tests
```bash ```bash
dcr fmt # clang-format with .clang-format dcr fmt # clang-format with .clang-format
``` ```
## Linting
```bash
dcr lint # clang-tidy checks
dcr lint --fix # apply fixes automatically
```

View File

@@ -4,75 +4,28 @@ sidebar_label: Installation
# Installation # Installation
## dcrup (recommended) ## Linux (Dexoron Packages)
Install and switch DCR versions (stable / dev / night, pin `0.8.2`, optional build from source). Configure your package manager at https://pkg.dexoron.su and install:
### Linux / macOS / BSD / Windows (bash) **Arch Linux**
```sh ```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- self-install sudo pacman -Sy dcr
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable
``` ```
Non-interactive install of DCR in one shot: **Debian/Ubuntu**
```sh ```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- install stable sudo apt update && sudo apt install dcr
export PATH="$HOME/.dcr/bin:$PATH"
``` ```
### Windows (PowerShell) **Fedora/RHEL**
```powershell
& ([scriptblock]::Create((irm https://ps1.dcr-tool.ru))) self-install
# $env:Path += ";$env:USERPROFILE\.dcr\bin"
dcrup install stable
```
After `self-install`, the command is **`dcrup`** (no `.sh` / `.ps1`) and is installed in `~/.dcr/bin` (Unix) or `%USERPROFILE%\.dcr\bin` (Windows).
### Common dcrup commands
```sh ```sh
dcrup install stable # latest stable prebuilt (auto: cf → gh → sf → ya) sudo dnf install dcr
dcrup install 0.8.2 # pin → 0.8.2@stable
dcrup install 0.8.2@dev
dcrup install stable --libc musl # Linux: musl asset (default: gnu)
dcrup install stable --mirror cf # CloudFlare CDN
dcrup install stable --mirror ya # Yandex CDN (RU fallback)
dcrup install stable --build # cargo build --features archive
dcrup install night # always build from branch dev HEAD
dcrup default 0.8.2
dcrup update
dcrup list
dcrup show
dcrup which
dcrup uninstall 0.8.2 # remove one installed version
dcrup uninstall --all # remove all installed versions
``` ```
Layout: `~/.dcr/toolchains/\<id>/dcr` and `~/.dcr/bin/dcr` → active version.
### Download mirrors
Prebuilt installs try **cf → gh → sf → ya** unless you pin a host.
| Code | URL | Notes |
| ---- | ------------------------------------------------------------------------------------------------------------ | -------------------------- |
| `cf` | `https://cdn-global.dcr-tool.ru/\<tag>/\<asset>` | CloudFlare CDN (worldwide) |
| `gh` | `https://github.com/dexoron/dcr/releases/download/\<tag>/\<asset>` | GitHub Releases |
| `sf` | `https://sourceforge.net/projects/dcr-tool/files/\<tag>/\<asset>/download` | SourceForge |
| `ya` | `https://cdn-ru.dcr-tool.ru/\<tag>/\<asset>` | Yandex CDN (RU fallback) |
```sh
dcrup install stable --mirror auto # default
export DCRUP_MIRROR=cf # persist for this shell
```
---
## Arch Linux (AUR) ## Arch Linux (AUR)
```sh ```sh
@@ -92,12 +45,11 @@ brew install dcr
sudo snap install dcrup sudo snap install dcrup
``` ```
> If classic Snap Store publishing is unavailable, install the `.snap` from [GitHub Releases](https://github.com/dexoron/dcr/releases/latest) with `--dangerous`.
## Nix (flake) ## Nix (flake)
```sh ```sh
nix run github:dexoron/dcr nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr nix profile install github:dexoron/dcr
``` ```
@@ -107,37 +59,48 @@ nix profile install github:dexoron/dcr
cargo install dcr cargo install dcr
``` ```
Note: crates.io builds may omit optional features. For FAT disk images (`[archive]`), prefer release binaries or: ## Linux / macOS (script)
```sh ```sh
cargo install dcr --features archive curl -fsSL https://dcr.dexoron.su/install.sh | sh
```
## BSD (script)
```sh
curl -fsSL https://dcr.dexoron.su/install_bsd.sh | sh
```
## Windows (PowerShell)
```powershell
irm https://dcr.dexoron.su/install.ps1 | iex
``` ```
## From source ## From source
```sh ```sh
git clone https://github.com/dexoron/dcr.git git clone https://github.com/dexoron/dcr.git
cd dcr cd dcr && cargo build --release
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
``` ```
## Post-install ## Post-install
Verify the installation:
```bash ```bash
dcr --version dcr --version
dcrup show # if installed via dcrup
``` ```
Man pages (package installs / release assets): Man pages are available after installation:
```bash ```bash
man dcr man dcr
man dcr-build man dcr-build
``` ```
Registry (optional) — `~/.dcr/config.toml`: To use the registry, create `~/.dcr/config.toml`:
```toml ```toml
[registry.default] [registry.default]

View File

@@ -6,13 +6,6 @@ sidebar_label: IDE Integration
## VS Code ## VS Code
Install the recommended [DCR extension by Dexoron-Labs](https://marketplace.visualstudio.com/items?itemName=Dexoron-Labs.dcr). Do not install Microsoft C/C++ extensions for DCR projects: DCR uses `clangd`. MS C/C++ is acceptable only when you need its debugger.
Recommended companion extensions:
* [Even Better TOML](https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml)
* [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb), or MS C/C++ for debugger support only
```bash ```bash
dcr gen vscode dcr gen vscode
``` ```

View File

@@ -1,89 +0,0 @@
---
sidebar_label: OS-dev (flat-bin + archive)
---
# Pure ASM / boot image (flat-bin + archive)
Minimal OS-dev style pipeline: assemble raw binaries with NASM, then pack a FAT floppy/image with an optional boot sector.
## Project layout
```
myos/
dcr.toml
src/
boot.asm # boot sector (512 bytes)
kernel.asm # payload
```
For multiple flat artifacts, use a **workspace** (one member per binary) or separate packages; a single `flat-bin` package produces one binary per source stem.
## Boot package (`flat-bin`)
```toml
[package]
name = "boot"
version = "0.1.0"
[build]
language = "asm"
compiler = "nasm"
kind = "flat-bin"
extension = "bin"
roots = ["src/boot.asm"]
```
```bash
dcr build
# → target/<…>/debug/boot.bin (NASM -f bin, no link)
```
## Disk image after build
```toml
[archive]
output = "target/{profile}/disk.img"
format = "fat12"
size = "1440K"
label = "MYOS"
bootsector = "target/{profile}/boot.bin"
[[archive.layout]]
from = "target/{profile}/kernel.bin"
to = "KERNEL.BIN"
```
* `format`: `fat12`, `fat16`, or `fat32`
* `size`: bytes or `K`/`KB`/`M`/`MB`/`G`/`GB` (default ~1.44 MiB)
* `bootsector`: written only when `offset` is omitted or `0`
* `from` may be a glob; `{profile}` is substituted in paths
## C kernel → flat binary
```toml
[build]
language = "c"
compiler = "clang"
kind = "flat-bin"
freestanding = true
filename = "kernel"
extension = "bin"
ldflags = ["-T", "linker.ld"]
```
Pipeline: objects → temporary linked ELF → `objcopy -O binary` → `kernel.bin`. Requires `objcopy` / `llvm-objcopy` in PATH.
## Other assemblers
| Tool | Notes |
| -------- | --------------------------------------------------------------------------------------- |
| **FASM** | Write `format binary` in the source; DCR writes `\<stem>.bin` directly |
| **GAS** | Assemble `.s` → obj → `objcopy -O binary` |
| **LLC** | `language = "llvm_ir"` → obj → objcopy |
| **MASM** | COFF obj → objcopy (needs binutils/LLVM objcopy) |
## Notes
* Single-file `roots` are supported: `roots = ["src/boot.asm"]`.
* `--force` re-runs `build.steps` / `build.post_steps` as well as recompilation.
* Prefer `kind = "elf"` if you need a relocatable ELF kernel without stripping to raw binary.

View File

@@ -56,7 +56,7 @@ moc = "moc {in} -o {out}"
### GAS / NASM / MASM / FASM / LLVM-IR ### GAS / NASM / MASM / FASM / LLVM-IR
* GAS: `-I`, `-c -o`, `--defsym` * GAS: `-I`, `-c -o`, `--defsym`
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32; **`bin` when `kind = "flat-bin"`**) * NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32)
* MASM: `/nologo /c /Fo\<obj> <source>` * MASM: `/nologo /c /Fo\<obj> <source>`
* FASM: `<source> \<output>` (output path is the object file) * FASM: `<source> \<output>` (output path is the object file)
* LLVM IR: `-filetype=obj <source> -o \<output>` * LLVM IR: `-filetype=obj <source> -o \<output>`
@@ -79,7 +79,7 @@ Three levels of incrementality:
## Build Kinds ## Build Kinds
| Kind | Type | Path (Linux example) | | Kind | Type | Path (Linux example) |
| ----------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | ----------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) | | `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) |
| `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) | | `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) |
| `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) | | `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) |
@@ -87,11 +87,6 @@ Three levels of incrementality:
| `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` | | `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` |
| `none` | Compile only, no link | — | | `none` | Compile only, no link | — |
| `custom` | Full filename+extension control | `target/\<triple>/\<profile>/\<filename>.\<extension>` | | `custom` | Full filename+extension control | `target/\<triple>/\<profile>/\<filename>.\<extension>` |
| `flat-bin` | Raw binary | ASM: `\<stem>.bin` (NASM `-f bin` / FASM / GAS·MASM·LLC via objcopy); C/C++: `\<name>.bin` (link + objcopy) |
## Disk images (`[archive]`)
After a successful build, if `[archive]` is present in `dcr.toml`, DCR formats a FAT volume and copies files from `layout` into the image. See [dcr.toml → archive](/docs/reference/dcr-toml#archive).
## Build Steps ## Build Steps

View File

@@ -1,34 +0,0 @@
---
sidebar_label: CLI output
---
# CLI output (experimental)
The structured output implementation is being developed incrementally.
Currently these global options apply to diagnostics emitted through the logger:
```sh
dcr --output plain build
dcr --output json build
dcr --color never build
dcr --quiet build
dcr --verbose build
```
`--output` accepts `human` (default), `plain`, or `json`.
Diagnostics are written to stderr. JSON diagnostics are newline-delimited objects
with `schema_version: 1`, `event`, and `message` fields. Command statuses use the
shared output helpers, build reporting emits structured lifecycle events, and
compiler output is represented as JSON events with its original stream and text.
The protocol is still experimental: some raw command data and subprocess stdout
remain unstructured.
`--color` accepts `auto`, `always`, or `never`. Automatic coloring requires a
terminal and respects `NO_COLOR`. Plain and JSON diagnostics never add colors.
Quiet mode preserves warnings, errors, and compiler diagnostics; verbose mode
enables debug and trace logging. Arguments following `--` are passed through
unchanged.
Remaining work includes migrating the remaining raw command data and subprocess
stdout, improving progress rendering and contextual errors, and expanding
integration coverage for stdout/stderr and closed pipes.

View File

@@ -57,8 +57,14 @@ dcr build --target aarch64-none-elf
## Target Directory ## Target Directory
By default, the compilation output directories are structured as follows: On Linux with explicit target:
* **Linux and BSD**: Always output to `target/\<triple>/\<profile>/` (using host triple if no target is specified). ```
* **macOS and Windows (without target)**: Output to `target/\<profile>/`. target/<triple>/<profile>/
* **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`. ```
On macOS/Windows or without target:
```
target/<profile>/
```

View File

@@ -33,18 +33,14 @@ Main project configuration file. Located at the project root.
[run] [run]
# run settings # run settings
[archive]
# optional: pack FAT disk image after build
``` ```
## [package] ## [package]
| Field | Required | Description | | Field | Required | Description |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------- | | --------- | -------- | ------------------------------------------- |
| `name` | yes | Project name | | `name` | yes | Project name |
| `version` | yes | Semantic version of the **project** | | `version` | yes | Semantic version |
| `dcr-version` | no | Semver of the **dcr tool** this project targets. Written by `dcr new` / `dcr init` to the current tool version. |
| `type` | no | `app`, `lib`, `none` (defaults to `"none"`) | | `type` | no | `app`, `lib`, `none` (defaults to `"none"`) |
| `license` | no | SPDX license identifier | | `license` | no | SPDX license identifier |
| `author` | no | Author | | `author` | no | Author |
@@ -53,26 +49,11 @@ Main project configuration file. Located at the project root.
[package] [package]
name = "my-app" name = "my-app"
version = "0.1.0" version = "0.1.0"
dcr-version = "0.8.4"
type = "app" type = "app"
license = "MIT" license = "MIT"
author = "John Doe" author = "John Doe"
``` ```
### `package.dcr-version`
Optional pin of the DCR CLI the project was written for. On every `dcr.toml` load:
| Situation | Behaviour |
| ------------------------------ | ---------------------------------------------------------- |
| Field missing / empty | Warning: add `dcr-version` (set by `dcr new` / `dcr init`) |
| Running dcr **older** than pin | Warning: upgrade dcr (`dcr --update`) |
| Running dcr **newer** than pin | Warning: review changelog, bump the pin when ready |
| Equal | Silent |
| Invalid semver | Warning once, field ignored |
Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) are ignored for comparison (`1.0.0-dev` ≡ `1.0.0`).
## [build] ## [build]
... ...
@@ -80,19 +61,19 @@ Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) ar
* `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`. * `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`.
| Field | Default | Description | | Field | Default | Description |
| ---------------- | ------------- | --------------------------------------------------------------------------------------------------------- | | ---------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) | | `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"` (optional, defaults to `"c"`) |
| `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) | | `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) |
| `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) | | `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) |
| `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) | | `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom`, `flat-bin` | | `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom` |
| `target` | host | Target triple for cross-compilation | | `target` | host | Target triple for cross-compilation |
| `platform` | `"native"` | `native`, `efi` | | `platform` | `"native"` | `native`, `efi` |
| `cflags` | `[]` | Additional C/C++/ASM flags | | `cflags` | `[]` | Additional C/C++/ASM flags |
| `ldflags` | `[]` | Additional linker flags | | `ldflags` | `[]` | Additional linker flags |
| `filename` | `""` | Custom output file name | | `filename` | `""` | Custom output file name |
| `extension` | `""` | Custom file extension (for `flat-bin`, default is `bin`) | | `extension` | `""` | Custom file extension |
| `roots` | `["src"]` | Source roots: directories and/or individual source/header files | | `roots` | `["src"]` | Source root directories |
| `exclude` | `[]` | Exclude patterns | | `exclude` | `[]` | Exclude patterns |
| `include` | `[]` | Additional include directories | | `include` | `[]` | Additional include directories |
| `src_disable` | `false` | Disable auto source discovery | | `src_disable` | `false` | Disable auto source discovery |
@@ -112,16 +93,11 @@ Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) ar
Settings from raw config (not in typed struct): Settings from raw config (not in typed struct):
* `pkg_config` — list of packages queried for build-wide compiler/linker flags * `pkg_config` — list of pkg-config packages
Dependencies can also declare a system package directly, for example
`fmt = { pkg-config = "fmt" }`. This records the package in `dcr.lock` and applies
the flags returned by `pkg-config --cflags` and `pkg-config --libs`.
* `ldscript` — linker script path * `ldscript` — linker script path
* `build.steps` / `build.post_steps` — codegen steps * `build.steps` / `build.post_steps` — codegen steps
## Per-language overrides: `[build.c]`, `[build.cxx]`, `[build.asm]`, `[build.llvm_ir]` ## Per-language overrides: `[build.c]`, `[build.cxx]`, `[build.asm]`
Each language can have its own table that overrides the flat `[build]` settings: Each language can have its own table that overrides the flat `[build]` settings:
@@ -141,9 +117,6 @@ compiler = "g++"
[build.asm] [build.asm]
compiler = "nasm" compiler = "nasm"
flags = ["-felf64"] flags = ["-felf64"]
[build.llvm_ir]
compiler = "llc"
``` ```
The flat `[build]` acts as fallback; per-language tables take precedence for their language. The flat `[build]` acts as fallback; per-language tables take precedence for their language.
@@ -201,84 +174,3 @@ Default `cmd` = `./target/{profile}/{name}` (macOS/Windows) or `./target/\<tripl
## [workspace] ## [workspace]
See [workspaces](/docs/reference/workspaces). See [workspaces](/docs/reference/workspaces).
## [archive]
Optional post-build step: format a FAT volume and copy built artifacts into a disk image. Runs after a successful package build (and after workspace member builds that define `[archive]`).
Requires DCR built with the `archive` Cargo feature (`cargo build --features archive`). Release binaries include this feature.
| Field | Required | Description |
| ------------ | -------- | ------------------------------------------------------------------------------------------- |
| `output` | yes | Image path relative to project root (`{profile}` allowed) |
| `format` | yes | `fat12`, `fat16`, or `fat32` |
| `size` | no | Image size: bytes or `K`/`KB`/`M`/`MB`/`G`/`GB` (default `1474560` ≈ 1.44 MiB) |
| `offset` | no | Byte offset of the FAT volume inside the image (default `0`) |
| `label` | no | Volume label (max 11 chars, default `VOLUME`) |
| `bootsector` | no | Path to a 512-byte boot sector written at offset 0 when `offset` is 0 (`{profile}` allowed) |
| `layout` | no | List of `{ from, to }` entries (files or globs → path inside the volume) |
```toml
[archive]
output = "target/{profile}/disk.img"
format = "fat12"
size = "1440K"
label = "MYOS"
bootsector = "target/{profile}/boot.bin"
[[archive.layout]]
from = "target/{profile}/kernel.bin"
to = "KERNEL.BIN"
[[archive.layout]]
from = "assets/*"
to = "/"
```
Typical pairing with `kind = "flat-bin"` (NASM `-f bin`) for bootloaders and pure-ASM OS images.
## `flat-bin` (kind)
Produces a raw binary (default extension `bin`) for boot sectors, kernels, and freestanding payloads.
### Assemblers
| Tool | Language / compiler | How flat-bin is produced |
| ---- | ------------------------------------------ | -------------------------------------------- |
| NASM | `language = "asm"`, `compiler = "nasm"` | `-f bin` → `\<stem>.bin` |
| FASM | `compiler = "fasm"` | direct write (use `format binary` in source) |
| GAS | `compiler = "as"` / `"gas"` | assemble → `objcopy -O binary` |
| MASM | `compiler = "ml"` / `"ml64"` | assemble → `objcopy -O binary` |
| LLC | `language = "llvm_ir"`, `compiler = "llc"` | `-filetype=obj` → `objcopy -O binary` |
```toml
[build]
language = "asm"
compiler = "nasm"
kind = "flat-bin"
extension = "bin"
roots = ["src/boot.asm"]
```
### C / C++
Compile all sources, link with `-nostdlib -static` (plus your `ldflags` / `ldscript`), then convert the intermediate ELF/PE with `objcopy -O binary` to `\<filename|name>.bin`.
```toml
[build]
language = "c"
compiler = "clang"
kind = "flat-bin"
freestanding = true
filename = "kernel"
extension = "bin"
ldscript = "linker.ld"
ldflags = ["-T", "linker.ld"]
```
Notes:
* Multi-file **ASM** packages emit one `\<stem>.bin` per source; **C/C++** emit a single project binary.
* `objcopy` tools tried in order: `llvm-objcopy`, `objcopy`, `gobjcopy`.
* Incompatible with `build.qt = true`.
* `dcr run` rejects `flat-bin` (not a host executable).

View File

@@ -6,7 +6,7 @@ sidebar_label: Dependencies
## Formats ## Formats
The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies: The `[dependencies]` section supports three formats:
### String (registry) ### String (registry)
@@ -23,10 +23,10 @@ The version string is used as-is for registry lookup.
```toml ```toml
[dependencies] [dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0" } fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
``` ```
Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`. Fields: `git`, `branch`, `tag`, `rev`.
### Table (path) ### Table (path)
@@ -35,32 +35,6 @@ Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`.
mylib = { path = "../mylib" } mylib = { path = "../mylib" }
``` ```
For a prebuilt external library, specify its layout explicitly. The three
arrays are paths relative to the dependency root (`include`, `lib`) and linker
names (`libs`):
```toml
[dependencies]
dcr-math = { path = "../deps/dcr-math", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
### Table (`pkg-config`)
Use an installed `.pc` package when the library is provided by the operating system
or another system package manager. DCR invokes `pkg-config --cflags` and
`pkg-config --libs`, preserving include, library, linker, and other flags:
```toml
[dependencies]
fmt = { pkg-config = "fmt" }
openssl = { pkg-config = ["openssl", "libcrypto"] }
```
The `pkg-config` executable must be available in `PATH`. The named `.pc` files must
be available through pkg-config's standard search paths or via `PKG_CONFIG_PATH`.
These dependencies are not downloaded or built by DCR; they are recorded in
`dcr.lock` with a `pkg-config+...` source.
## Registry ## Registry
DCR uses a package registry for dependency lookup by name. DCR uses a package registry for dependency lookup by name.
@@ -68,7 +42,7 @@ DCR uses a package registry for dependency lookup by name.
```toml ```toml
# ~/.dcr/config.toml # ~/.dcr/config.toml
[registry.default] [registry.default]
url = "https://index.dcr.dexoron.tech" url = "https://index.dcr.pm"
priority = 1 priority = 1
``` ```
@@ -76,23 +50,7 @@ Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrid
## Git dependencies ## Git dependencies
Git dependencies are cloned into `~/.dcr/git/`; their exact checked-out commit is written to `dcr.lock`. Git dependencies are parsed and recorded in `dcr.lock`. DCR supports specifying branch/tag/rev for git sources:
Both Git and path dependencies have two modes:
* **DCR package:** the source has `dcr.toml`. DCR builds it before the consumer and uses the package name from its manifest for linking.
* **Prebuilt library:** it provides existing headers and binaries through `include`, `lib`, and `libs`. DCR passes them to the compiler/linker without building the dependency.
The mode is normally detected automatically. Use `mode = "build"` or `mode = "prebuild"` when a source contains both a manifest and prebuilt artifacts and you need to choose explicitly.
`dcr-math-lib` publishes both forms. Select its prebuilt library explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
DCR supports specifying branch/tag/rev for git sources:
* `branch` — switch to a branch * `branch` — switch to a branch
* `tag` — switch to a tag * `tag` — switch to a tag
@@ -101,7 +59,7 @@ DCR supports specifying branch/tag/rev for git sources:
## Path dependencies ## Path dependencies
Local paths may point at a DCR package or a prebuilt external library. A path DCR package is built before its consumer, including its own path/git dependencies. DCR detects dependency cycles. A prebuilt library is never built by DCR; it is linked from the directories declared in its dependency entry. Local paths. DCR automatically discovers include and lib directories from the neighbor's `dcr.toml`.
```toml ```toml
[dependencies] [dependencies]
@@ -109,51 +67,16 @@ mylib = { path = "/abs/path/to/lib" }
mylib = { path = "../relative/path" } mylib = { path = "../relative/path" }
``` ```
For DCR packages, the package name from `dcr.toml` is used for linking (so the dependency key may differ from the library name). Header resolution includes the packaged `target/include` directory and link search includes `target/lib`.
### Recommended library layouts
Buildable DCR library:
```text
dcr-math-lib/
├── dcr.toml
└── src/
├── dcr_math.c
└── dcr_math.h
```
Prebuilt library:
```text
dcr-math-lib/
├── include/
│ └── dcr_math.h
└── lib/
└── libdcr-math.a # or .so / .lib
```
`libs` contains linker names without the `lib` prefix and file extension: use
`["dcr-math"]` for `libdcr-math.a`.
If one repository contains both forms, keep the prebuilt files in `include/` and `lib/` and select the mode explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
For a local copy, replace `git` with `path = "../dcr-math-lib"`. In `prebuild` mode DCR does not run the dependency build, even when `dcr.toml` is present.
## dcr.lock ## dcr.lock
Dependency lock file. Contains package names and sources. Dependency lock file. Contains package names and sources.
Created during `dcr build` for resolved registry, path, and Git dependencies. Not updated during `dcr add` — only on the next `dcr build`. Created during `dcr build` when registry dependencies are present. Not updated during `dcr add` — only on the next `dcr build`.
## Resolution process ## Resolution process
1. Resolve dependency sources (registry → git → path) 1. Load all dependencies (registry → git → path)
2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref 2. For path deps: recursively read their `dcr.toml`
3. Build DCR package dependencies recursively 3. For registry deps: search `index.json`
4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler 4. For git deps: clone to cache
5. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler

View File

@@ -58,27 +58,3 @@ export DCR_INDEX_PATH=/custom/path/index.json
``` ```
Default: `~/.dcr/index.json`. Default: `~/.dcr/index.json`.
## DCRUP_MIRROR
Download mirror for `dcrup` (prebuilt binaries only).
```bash
export DCRUP_MIRROR=auto # cf → gh → sf → ya (default)
export DCRUP_MIRROR=cf # CloudFlare CDN
export DCRUP_MIRROR=gh # GitHub Releases
export DCRUP_MIRROR=sf # SourceForge
export DCRUP_MIRROR=ya # Yandex CDN (RU fallback)
```
CLI override: `dcrup install stable --mirror cf`.
## DCRUP_HOME / DCRUP_BIN / DCRUP_REPO
Installer layout and source clone URL:
```bash
export DCRUP_HOME=~/.dcr
export DCRUP_BIN=~/.dcr/bin
export DCRUP_REPO=https://github.com/dexoron/dcr
```

View File

@@ -11,18 +11,17 @@ DCR normalizes target triples. Short platform names are expanded to full triples
### Linux ### Linux
``` ```
target/<arch>-unknown-linux-<env>/<profile>/ target/<arch>-unknown-linux-gnu/<profile>/
``` ```
Architectures: `x86_64`, `aarch64`, `i686`, `armv7`, `riscv64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
Environments: `gnu` (default), `musl`.
Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib). Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib).
### macOS ### macOS
``` ```
target/<profile>/ (default) or target/<triple>/<profile>/ (with target) target/<profile>/
``` ```
Architectures: `x86_64`, `aarch64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
@@ -32,11 +31,10 @@ Extensions: `.dylib` (sharedlib), `.a` (staticlib).
### Windows ### Windows
``` ```
target/<profile>/ (default) or target/<triple>/<profile>/ (with target) target/<profile>/
``` ```
Architectures: `x86_64`, `aarch64`. Architectures: `x86_64`, `aarch64`.
Environments: `msvc` (default), `gnu` (MinGW).
Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI). Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI).

View File

@@ -43,10 +43,7 @@ dcr build # build all packages in dependency order
dcr build --workspace app # build only app (dependencies built automatically) dcr build --workspace app # build only app (dependencies built automatically)
``` ```
When building a workspace, DCR automatically injects include and library paths of dependent workspace members: When building a workspace, member outputs (libraries) are automatically added to include/lib paths of dependent packages.
* **Include Paths**: Automatically resolves and injects header directories of dependencies, including the member's `src/` directory, local `include/` directory, and the packaged `target/include` directory.
* **Library Paths**: Injects compiled library search paths (`target/lib` as well as target-specific build folders) to allow automatic linking with member libraries.
## Clean ## Clean

View File

@@ -1,18 +1,15 @@
--- ---
sidebar_label: Введение sidebar_label: Introduction
--- ---
# DCR — Инструмент сборки C/C++ & Пакетный менеджер # DCR — C/C++ Build Tool & Package Manager
<details> <details>
<summary>Быстрая справка</summary> <summary>Quick reference</summary>
```bash ```bash
# Installation (dcrup) # Installation
curl -fsSL https://sh.dcr-tool.ru | sh -s -- self-install curl -fsSL https://dcr.dexoron.su/install.sh | sh
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable # auto: cf → gh → sf → ya
# dcrup install stable --mirror cf # CloudFlare / GitHub / SourceForge / Yandex
# Create a project # Create a project
dcr new my-app dcr new my-app
@@ -34,34 +31,33 @@ dcr gen vscode
</details> </details>
## Содержание ## Contents
| Раздел | Описание | | Section | Description |
| --------------------------------------------------- | -------------------------------------------- | | ----------------------------------------------------- | --------------------------------------------- |
| [Начало работы](/docs/getting-started/installation) | Установка и первые шаги | | [Getting Started](/docs/getting-started/installation) | Installation and first steps |
| [Команды](/docs/commands/project-commands) | Все CLI-команды DCR | | [Commands](/docs/commands/project-commands) | All CLI commands |
| [Ссылка](/docs/reference/dcr-toml) | Конфигурация, сборка, зависимости, платформы | | [Reference](/docs/reference/dcr-toml) | Configuration, build, dependencies, platforms |
| [Тестирование](/docs/testing/test-framework) | Встроенный фреймворк тестирования | | [Testing](/docs/testing/test-framework) | Built-in test framework |
| [Рецепты](/docs/recipes/cross-to-windows) | Типовые сценарии | | [Recipes](/docs/recipes/cross-to-windows) | Common scenarios |
| [Интеграция с IDE](/docs/ide-integration) | VS Code, CLion, compile_commands.json | | [IDE Integration](/docs/ide-integration) | VS Code, CLion, compile_commands.json |
| [Автоматическое обновление](/docs/self-update) | Автообновление | | [Self Update](/docs/self-update) | Auto-update |
| [Часто задаваемые вопросы](/docs/faq) | Частые вопросы | | [FAQ](/docs/faq) | Frequently asked questions |
| [Журнал изменений](/docs/changelog) | История версий | | [Changelog](/docs/changelog) | Version history |
| [Лицензия](/docs/license) | Лицензии DCR и вендорных библиотек | | [License](/docs/license) | DCR and vendored library licenses |
| [Внести свой вклад](/docs/contributing) | Разработка DCR | | [Contributing](/docs/contributing) | DCR development |
## Особенности ## Features
* **Инкрементальная сборка** — mtime + `.d` headers + SHA256 fingerprint * **Incremental builds** — mtime + `.d` headers + SHA256 fingerprint
* **Параллельная компиляция** — thread::scope, атомарная очередь задач * **Parallel compilation** — thread::scope, atomic task queue
* **7 backends** — gcc/clang (unix_cc), MSVC/clang-cl (msvc), GAS, NASM, MASM, FASM, LLVM IR * **4 backends** — gcc/clang, MSVC/clang-cl, GAS (ARM), NASM (x86)
* **8 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom, flat-bin * **7 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom
* **Disk images** — optional `[archive]` packs FAT12/16/32 images after build * **Cross-compilation** — short names and full triples
* **Cross-compilation** — short names (linux, windows, macos) и полные triples * **Profiles** — debug / release with field overrides
* **Профили** — debug / release с переопределением любого поля * **Workspaces** — multi-package projects with topological sort
* **Workspaces** — мультипакетные проекты с топологической сортировкой * **Registry + Git + Path** — three dependency mechanisms
* **Registry + Git + Path** — три механизма зависимостей * **IDE generation** — VS Code, CLion, compile_commands.json, JSON metadata
* **Генерация IDE** — VS Code, CLion, compile_commands.json, JSON metadata * **pkg-config** — automatic system library discovery
* **pkg-config** — автоматический поиск системных библиотек * **Per-command `--help`** — `dcr build --help`, `dcr new --help`, etc.
* **Команда `--help` для каждой команды** — `dcr build --help`, `dcr new --help` и т. д. * **Man pages** — `man dcr`, `man dcr-build`, `man dcr-new`
* **Справочные страницы** — `man dcr`, `man dcr-build`, `man dcr-new`

View File

@@ -1,294 +1,91 @@
--- ---
sidebar_label: Список изменений sidebar_label: Changelog
--- ---
# Список изменений # Changelog
## 0.9.5 (2026-10-21) ## 0.7.1 (2026-06-02)
* **Structured CLI output** — shared helpers now provide Cargo-like human, plain, and JSON output modes.
* **Color and diagnostics policy** — `--color`, `NO_COLOR`, `--quiet`, and `--verbose` are applied consistently across commands.
* **Build reporting** — lifecycle events and compiler diagnostics are available as structured JSON events.
* **Output lab** — sandbox scenarios cover help, lifecycle commands, compiler warnings/errors, stream capture, and broken pipes.
## 0.9.1 (2026-09-13)
* **`pkg-config` dependencies** — declare `fmt = { pkg-config = "fmt" }` or multiple package names in `[dependencies]`; DCR applies `.pc` compiler/linker flags and records the resolved package in `dcr.lock`.
* **`dcr add` support for `pkg-config`** — easily add system package dependencies with `dcr add fmt pkg-config:fmt` or `dcr add openssl pkg:openssl,libcrypto`.
* **`dcr tree` & IDE integration** — `pkg-config` packages are marked in `dcr tree` and resolved into compiler flags in `dcr gen` (`compile_commands.json`).
* **Fixed `dcr new` in non-ASCII / spaced paths** — initializing projects from folders with non-ASCII characters or spaces no longer fails validation.
## 0.9.0 (2026-08-31)
* **Download mirrors in `dcrup`** — `--mirror auto|cf|gh|sf|ya` and `DCRUP_MIRROR`.
Default `auto` tries **cf → gh → sf → ya** (CloudFlare CDN, GitHub, SourceForge, Yandex CDN).
* **Complete Path/Git dependencies** — DCR packages from `path` and `git` are built before their consumer. Git sources are cached in `~/.dcr/git`, support `branch`/`tag`/`rev`, and record the exact commit in `dcr.lock`.
* **Build and prebuild modes** — `path` and `git` dependencies can build a DCR package from `dcr.toml` or link existing `include`/`lib`/`libs` artifacts; `mode = "build"` / `"prebuild"` selects explicitly when both forms are present.
* **Prebuilt dependency examples** — documentation now shows the `dcr-math-lib` Git repository and recommended build/prebuilt layouts for both `git` and `path`.
* **Transitive dependency builds and cycle reporting** — DCR recursively builds DCR packages and reports a clear dependency chain for cycles.
* **Bare path arguments for `dcr add`** — `dcr add mylib ../mylib` now works in addition to the explicit `path:` form.
* **Removed `install.sh` / `install.ps1` / `install_bsd.sh`** — superseded by `dcrup`.
## 0.8.5 (2026-08-08)
* **`package.dcr-version`** — optional CLI version pin in `dcr.toml`.
`dcr new` / `dcr init` write 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 with `CompilationDatabase: .dcr` (`# managed by dcr gen`); custom `.clangd` is not overwritten.
* **Helpers** `canonicalize_path`, `atomic_write`, `ensure_dcr_dir`; pure `resolve_artifact_path` via `platform::*`.
* **`dcr new` / `dcr init`** — add `.dcr/` to `.gitignore`.
**Changed (breaking):**
* **`compile_commands.json` moved** 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 clion` launch/run** — use the same artifact path resolver as `project-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)
### Добавлено:
* **`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 `ldflags` without CLI `--target`; run-arg forwarding; `split_double_dash` unit tests.
### Изменено:
* **Native builds resolve the host triple** — without `--target` / package `build.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` / man `dcr-run`** — document `--` forwarding.
### Исправлено:
* **Native artifact paths on Windows and macOS** — without an explicit `--target` / `build.target`, artifacts use `target/\<profile>`, so `dcr run` and flat-bin find the build output.
* Target-specific `ldflags` missing on native host builds (e.g. micro-lang + `libsct-elf`).
* Spurious empty-target warning.
## 0.8.2 (2026-07-22)
### Добавлено
* **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 via `fatfs` (`cargo build --features archive`). Release CI builds with the feature; without it `[archive]` fails with a clear message.
* **Tests** — `flat_bin_nasm_build`, package `build.target` without CLI `--target`, stricter workspace `clean --all`.
* **CI expansion** — unit + integration on Linux/macOS/Windows, archive feature job, rust-cache, clippy default + all-features (see `.github/workflows/ci.yml`).
### Изменено
* **No forced host triple from CLI** — without `--target`, package/member `build.target` is honored (bare-metal / ISO `post_steps` paths).
* **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 local `target/` (shared root `target/`).
* **`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 raw `os error 2`.
## 0.8.1 (2026-07-20)
### Added ### Added
* **`build.kind = "flat-bin"`** — raw binary (default `.bin`) for OS-dev payloads: * **`--help` for all commands** — `dcr build --help`, `dcr run --help`, `dcr new --help`,
* **NASM** — `-f bin` → `\<stem>.bin`
* **FASM** — direct output (`format binary` in source)
* **GAS / MASM / LLC** — object → `objcopy -O binary` → `\<stem>.bin`
* **C/C++** — objects → freestanding link → `objcopy -O binary` → `\<name>.bin`
* Requires `llvm-objcopy` / `objcopy` / `gobjcopy` except for NASM/FASM direct emit
* **`[archive]` section** — FAT12/16/32 disk images after build (`output`, `format`, `size`, `offset`, `label`, `bootsector`, `layout`). From 0.8.2 requires feature `archive`.
* **Single-file `build.roots`** — a root may be a single source or header file, not only a directory.
### Changed
* **`--force`** also re-runs `build.steps` and `build.post_steps`.
* **`dcr run` on workspace-only root** — if `[run].cmd` is 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 in `src/cli/build.rs` to a reusable, decoupled core build engine.
* **Polymorphic Language Model (`Language` trait)** — introduced the abstract `Language` trait (`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 (`Builder` trait)** — introduced the `Builder` trait to generalize builder invocations (`src/core/build/builder/mod.rs`). Consolidated GCC/Clang logic into `builder/cc_common.rs` and Microsoft Visual C++ logic into `builder/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 in `dcr.toml`.
* **Automatic Workspace Dependency Injection** — during workspace builds, include/lib paths of dependent workspace members (including their source headers, local `include/` folders, and build target `target/include` / `target/lib` folders) are automatically resolved and injected.
* **`BuildReporter` Event 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., in `dcr add`).
* **Path Dependencies Target Include Resolution** — local path dependencies configured via tables now correctly expose headers built and packaged into their `target/include` folder to consumer packages.
* **Modular Integration Test Suite** — refactored the monolith `tests/cli_basic.rs` file 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.rs` module.
* **Workspace-Aware member execution** — `dcr run` executed at the workspace root of a `workspace_only` project now triggers the member build inside the workspace context using the `--workspace` parameter, preventing standalone build issues.
* **Elimination of Global State** — removed global variables and states from the build core, encapsulating build logic inside isolated `BuildContext` structs 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 = true` is set in `dcr.toml`.
* **`dcr lint` command** — C/C++ static analysis via `clang-tidy`. Supports `--fix` for automatic fixes. Respects `build.roots` and `build.src_disable` from config.
* **Three new assembler backends**:
* **MASM** (`compiler = "ml"` / `"ml64"`) — Microsoft Macro Assembler.
* **FASM** (`compiler = "fasm"`) — Flat Assembler.
* **LLVM IR** (`compiler = "llc"`) — compiles `.ll` files via `llc -filetype=obj`.
* **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()` and `home_dir()` extracted to `utils/fs.rs`.
* **Build utilities** — `normalize_target()`, `normalize_kind()`, `normalize_platform()`, `default_profile_flags()` extracted to `utils/build.rs`.
* **Backend helpers** — `asm_lang_flag()`, `source_extensions()`, `elapsed_secs()` added to `core/builder/common.rs`.
* **Full Bare-Metal / Freestanding Automation** — introduced the `build.freestanding = true` configuration option. When enabled (or when a bare-metal target is detected), DCR automatically injects `-ffreestanding` during compilation and both `-nostdlib` and `-static` during linking.
* **Artifact Optimization (LTO & Strip)** — added `build.lto` (auto-injects `-flto` for compiler and linker) and `build.strip` (automatically strips debug symbols via linker `-s` flag) options to `dcr.toml`.
* **Compilation Thread Control** — added the `build.codegen-units` option to strictly limit the maximum number of parallel jobs utilized by the custom `parallel_build` worker 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 if `build.cflags` are overridden.
* **Centralized Bare-Metal Detection** — relocated the `is_bare_metal_target` helper to common build utilities (`src/utils/build.rs`) for unified access across the building core.
* **Architectural Refactoring**:
* Renamed `src/config.rs` to `src/templates.rs`.
* Started consolidation of configuration and build orchestration logic.
## 0.7.3 (2026-06-13)
### Added
* **`--vcs` option for `new` and `init` commands** — 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 `-dirty` suffix if there are uncommitted changes in the DCR repository.
* **Automatic `.gitignore` generation** — Git repository initialization now automatically writes a `.gitignore` file excluding the `/target` directory.
* **Nested repository prevention** — automatic Git initialization is now skipped if `dcr new` or `dcr init` is executed inside an already existing Git repository.
* **VCS verification tests** — added `new_vcs_options_work` and `init_vcs_options_work` integration tests to ensure reliable repository behavior.
### Changed
* **Complete removal of `git2` dependency** — all Git actions (dependency fetching, VCS setup, status checks) are now delegated to the system `git` executable via `Command`. This simplifies compilation and drops the need for `vendored` and `openssl` features.
* **Migrated from `reqwest` to `ureq`** — replaced the heavy `reqwest` crate in `flag_update.rs` with the lightweight synchronous `ureq 2.10` client, reducing overhead and the final binary size.
## 0.7.2 (2026-06-07)
### Added
* `default_target_triple()` now respects `target_env` — Linux (gnu/musl) and Windows (msvc/gnu) use the correct environment instead of hardcoded values.
### Исправлено
* **macOS Apple Silicon builds failed with `_main` undefined** — `--target=` is now passed to ldflags, not just cflags. `default_target_triple()` uses `std::env::consts::ARCH` on macOS instead of hardcoded `x86_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 (02.06.2026)
### Added
* **`--help` для всех команд** — `dcr build --help`, `dcr run --help`, `dcr new --help`,
`dcr init --help`, `dcr clean --help`, `dcr add --help`, `dcr fmt --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 setup --help`, `dcr tree --help`, `dcr gen --help`, `dcr --update --help`,
`dcr test --help`. Во всех результатах вывода используются стилизованные заголовки (зелёного цвета) и строки с информацией об использовании (голубого цвета). `dcr test --help`. All output uses styled headers (green) and usage lines (cyan).
* **Справочные страницы** — 12 страниц в формате troff в каталоге `man/man1/`: `dcr.1`, `dcr-build.1`, * **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-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`. `dcr-gen.1`, `dcr-fmt.1`, `dcr-tree.1`, `dcr-setup.1`.
* **Справочные страницы во всех пакетах** — install.sh, install_bsd.sh, PKGBUILD из AUR, * **Man pages in all packaging** — install.sh, install_bsd.sh, AUR PKGBUILD,
Debian (cargo-deb), RPM (cargo-generate-rpm), Nix (postInstall), Homebrew Debian (cargo-deb), RPM (cargo-generate-rpm), Nix (postInstall), Homebrew
(ресурс), Snap, ресурсы релизов GitHub. (resource), Snap, GitHub Release assets.
* **Проверка имени проекта** — команды `dcr init` и `dcr new` теперь проверяют имена перед созданием файлов * **Project name validation** — `dcr init` and `dcr new` now validate names before
. Допускаются только буквы ASCII, цифры, символы `_` и `-`. creating files. Only ASCII letters, digits, `_` and `-` are allowed.
* **Поля `documentation` и `homepage`** — добавлены в файл `Cargo.toml`. * **`documentation` and `homepage` fields** — added to `Cargo.toml`.
* **Оптимизации профиля релиза** — `opt-level = "z"`, LTO, `codegen-units = 1`, * **Release profile optimizations** — `opt-level = "z"`, LTO, `codegen-units = 1`,
`panic = "abort"`, `strip = true` для уменьшения размера бинарных файлов. `panic = "abort"`, `strip = true` for smaller binaries.
* **Платформы Linux i686, armv7, riscv64** — добавлены в рабочий процесс выпуска и скрипты установки. * **Linux i686, armv7, riscv64 targets** — added to release workflow and install scripts.
* **Платформы Linux musl i686 и armv7** — скомпилированы с помощью zigbuild в системе непрерывной интеграции (CI). * **Linux musl i686, armv7 targets** — cross-compiled via zigbuild in CI.
* **Пакеты AUR** — рабочий процесс публикации `dcr-dev`, `dcr-dev-bin`. * **AUR packages** — `dcr-dev`, `dcr-dev-bin` publishing workflow.
* **Публикация Snap** — автоматическая публикация Snapcraft в рамках непрерывной интеграции (CI). * **Snap publishing** — automated Snapcraft publishing in CI.
* **Значок Snap** — в файле README. * **Snap badge** — in README.
### Changed ### Changed
* **`validate_package_name` стал общедоступным** — его можно вызывать из команд CLI. * **`validate_package_name` made public** — callable from CLI commands.
* **Таблица платформы README** — реорганизована: варианты libc вынесены в отдельные строки по ОС, * **README platform table** — reorganized: libc variants as separate OS rows,
удалены лишние столбцы. Обновлен список архитектур Linux. removed extra columns. Linux architecture list updated.
* **Вывод `gen.rs` без аргументов** — теперь используется стилизованный вывод вместо необработанного `eprintln!`. * **`gen.rs` no-args output** — now uses styled output instead of raw `eprintln!`.
* **`tree.rs`, `fmt.rs` и `setup.rs`** — теперь поддерживают аргументы для опции `--help`. * **`tree.rs`, `fmt.rs`, and `setup.rs`** — now accept arguments for `--help`.
* **Команды установки из файла README** — `| bash` → `| sh` для обеспечения совместимости с POSIX. * **README install commands** — `| bash` → `| sh` for POSIX compatibility.
### Fixed ### Fixed
* **`dcr new \<invalid-name>` создает каталог, а затем завершается с ошибкой** — теперь проверка * **`dcr new \<invalid-name>` creates directory then fails** — validation now
выполняется до начала любых операций с файлами. happens before any file operations.
* **`dcr init` при указании недопустимого имени каталога** — то же исправление. * **`dcr init` on invalid directory name** — same fix.
* **Отсутствующие справочные страницы в установленных пакетах** — теперь поставляются во всех форматах. * **Man pages missing in installed packages** — now shipped in all formats.
* **Ложное срабатывание по букве диска Windows** — в модуле анализа файлов зависимостей. * **Windows drive letter false positive** — in dependency file parser.
* **CRLF (`\r\n`) вызывает сбой в работе парсера зависимостей** — теперь поддерживается обработка смешанных символов окончания строк. * **CRLF (`\r\n`) breaks dependency parser** — now handles mixed line endings.
* **Новая строка после обратного слеша не обработана** — при обработке экранирующих символов в функции `parse_d_file`. * **Newline after backslash not consumed** — in `parse_d_file` escape handling.
## 0.7.0 (01.06.2026) ## 0.7.0 (2026-06-01)
### Added ### Added
* **Поддержка целевых платформ OpenBSD и NetBSD** — полная маршрутизация по платформам с динамически генерируемыми тройками целевых параметров с использованием `std::env::consts::ARCH` и `std::env::consts::OS`. Затрагивает команды `build`, `run`, `clean` и модуль платформы. * **OpenBSD and NetBSD target support** — full platform routing with dynamic target triples using `std::env::consts::ARCH` and `std::env::consts::OS`. Affects `build`, `run`, `clean` commands and the platform module.
* **`src/platform/bsd.rs`** — новый специальный модуль платформы BSD, общий для FreeBSD, OpenBSD и NetBSD, предоставляющий `bin_path`, `lib_path`, `elf_path`, `efi_path` и `shared_lib_path`. * **`src/platform/bsd.rs`** — new BSD platform module (shared by FreeBSD, OpenBSD, NetBSD) providing `bin_path`, `lib_path`, `elf_path`, `efi_path`, `shared_lib_path`.
* **`Параметр конфигурации build.out_dir`** — настраиваемый каталог вывода, который переопределяет путь по умолчанию `target/\<triple>/\<profile>` для конечных артефактов. Поддерживается в `build`, `run` и при проверке конфигурации. * **`build.out_dir` config option** — custom output directory that overrides the default `target/\<triple>/\<profile>` path for final artifacts. Supported in `build`, `run`, and config validation.
* **Команда `dcr fmt`** — новая команда CLI, которая форматирует все исходные файлы C/C++ (`*.c`, `*.cpp`, `*.h`, `*.hpp`) в `src/` и `tests/` с помощью `clang-format`. * **`dcr fmt` command** — new CLI command that formats all C/C++ source files (`*.c`, `*.cpp`, `*.h`, `*.hpp`) in `src/` and `tests/` using `clang-format`.
* **Инкрементальная компоновка** — функция `needs_link()` в `common.rs`, которая проверяет, не является ли какой-либо объектный файл более новым, чем скомпонованный результат, пропуская ненужную повторную компоновку. Реализовано для всех бэкэндов (`unix_cc`, `msvc`, `gas`, `nasm`). * **Incremental linking** — `needs_link()` in `common.rs` checks 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»` и `«custom»`** — два новых типа проектов для специальных сценариев сборки, при которых не создается стандартный артефакт. * **`build.kind = "none"` and `"custom"`** — two new project kinds for special build scenarios that don't produce standard artifacts.
* **`install_bsd.sh`** — специальный скрипт установки, совместимый с POSIX, для систем BSD (FreeBSD, OpenBSD, NetBSD) с режимами загрузки бинарных файлов и сборки из исходного кода. * **`install_bsd.sh`** — POSIX-compliant installation script for BSD systems (FreeBSD, OpenBSD, NetBSD) with binary download and source build modes.
* **Поддержка Linux ARM64 в `install.sh`** — добавлено определение целевой тройки `Linux:aarch64|Linux:arm64` для загрузки готовых бинарных файлов. * **Linux ARM64 support in `install.sh`** — added `Linux:aarch64|Linux:arm64` target detection for pre-built binary downloads.
* **Обнаружение ОС BSD в `install.sh`** — обнаружение FreeBSD, OpenBSD, NetBSD и определение целевой тройки. * **BSD OS detection in `install.sh`** — detects FreeBSD, OpenBSD, NetBSD and determines target triple.
* **`rust-toolchain.toml`** — явное привязывание инструментария к каналу `stable`. * **`rust-toolchain.toml`** — explicit toolchain pinning to `stable` channel.
* **Интеграционные тесты** — `build_with_target_config` (проверяет `build.target = «linux»`) и `build_with_out_dir` (проверяет настраиваемый каталог вывода). * **Integration tests** — `build_with_target_config` (verifies `build.target = "linux"`) and `build_with_out_dir` (validates custom output directory).
* **`get_build_string_with_profile` стал `pub`** — чтобы `run.rs` мог определять конфигурацию настраиваемого каталога вывода. * **`get_build_string_with_profile` made `pub`** — so `run.rs` can determine custom output directory configuration.
### Changed ### Changed
* **Изменена семантика `build.target`** — теперь строго содержит тройку целей (например, `x86_64-unknown-linux-gnu`) или короткое имя (`linux`, `macos`, `windows`). Больше не используется в качестве пользовательского каталога вывода — эта функциональность перенесена в `build.out_dir`. * **`build.target` semantics 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 to `build.out_dir`.
* **`build.standard` стал опциональным** — изменен с `String` на `Option\<String>`. Проверка обеспечивает только непустоту для языков, отличных от ASM. Пропускается в выводе `dcr.toml`, если пуст. * **`build.standard` made optional** — changed from `String` to `Option\<String>`. Validation only enforces non-empty for non-ASM languages. Skipped in `dcr.toml` output if empty.
* **`dcr run` с `out_dir`** — теперь определяет целевой каталог с учетом `build.out_dir`, если он настроен, через `get_build_string_with_profile()` из `build.rs`. * **`dcr run` with `out_dir`** — now determines target directory respecting `build.out_dir` via `get_build_string_with_profile()` from `build.rs`.
* **`collect_sources()` возвращает пустой вектор** вместо ошибки, если не найдено ни одного исходного файла, что позволяет проектам с `kind = «none»` или `kind = «custom»` не иметь исходных файлов. * **`collect_sources()` returns empty vector** instead of error when no sources are found, allowing `kind = "none"` or `kind = "custom"` projects with no source files.
* **Рефакторинг рабочего процесса выпуска CI/CD** — `git2` стал целевым (без vendored-openssl на Windows), кросс-компиляция на основе Zig для целей Linux, отличных от x86_64, очистка версий пакетов Arch Linux (тире → точки), символьная ссылка `gmake` для NetBSD. * **CI/CD release workflow refactored** — `git2` made target-specific (no vendored-openssl on Windows), Zig-based cross-compilation for non-x86_64 Linux targets, Arch Linux package version cleanup (dashes → dots), `gmake` symlink for NetBSD.
* **Таблица совместимости README** — статус сборки/работы на FreeBSD, OpenBSD, NetBSD повышен с «сообщество/по возможности» до «официально поддерживается». * **README compatibility table** — FreeBSD, OpenBSD, NetBSD build/run status upgraded from "community/best-effort" to "officially supported".
* **Обновлена документация** — `build-section.md` описывает новые поля `build.target` и `build.out_dir`. `target-directory.md` переписан для уточнения различия. * **Documentation updated** — `build-section.md` describes new `build.target` and `build.out_dir` fields. `target-directory.md` rewritten to clarify the distinction.
### Fixed ### Fixed
* **stdout/stderr `dcr run` не наследуются** — вывод дочернего процесса захватывался и выводился вручную, что приводило к сбоям интерактивных программ. Исправлено путем перехода на `Command::status()`. * **stdout/stderr not inherited in `dcr run`** — child process output was captured and manually printed, breaking interactive programs. Fixed by switching to `Command::status()`.
* **Условие гонки в CI релиза** — задания матрицы сборки могли загружать ресурсы в релиз, который еще не существовал. Исправлено добавлением специального задания `create-release`. * **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-release` job.
* **Релиз GHA — переопределение стабильного набора инструментов** — устранены проблемы с переопределением набора инструментов Rust в CI. * **Release GHA — stable toolchain override** — fixed Rust toolchain override issues in CI.
* **Очистка версий пакетов Arch Linux** — строки версий с дефисами (например, `0.7.0-dev`) являются недопустимыми для `pkgver` в Arch Linux. Исправлено путем замены дефисов точками. * **Arch Linux package version sanitization** — version strings with dashes (e.g., `0.7.0-dev`) are invalid for `pkgver`. Fixed by replacing dashes with dots.
* **Права доступа GPG после Docker** — операции Docker изменяли владельца каталога GPG. Исправлено путем запуска `chown` после команд Docker. * **GPG permissions after Docker** — Docker operations changed GPG directory ownership. Fixed by running `chown` after Docker commands.
* **Пути к артефактам пакетов RPM** — артефакты RPM размещались в `rpm/x86_64/` вместо `fedora/x86_64/`. Исправлено в рабочем процессе Dexoron Packages Index. * **RPM artifact paths** — RPM artifacts were placed in `rpm/x86_64/` instead of `fedora/x86_64/`. Fixed in Dexoron Packages Index workflow.
* **Надежность разбора JSON в `install.sh`** — добавлен `jq` в качестве основного парсера с резервным вариантом `python3` для поиска релизов в канале dev. * **JSON parsing reliability in `install.sh`** — added `jq` as primary parser with `python3` fallback for dev channel release lookup.
### Удалено: ### Removed
* **Вспомогательная функция `format_roots()`** — удалена из `common.rs`. Использовалась только старым путем обработки ошибок в `collect_sources()`. * **`format_roots()` helper function** — removed from `common.rs`. Was only used by the old error handling path in `collect_sources()`.
* **Отдельные шаги загрузки артефактов для каждой дистрибуции** — три отдельных шага `actions/download-artifact` заменены на унифицированный `gh release download --clobber`. * **Per-distribution artifact download steps** — three separate `actions/download-artifact` steps replaced with unified `gh release download --clobber`.

View File

@@ -1,47 +1,42 @@
--- ---
sidebar_label: Команды сборки (build, run, clean) sidebar_label: Build commands (build, run, clean)
--- ---
# Команды сборки # Build Commands
## `dcr build` ## `dcr build`
Собирает проект по `dcr.toml`. Builds the project according to `dcr.toml`.
```bash ```bash
dcr build # debug profile dcr build # debug profile
dcr build --release # release build dcr build --release # release build
dcr build --debug # explicit debug dcr build --debug # explicit debug
dcr build --target aarch64-unknown-linux-gnu dcr build --target aarch64-unknown-linux-gnu
dcr build --force # full rebuild (also re-runs build.steps / post_steps) dcr build --force # full rebuild
dcr build --clean # clean + build dcr build --clean # clean + build
dcr build --verbose # show compilation commands dcr build --verbose # show compilation commands
dcr build --workspace pkg-a # build specific workspace package dcr build --workspace pkg-a # build specific workspace package
``` ```
Артефакты: `target/\<triple>/\<profile>/\<binary-name>` (Linux с явным целевым объектом). Artifacts: `target/\<triple>/\<profile>/\<binary-name>` (Linux with explicit target).
With `[archive]` in `dcr.toml`, a FAT disk image is packed after a successful build.
## `dcr run` ## `dcr run`
Собирает (если исходники новее артефакта) и запускает бинарник. Builds (if sources are newer than artifacts) and runs the binary.
```bash ```bash
dcr run dcr run
dcr run --release dcr run --release
dcr run --force # force rebuild then run
``` ```
On a **workspace-only** root: if `[run].cmd` is set, that command is used after build; otherwise DCR delegates to a workspace member.
## `dcr clean` ## `dcr clean`
Удаляет директорию `target/`(или `target/\<target>/\<profile>`). Removes `target/` directory (or `target/\<target>/\<profile>`).
```bash ```bash
dcr clean dcr clean
dcr clean --release # очистить target/release/ dcr clean --release # target/release/ only
dcr clean --target windows # очистить target/x86_64-pc-windows-msvc/ dcr clean --target windows # target/x86_64-pc-windows-msvc/
dcr clean --all # очистить все пакеты workspace dcr clean --all # clean all workspace packages
``` ```

View File

@@ -1,12 +1,12 @@
--- ---
sidebar_label: Команды зависимостей (add, tree) sidebar_label: Dependency commands (add, tree)
--- ---
# Команды зависимостей # Dependency Commands
## `dcr add \<name> [source]` ## `dcr add \<name> [source]`
Добавляет зависимость в `dcr.toml`. Adds a dependency to `dcr.toml`.
```bash ```bash
dcr add fmt # registry lookup dcr add fmt # registry lookup
@@ -15,41 +15,33 @@ dcr add mylib path:./lib # explicit path prefix
dcr add mylib git:https://github.com/user/repo # explicit git prefix dcr add mylib git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub shorthand dcr add mylib github:user/repo # GitHub shorthand
dcr add mylib gitlab:user/repo # GitLab shorthand dcr add mylib gitlab:user/repo # GitLab shorthand
dcr add fmt pkg-config:fmt # system package via pkg-config
dcr add openssl pkg:openssl,libcrypto # multiple pkg-config packages
``` ```
Префиксы источника: Source prefixes:
* `path:` — локальный путь * `path:` — local path
* `git:` — URL адрес git-репозитория * `git:` — generic git URL
* `github:` — расширение `https://github.com/\<user>/\<repo>` * `github:` — expands to `https://github.com/\<user>/\<repo>`
* `gitlab:` — расширение `https://gitlab.com/\<user>/\<repo>` * `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>`
* `pkg-config:` / `pkg:` — one or more packages resolved by `pkg-config` * `http://` / `https://` / `git@` — full URL
* `http://` / `https://` / `git@` — полный URL
Флаги: Flags:
* `--branch \<name>` — git ветка * `--branch \<name>` — git branch
* `--tag \<name>` — git tag * `--tag \<name>` — git tag
* `--rev \<hash>` — git commit * `--rev \<hash>` — git commit
Если источник не указан — DCR выполняет поиск в подключенных реестрах. A bare relative or absolute path is accepted as a path dependency. If source is omitted — DCR searches connected registries.
For `pkg-config` dependencies, the referenced packages must already be installed
and provide `.pc` files. DCR invokes `pkg-config` during the build (using
`PATH` and `PKG_CONFIG_PATH`) and forwards the returned compiler and linker
flags; it does not download or build these packages.
## `dcr tree` ## `dcr tree`
Показывает дерево зависимостей проекта. Displays the project dependency tree.
```bash ```bash
dcr tree dcr tree
``` ```
Пример вывода: Example output:
``` ```
my-app v0.1.0 my-app v0.1.0
@@ -58,4 +50,4 @@ my-app v0.1.0
└── catch2 (registry) └── catch2 (registry)
``` ```
В случае path зависимостей, рекурсивно отображает их собственные зависимости (из файла `dcr.toml`). For path dependencies, recursively shows their own dependencies (from their `dcr.toml`).

View File

@@ -1,12 +1,12 @@
--- ---
sidebar_label: Gen команды (vscode, clion, ...) sidebar_label: Gen commands (vscode, clion, ...)
--- ---
# Gen команды # Gen Commands
## `dcr gen \<target>` ## `dcr gen \<target>`
Генерирует файл интеграции с IDE. Generates IDE integration files.
### vscode ### vscode
@@ -14,12 +14,12 @@ sidebar_label: Gen команды (vscode, clion, ...)
dcr gen vscode dcr gen vscode
``` ```
Создаёт: Creates:
* `.vscode/tasks.json` — `build` задача (dcr build) * `.vscode/tasks.json` — `build` task (dcr build)
* `.vscode/launch.json` — конфигурация запуска отладки * `.vscode/launch.json` — debug launch configuration
* `.vscode/settings.json` — настройки C/C++ (clangd пути, includes) * `.vscode/settings.json` — C/C++ settings (clangd paths, includes)
* `.vscode/extensions.json` — рекомендуемые расширения (vscode-clangd, vscode-lldb) * `.vscode/extensions.json` — recommended extensions (vscode-clangd, vscode-lldb)
### clion ### clion
@@ -27,12 +27,12 @@ dcr gen vscode
dcr gen clion dcr gen clion
``` ```
Создаёт: Creates:
* `.idea/externalTools.xml` — внешние инструменты (build, run, clean, test) * `.idea/externalTools.xml` — external tools (build, run, clean, test)
* `.idea/customTargets.xml` — пользовательские цели сборки * `.idea/customTargets.xml` — custom build targets
* `.idea/misc.xml` — настройки C/C++ проекта * `.idea/misc.xml` — C/C++ project settings
* `.idea/runConfigurations/\<name>.xml` — конфигурация запуска * `.idea/runConfigurations/\<name>.xml` — per-binary run configurations
### compile-commands ### compile-commands
@@ -40,7 +40,7 @@ dcr gen clion
dcr gen compile-commands dcr gen compile-commands
``` ```
Генерирует `compile_commands.json` — стандартный формат для clangd, cpptools, статических анализаторов. Generates `compile_commands.json` — standard format for clangd, cpptools, static analyzers.
### project-info ### project-info
@@ -48,7 +48,7 @@ dcr gen compile-commands
dcr gen project-info dcr gen project-info
``` ```
Выводит JSON с метаданными проекта: Outputs JSON array with project metadata:
```json ```json
[ [

View File

@@ -1,14 +1,14 @@
--- ---
sidebar_label: Команды проекта (new, init) sidebar_label: Project commands (new, init)
--- ---
# Команды проекта # Project Commands
## `dcr new \<name>` ## `dcr new \<name>`
Создает новый проект со стандартной структурой и `dcr.toml`. Аргумент `name` является обязательным. Creates a new project with a standard structure and `dcr.toml`. The `name` argument is required.
В названии проекта допускаются только ASCII буквы, цифры и подчеркивания `_` и дефисы `-`. Only ASCII letters, digits, underscores `_` and hyphens `-` are allowed in the project name.
```bash ```bash
dcr new my-app dcr new my-app
@@ -19,14 +19,14 @@ Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`). * `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
Генерирует: Generates:
* `dcr.toml` с базовыми полями * `dcr.toml` with basic fields
* `src/main.c` с основным шаблоном * `src/main.c` with a `main` template
## `dcr init` ## `dcr init`
Инициализирует проект DCR в текущем (пустом) каталоге. Initializes a DCR project in the current (empty) directory.
```bash ```bash
dcr init dcr init
@@ -37,4 +37,4 @@ Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`). * `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
Название проекта взято из имени текущего каталога. Имя каталога должно соответствовать тем же правилам именования, что и в `dcr new`. The project name is taken from the current directory name. The directory name must follow the same naming rules as `dcr new`.

View File

@@ -1,60 +1,60 @@
--- ---
sidebar_label: Команды качества (test, fmt) sidebar_label: Quality commands (test, fmt)
--- ---
# Команды качества # Quality Commands
## `dcr test` ## `dcr test`
Запускает тесты. Runs tests.
```bash ```bash
dcr test # debug профиль dcr test # debug profile
dcr test --release # release профиль dcr test --release # release profile
dcr test --debug # явный debug dcr test --debug # explicit debug
dcr test --help # подробная справка dcr test --help # detailed help
``` ```
Перед первым запуском нужно инициализировать тесты: Before first use, initialize tests:
```bash ```bash
dcr test --init dcr test --init
``` ```
Это создаёт `tests/dcr_test.h` (фреймворк) и `tests/test.c` (шаблон). This creates `tests/dcr_test.h` (framework) and `tests/test.c` (template).
Что делает `dcr test`: What `dcr test` does:
1. Собирает проект 1. Builds the project
2. Собирает файлы `tests/*.c` (только `.c`, не `.cpp`) 2. Collects `tests/*.c` files (`.c` only, not `.cpp`)
3. Компилирует и линкует каждый файл теста 3. Compiles and links each test file
4. Запускает каждый бинарник тестов 4. Runs each test binary
5. Вывод сводки: TOTAL, PASS, SKIP, FAIL 5. Prints summary: TOTAL, PASS, SKIP, FAIL
6. Возвращает ненулевой код при наличии FAIL 6. Returns non-zero exit code on any FAIL
## `dcr fmt` ## `dcr fmt`
Форматирует исходный код C/C++ через `clang-format`. Formats C/C++ source files using `clang-format`.
```bash ```bash
dcr fmt dcr fmt
``` ```
Процессы: `src/**/*.{c,cpp,cxx,cc,h,hpp,hxx,hh}` и `tests/**/*.{c,cpp,cxx,cc,h,hpp,hxx,hh}`. Processes: `src/**/*.{c,cpp,cxx,cc,h,hpp,hxx,hh}` and `tests/**/*.{c,cpp,cxx,cc,h,hpp,hxx,hh}`.
Использует `.clang-format` в корне проекта (если таковой имеется), иначе стиль clang-format по умолчанию. Uses `.clang-format` at the project root (if present), otherwise default clang-format style.
## `dcr lint` ## `dcr lint`
Выполняет `clang-tidy` на C/C++ исходных файлах для статического анализа. Runs `clang-tidy` on C/C++ source files for static analysis.
```bash ```bash
dcr lint # отобразить диагностику dcr lint # show diagnostics
dcr lint --fix # автоматически применить исправления dcr lint --fix # apply fixes automatically
dcr lint --help # подробная справка dcr lint --help # detailed help
``` ```
Процессы: `src/**/*.{c,cpp,cxx,cc}` и `tests/**/*.{c,cpp,cxx,cc}`. Processes: `src/**/*.{c,cpp,cxx,cc}` and `tests/**/*.{c,cpp,cxx,cc}`.
Без параметра `--fix` clang-tidy выдает предупреждения и ошибки, не внося изменений в файлы. Without `--fix`, clang-tidy reports warnings and errors without modifying files.
При параметре `--fix` clang-tidy автоматически вносит предложения по исправлениям на месте. With `--fix`, clang-tidy applies automatic suggestions in place.

View File

@@ -1,18 +1,18 @@
--- ---
sidebar_label: Системные команды (setup, --help, ...) sidebar_label: System commands (setup, --help, ...)
--- ---
# Системные команды # System Commands
## `dcr setup` ## `dcr setup`
`~/.dcr/config.toml` — конфигурация реестров Shows configured registries from `~/.dcr/config.toml`.
```bash ```bash
dcr setup dcr setup
``` ```
Если файл `~/.dcr/config.toml` не найден, DCR возвращает ошибку. Создайте его вручную: If `~/.dcr/config.toml` is not found, DCR returns an error. Create it manually:
```toml ```toml
[registry.default] [registry.default]
@@ -22,7 +22,7 @@ priority = 1
## `dcr --help` ## `dcr --help`
Отображает справку по всем командам. Shows help for all commands.
```bash ```bash
dcr --help dcr --help
@@ -30,7 +30,7 @@ dcr --help
## `dcr --version` ## `dcr --version`
Отображает версию и целевую платформу. Shows version and target triple.
```bash ```bash
dcr --version # dcr 0.7.0 (x86_64-unknown-linux-gnu) dcr --version # dcr 0.7.0 (x86_64-unknown-linux-gnu)
@@ -38,14 +38,14 @@ dcr --version # dcr 0.7.0 (x86_64-unknown-linux-gnu)
## `dcr --update` ## `dcr --update`
Автоматическое обновление. Загружает последнюю версию бинарного файла из раздела «Релизы» на GitHub и заменяет текущую версию. Self-update. Downloads the latest release binary from GitHub Releases and replaces the current one.
```bash ```bash
dcr --update dcr --update
``` ```
Возможности: Features:
* Определяет платформу и архитектуру автоматически * Auto-detects platform and architecture
* Выдает предупреждение при установке через AUR (вместо этого используйте пакетный менеджер) * Warns if installed via AUR (use package manager instead)
* Работает на Linux, macOS, Windows * Works on Linux, macOS, Windows

View File

@@ -1,53 +1,51 @@
--- ---
sidebar_label: Вклад sidebar_label: Contributing
--- ---
# Вклад # Contributing
## Настройка ## Setup
```bash ```bash
git clone https://github.com/dexoron/dcr git clone https://github.com/dexoron/dcr
# or a source mirror: GitVerse / SourceCraft / SourceForge / GitLab (see README)
cd dcr cd dcr
cargo build cargo build
``` ```
## Стиль написания кода ## Code style
Весь код форматируется через `cargo fmt`: All code must be formatted with `cargo fmt`:
```bash ```bash
формат груза cargo fmt
``` ```
## Линтер ## Linting
```bash ```bash
cargo clippy --all-targets -- -D warnings cargo clippy --all-targets -- -D warnings
``` ```
## Тесты ## Tests
```bash ```bash
тест cargo --all-targets cargo test --all-targets
``` ```
## Процесс связей с общественностью ## PR process
1. Форкните репозиторий 1. Fork the repository
2. Создайте ветку: `git checkout -b feature/description` 2. Create a branch: `git checkout -b feature/description`
3. Внесите изменения 3. Make changes
4. Запустите `cargo fmt && cargo clippy --all-targets -- -D warnings && cargo test --all-targets` 4. Run `cargo fmt && cargo clippy && cargo test`
5. Откройте Pull Request 5. Open a Pull Request
## CI ## CI
CI runs (see `.github/workflows/ci.yml`): CI runs:
* `cargo fmt --check` * `cargo fmt --check`
* `cargo clippy` (default + `--all-features`) * `cargo clippy --all-targets -- -D warnings`
* `cargo check --all-targets --all-features` * `cargo test --all-targets`
* Unit + integration tests on Linux, macOS, Windows * Build on Linux, macOS, Windows
* Extra Linux job with `--features archive` (FAT images) * Integration tests
* Tools on runners: clang, nasm, clang-format/tidy (Linux)

View File

@@ -1,16 +1,16 @@
--- ---
sidebar_label: Часто задаваемые вопросы sidebar_label: FAQ
--- ---
# Часто задаваемые вопросы # FAQ
## Реестр не найден ## Registry not found
``` ```
Ошибка: реестр не найден error: registry not found
``` ```
**Решение:** Убедитесь, что файл `~/.dcr/config.toml` существует: **Solution:** Make sure `~/.dcr/config.toml` exists:
```toml ```toml
[registry.default] [registry.default]
@@ -18,58 +18,64 @@ url = "https://index.dcr.pm"
priority = 1 priority = 1
``` ```
Если реестр кастомный, проверьте `DCR_INDEX_PATH`: And check `DCR_INDEX_PATH`:
```bash ```bash
echo $DCR_INDEX_PATH echo $DCR_INDEX_PATH
``` ```
## Компилятор не найден ## Compiler not found
``` ```
Ошибка: компилятор не найден error: compiler not found
``` ```
**Решение:** Убедитесь, что компилятор установлен и доступен в PATH. **Solution:** Ensure a compiler is installed and available in PATH.
```bash ```bash
какой gcc which gcc
какой clang which clang
``` ```
Или укажите явно через `[toolchain]` или `DCR_COMPILER`. Or specify explicitly via `[toolchain]` in `dcr.toml`.
## Ctrl+C во время сборки ## openssl-sys build failed
DCR корректно обрабатывает SIGINT: прерывает текущую компиляцию и завершает процесс с ненулевым кодом. When building DCR from source:
## Как создать библиотеку? ```
error: failed to run custom build command for openssl-sys
```
[Library Recipe](/docs/recipes/library-project). **Solution:** Install OpenSSL development headers:
## Как выполнить кросс-компиляцию для Windows?
См. [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
## Как сделать мультипакетный проект?
См. [Workspace Recipe](/docs/recipes/multi-package-workspace).
## Bootloader / pure NASM OS image
Use `kind = "flat-bin"` (NASM `-f bin`) and optional `[archive]` for a FAT disk image.
See [OS-dev recipe](/docs/recipes/os-flat-bin-archive).
## How do I choose a download mirror?
`dcrup install` uses `--mirror auto` by default and tries **cf → gh → sf → ya**.
```bash ```bash
dcrup install stable --mirror cf # Ubuntu/Debian
export DCRUP_MIRROR=ya sudo apt install libssl-dev
# Fedora
sudo dnf install openssl-devel
# macOS
brew install openssl
``` ```
## Lock-файл устарел ## Ctrl+C during build
При изменении зависимостей `dcr.lock` автоматически обновляется при следующем `dcr add`. Если нужно принудительно обновить — удалите `dcr.lock` и выполните `dcr build`. DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
## How to create a library?
See [Library Recipe](/docs/recipes/library-project).
## How to cross-compile to Windows?
See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
## How to create a multi-package project?
See [Workspace Recipe](/docs/recipes/multi-package-workspace).
## Lock file
`dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`.

View File

@@ -1,17 +1,17 @@
--- ---
sidebar_label: Первые шаги sidebar_label: First steps
--- ---
# Первые шаги # First Steps
## Создать проект ## Create a project
```bash ```bash
dcr new my-app dcr new my-app
cd my-app cd my-app
``` ```
Будет создана структура: Structure:
``` ```
my-app/ my-app/
@@ -35,45 +35,38 @@ compiler = "clang"
kind = "bin" kind = "bin"
``` ```
## Сборка ## Build
```bash ```bash
dcr build dcr build
``` ```
Результат — `target/\<triple>/debug/my-app` (Linux) или `target/debug/my-app.exe` (Windows). Output — `target/\<triple>/debug/my-app` (Linux) or `target/debug/my-app.exe` (Windows).
Профиль сборки: Build profiles:
```bash ```bash
dcr build --release # release сборка dcr build --release # release build
dcr build --debug # debug (по умолчанию) dcr build --debug # debug (default)
``` ```
## Запустить ## Run
```bash ```bash
dcr run dcr run
``` ```
Собирает (если нужно) и запускает бинарник. Builds (if needed) and runs the binary.
## Первый тест ## First test
```bash ```bash
dcr test --init # создать шаблон теста dcr test --init # create test template
dcr test # запустить тесты dcr test # run tests
``` ```
## Форматирование ## Formatting
```bash ```bash
dcr fmt # clang-format по .clang-format dcr fmt # clang-format with .clang-format
```
## Linting
```bash
dcr lint # clang-tidy checks
dcr lint --fix # apply fixes automatically
``` ```

View File

@@ -1,82 +1,35 @@
--- ---
sidebar_label: Установка sidebar_label: Installation
--- ---
# Установка # Installation
## dcrup (recommended) ## Linux (Dexoron Packages)
Install and switch DCR versions (stable / dev / night, pin `0.8.2`, optional build from source). Configure your package manager at https://pkg.dexoron.su and install:
### Linux / macOS / BSD / Windows (bash) **Arch Linux**
```sh ```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- self-install sudo pacman -Sy dcr
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable
``` ```
Non-interactive install of DCR in one shot: **Debian/Ubuntu**
```sh ```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- install stable sudo apt update && sudo apt install dcr
export PATH="$HOME/.dcr/bin:$PATH"
``` ```
### Windows (PowerShell) **Fedora/RHEL**
```powershell
& ([scriptblock]::Create((irm https://ps1.dcr-tool.ru))) self-install
# $env:Path += ";$env:USERPROFILE\.dcr\bin"
dcrup install stable
```
After `self-install`, the command is **`dcrup`** (no `.sh` / `.ps1`) and is installed in `~/.dcr/bin` (Unix) or `%USERPROFILE%\.dcr\bin` (Windows).
### Common dcrup commands
```sh ```sh
dcrup install stable # latest stable prebuilt (auto: cf → gh → sf → ya) sudo dnf install dcr
dcrup install 0.8.2 # pin → 0.8.2@stable
dcrup install 0.8.2@dev
dcrup install stable --libc musl # Linux: musl asset (default: gnu)
dcrup install stable --mirror cf # CloudFlare CDN
dcrup install stable --mirror ya # Yandex CDN (RU fallback)
dcrup install stable --build # cargo build --features archive
dcrup install night # always build from branch dev HEAD
dcrup default 0.8.2
dcrup update
dcrup list
dcrup show
dcrup which
dcrup uninstall 0.8.2 # remove one installed version
dcrup uninstall --all # remove all installed versions
``` ```
Layout: `~/.dcr/toolchains/\<id>/dcr` and `~/.dcr/bin/dcr` → active version.
### Download mirrors
Prebuilt installs try **cf → gh → sf → ya** unless you pin a host.
| Code | URL | Notes |
| ---- | ------------------------------------------------------------------------------------------------------------ | -------------------------- |
| `cf` | `https://cdn-global.dcr-tool.ru/\<tag>/\<asset>` | CloudFlare CDN (worldwide) |
| `gh` | `https://github.com/dexoron/dcr/releases/download/\<tag>/\<asset>` | GitHub Releases |
| `sf` | `https://sourceforge.net/projects/dcr-tool/files/\<tag>/\<asset>/download` | SourceForge |
| `ya` | `https://cdn-ru.dcr-tool.ru/\<tag>/\<asset>` | Yandex CDN (RU fallback) |
```sh
dcrup install stable --mirror auto # default
export DCRUP_MIRROR=cf # persist for this shell
```
---
## Arch Linux (AUR) ## Arch Linux (AUR)
```sh ```sh
ура -S dcr yay -S dcr
``` ```
## macOS / Linux (Homebrew) ## macOS / Linux (Homebrew)
@@ -92,12 +45,11 @@ brew install dcr
sudo snap install dcrup sudo snap install dcrup
``` ```
> If classic Snap Store publishing is unavailable, install the `.snap` from [GitHub Releases](https://github.com/dexoron/dcr/releases/latest) with `--dangerous`.
## Nix (flake) ## Nix (flake)
```sh ```sh
nix run github:dexoron/dcr nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr nix profile install github:dexoron/dcr
``` ```
@@ -107,37 +59,48 @@ nix profile install github:dexoron/dcr
cargo install dcr cargo install dcr
``` ```
Note: crates.io builds may omit optional features. For FAT disk images (`[archive]`), prefer release binaries or: ## Linux / macOS (script)
```sh ```sh
cargo install dcr --features archive curl -fsSL https://dcr.dexoron.su/install.sh | sh
``` ```
## Из источника ## BSD (script)
```sh
curl -fsSL https://dcr.dexoron.su/install_bsd.sh | sh
```
## Windows (PowerShell)
```powershell
irm https://dcr.dexoron.su/install.ps1 | iex
```
## From source
```sh ```sh
git clone https://github.com/dexoron/dcr.git git clone https://github.com/dexoron/dcr.git
cd dcr cd dcr && cargo build --release
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
``` ```
## После установки ## Post-install
Verify the installation:
```bash ```bash
dcr --version dcr --version
dcrup show # if installed via dcrup
``` ```
Man pages (package installs / release assets): Man pages are available after installation:
```bash ```bash
man dcr man dcr
man dcr-build man dcr-build
``` ```
Registry (optional) — `~/.dcr/config.toml`: To use the registry, create `~/.dcr/config.toml`:
```toml ```toml
[registry.default] [registry.default]

View File

@@ -1,30 +1,23 @@
--- ---
sidebar_label: Интеграция с IDE sidebar_label: IDE Integration
--- ---
# Интеграция с IDE # IDE Integration
## VS Code ## VS Code
Install the recommended [DCR extension by Dexoron-Labs](https://marketplace.visualstudio.com/items?itemName=Dexoron-Labs.dcr). Do not install Microsoft C/C++ extensions for DCR projects: DCR uses `clangd`. MS C/C++ is acceptable only when you need its debugger.
Recommended companion extensions:
* [Even Better TOML](https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml)
* [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb), or MS C/C++ for debugger support only
```bash ```bash
dcr gen vscode dcr gen vscode
``` ```
Генерирует в `.vscode/`: Generates in `.vscode/`:
| Файл | Назначение | | File | Purpose |
| ----------------- | ------------------------------------------- | | ----------------- | -------------------------------------------- |
| `tasks.json` | Задача `build` (dcr build) | | `tasks.json` | `build` task (dcr build) |
| `launch.json` | Debug-запуск бинарника | | `launch.json` | Debug launch configuration |
| `settings.json` | clangd/IntelliSense: include пути, стандарт | | `settings.json` | clangd/IntelliSense: include paths, standard |
| `extensions.json` | Рекомендует clangd, C/C++ | | `extensions.json` | Recommends vscode-clangd, vscode-lldb |
## CLion ## CLion
@@ -32,27 +25,27 @@ dcr gen vscode
dcr gen clion dcr gen clion
``` ```
Генерирует в `.idea/`: Generates in `.idea/`:
| Файл | Назначение | | File | Purpose |
| ----------------------------------------- | ------------------------------------------------ | | ------------------------------------------------ | ----------------------------------------- |
| `externalTools.xml` | Build, Run, Clean, Test как внешние инструменты | | `externalTools.xml` | Build, Run, Clean, Test as external tools |
| `customTargets.xml` | Кастомные цели сборки | | `customTargets.xml` | Custom build targets |
| `misc.xml` | Настройки C/C++ проекта | | `misc.xml` | C/C++ project settings |
| `runConfigurations/dcr_build_and_run.xml` | Конфигурации запуска для каждого бинарного файла | | `runConfigurations/\<name>.xml` | Per-binary run configurations |
## compile_commands.json ## compile_commands.json
```bash ```bash
dcr gen команды компиляции dcr gen compile-commands
``` ```
Генерирует `compile_commands.json` в корне проекта. Стандартный формат для: Generates `compile_commands.json` at project root. Standard format for clangd, C/C++ IntelliSense, static analyzers.
## информация о проекте ## project-info
```bash ```bash
dcr gen info-проекта dcr gen project-info
``` ```
Выводит JSON с метаданными проекта (см. [gen-commands](/docs/commands/gen-commands)). Outputs JSON array with project metadata (see [gen-commands](/docs/commands/gen-commands)).

View File

@@ -1,33 +1,33 @@
--- ---
sidebar_label: Лицензия sidebar_label: License
--- ---
# Лицензия # License
## DCR ## DCR
DCR распространяется под лицензией [GPL-3.0-or-later](https://spdx.org/licenses/GPL-3.0-or-later.html). DCR itself is [GPL-3.0-or-later](https://spdx.org/licenses/GPL-3.0-or-later.html) licensed.
> **Важно:** DCR — инструмент сборки, а не библиотека. GPL распространяется только на исходный код самого DCR. Проекты, собранные с помощью DCR, не подпадают под лицензию DCR — их лицензирование определяется исключительно их собственным кодом и зависимостями. > **Note:** DCR is a build tool, not a library. The GPL applies only to DCR's own source code. Projects built with DCR are not subject to DCR's license — their licensing is determined solely by their own code and dependencies.
## Rust-зависимости ## Rust dependencies
DCR написан на Rust. Ниже перечислены основные статически связываемые крейты: DCR is written in Rust. The following notable Rust crates are statically linked:
| Крейт | Лицензия | | Crate | License |
| ------------------------------------------------------- | ------------------ | | ------------------------------------------------------- | ----------------- |
| [`ureq`](https://crates.io/crates/ureq) | MIT ИЛИ Apache-2.0 | | [`ureq`](https://crates.io/crates/ureq) | MIT OR Apache-2.0 |
| [`serde`](https://crates.io/crates/serde) | MIT ИЛИ Apache-2.0 | | [`serde`](https://crates.io/crates/serde) | MIT OR Apache-2.0 |
| [`toml`](https://crates.io/crates/toml) | MIT ИЛИ Apache-2.0 | | [`toml`](https://crates.io/crates/toml) | MIT OR Apache-2.0 |
| [`toml_edit`](https://crates.io/crates/toml_edit) | MIT OR Apache-2.0 | | [`toml_edit`](https://crates.io/crates/toml_edit) | MIT OR Apache-2.0 |
| [`serde_json`](https://crates.io/crates/serde_json) | MIT ИЛИ Apache-2.0 | | [`serde_json`](https://crates.io/crates/serde_json) | MIT OR Apache-2.0 |
| [`sha2`](https://crates.io/crates/sha2) | MIT ИЛИ Apache-2.0 | | [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 |
| [`glob`](https://crates.io/crates/glob) | MIT ИЛИ Apache-2.0 | | [`glob`](https://crates.io/crates/glob) | MIT OR Apache-2.0 |
| [`self-replace`](https://crates.io/crates/self-replace) | MIT ИЛИ Apache-2.0 | | [`self-replace`](https://crates.io/crates/self-replace) | MIT OR Apache-2.0 |
| [`ctrlc`](https://crates.io/crates/ctrlc) | MIT ИЛИ Apache-2.0 | | [`ctrlc`](https://crates.io/crates/ctrlc) | MIT OR Apache-2.0 |
Full dependency tree is available in [`Cargo.lock`](https://github.com/dexoron/dcr/blob/main/Cargo.lock). Подавляющее большинство имеют двойную лицензию MIT OR Apache-2.0. Full dependency tree is available in [`Cargo.lock`](https://github.com/dexoron/dcr/blob/main/Cargo.lock). The overwhelming majority are dual-licensed under MIT OR Apache-2.0.
## Дополнительные благодарности ## Additional credits
* Дизайн CLI и модель проектов DCR вдохновлены [Cargo](https://doc.rust-lang.org/cargo/). * DCR's CLI design and project model are inspired by [Cargo](https://doc.rust-lang.org/cargo/).

View File

@@ -1,12 +1,12 @@
--- ---
sidebar_label: Кросс-компиляция для Windows sidebar_label: Cross-compile to Windows
--- ---
# Кросс-компиляция для Windows на Linux # Cross-Compile to Windows from Linux
Сборка Windows-бинаря на Linux с использованием mingw-w64. Building a Windows binary on Linux using mingw-w64.
## Установка toolchain ## Install toolchain
```bash ```bash
# Ubuntu/Debian # Ubuntu/Debian
@@ -16,29 +16,31 @@ sudo apt install mingw-w64
sudo dnf install mingw64-gcc mingw64-binutils sudo dnf install mingw64-gcc mingw64-binutils
``` ```
## Конфигурация ## Configuration
```toml ```toml
[package] [package]
name = "my-app" name = "my-app"
version = "0.1.0" version = "0.1.0"
type = "app" type = "none"
[build] [build]
language = "c" language = "c"
standard = "c17" standard = "c11"
target = "windows" compiler = "clang"
kind = "bin"
target = "x86_64-pc-windows-gnu" # explicit mingw, not msvc
``` ```
## Сборка ## Build
```bash ```bash
dcr build --target windows --release dcr build --target x86_64-pc-windows-gnu --release
``` ```
Артефакт: `target/x86_64-pc-windows-gnu/release/my-app.exe`. Artifact: `target/x86_64-pc-windows-gnu/release/my-app.exe`.
## Кастомный toolchain (опционально) ## Custom toolchain
```toml ```toml
[toolchain] [toolchain]

View File

@@ -1,15 +1,16 @@
--- ---
sidebar_label: Проект библиотеки sidebar_label: Library project
--- ---
# Проект библиотеки # Library Project
Создание статической библиотеки и её использование в другом проекте. Creating a static library and using it in another project.
## Шаг 1: Создать библиотеку ## Step 1: Create the library
```bash ```bash
dcr new my-lib dcr new my-lib
cd my-lib
``` ```
`dcr.toml`: `dcr.toml`:
@@ -18,11 +19,11 @@ dcr new my-lib
[package] [package]
name = "my-lib" name = "my-lib"
version = "0.1.0" version = "0.1.0"
type = "lib" type = "none"
[build] [build]
language = "c" language = "c"
standard = "c17" standard = "c11"
kind = "staticlib" kind = "staticlib"
``` ```
@@ -42,29 +43,28 @@ int add(int a, int b);
int add(int a, int b) { return a + b; } int add(int a, int b) { return a + b; }
``` ```
## Шаг 2: Собрать ## Step 2: Build
```bash ```bash
cd my-lib
dcr build --release dcr build --release
``` ```
Артефакты: Artifacts:
* `target/release/libmy-lib.a` (Linux/macOS) * `target/\<triple>/release/libmy-lib.a` (Linux)
* `target/release/my-lib.lib` (Windows) * `target/release/my-lib.lib` (Windows)
* `target/include/` — заголовочные файлы * `target/include/` — header files
## Шаг 3: Использовать в проекте ## Step 3: Use in another project
```bash ```bash
dcr new my-app dcr new my-app
cd my-app cd my-app
dcr add ../my-lib dcr add my-lib ../my-lib
``` ```
Автоматически: Automatically:
* Добавляется include path на `target/include/` библиотеки * Adds include path to `target/include/` of the library
* Добавляется lib path на `target/release/` * Adds lib path to `target/\<triple>/release/`
* Линкуется `libmy-lib.a` / `my-lib.lib` * Links `libmy-lib.a` / `my-lib.lib`

View File

@@ -1,19 +1,19 @@
--- ---
sidebar_label: Рабочая область с несколькими пакетами sidebar_label: Multi-package workspace
--- ---
# Рабочая область с несколькими пакетами # Multi-Package Workspace
Проект из трёх пакетов: библиотека, утилита и основной бинарник. A project with three packages: two libraries and a binary.
## Структура ## Structure
``` ```
workspace/ workspace/
├── dcr.toml # корневой workspace ├── dcr.toml # root workspace
├── lib-core/ ├── lib-core/
│ ├── dcr.toml │ ├── dcr.toml
│ └── src/lib.rs │ └── src/core.c
├── lib-utils/ ├── lib-utils/
│ ├── dcr.toml │ ├── dcr.toml
│ └── src/utils.c │ └── src/utils.c
@@ -22,7 +22,7 @@ workspace/
└── src/main.c └── src/main.c
``` ```
## Корневой dcr.toml ## Root dcr.toml
```toml ```toml
[package] [package]
@@ -49,7 +49,7 @@ deps = ["lib-core", "lib-utils"]
main = true main = true
``` ```
## Пакеты ## Packages
`lib-core/dcr.toml`: `lib-core/dcr.toml`:
@@ -57,7 +57,7 @@ main = true
[package] [package]
name = "lib-core" name = "lib-core"
version = "0.1.0" version = "0.1.0"
type = "lib" type = "none"
[build] [build]
kind = "staticlib" kind = "staticlib"
@@ -69,7 +69,7 @@ kind = "staticlib"
[package] [package]
name = "lib-utils" name = "lib-utils"
version = "0.1.0" version = "0.1.0"
type = "lib" type = "none"
[build] [build]
kind = "staticlib" kind = "staticlib"
@@ -81,23 +81,23 @@ kind = "staticlib"
[package] [package]
name = "app" name = "app"
version = "0.1.0" version = "0.1.0"
type = "app" type = "none"
[build] [build]
kind = "bin" kind = "bin"
``` ```
## Сборка ## Build
```bash ```bash
cd workspace cd workspace
dcr build # собирает всё в правильном порядке dcr build # builds everything in correct order
dcr build --workspace app # только app (lib-core и lib-utils собираются как зависимости) dcr build --workspace app # only app (lib-core and lib-utils built as deps)
dcr run # собирает и запускает main-пакет dcr run # builds and runs main package
``` ```
Порядок сборки (топологическая сортировка): Build order (topological sort):
1. `lib-core` 1. `lib-core`
2. `lib-utils` (зависит от lib-core) 2. `lib-utils` (depends on lib-core)
3. `app` (зависит от lib-core, lib-utils) 3. `app` (depends on lib-core, lib-utils)

View File

@@ -1,89 +0,0 @@
---
sidebar_label: OS-dev (flat-bin + archive)
---
# Pure ASM / boot image (flat-bin + archive)
Minimal OS-dev style pipeline: assemble raw binaries with NASM, then pack a FAT floppy/image with an optional boot sector.
## Project layout
```
myos/
dcr.toml
src/
boot.asm # boot sector (512 bytes)
kernel.asm # payload
```
For multiple flat artifacts, use a **workspace** (one member per binary) or separate packages; a single `flat-bin` package produces one binary per source stem.
## Boot package (`flat-bin`)
```toml
[package]
name = "boot"
version = "0.1.0"
[build]
language = "asm"
compiler = "nasm"
kind = "flat-bin"
extension = "bin"
roots = ["src/boot.asm"]
```
```bash
dcr build
# → target/<…>/debug/boot.bin (NASM -f bin, no link)
```
## Disk image after build
```toml
[archive]
output = "target/{profile}/disk.img"
format = "fat12"
size = "1440K"
label = "MYOS"
bootsector = "target/{profile}/boot.bin"
[[archive.layout]]
from = "target/{profile}/kernel.bin"
to = "KERNEL.BIN"
```
* `format`: `fat12`, `fat16`, or `fat32`
* `size`: bytes or `K`/`KB`/`M`/`MB`/`G`/`GB` (default ~1.44 MiB)
* `bootsector`: written only when `offset` is omitted or `0`
* `from` may be a glob; `{profile}` is substituted in paths
## C kernel → flat binary
```toml
[build]
language = "c"
compiler = "clang"
kind = "flat-bin"
freestanding = true
filename = "kernel"
extension = "bin"
ldflags = ["-T", "linker.ld"]
```
Pipeline: objects → temporary linked ELF → `objcopy -O binary` → `kernel.bin`. Requires `objcopy` / `llvm-objcopy` in PATH.
## Other assemblers
| Tool | Notes |
| -------- | --------------------------------------------------------------------------------------- |
| **FASM** | Write `format binary` in the source; DCR writes `\<stem>.bin` directly |
| **GAS** | Assemble `.s` → obj → `objcopy -O binary` |
| **LLC** | `language = "llvm_ir"` → obj → objcopy |
| **MASM** | COFF obj → objcopy (needs binutils/LLVM objcopy) |
## Notes
* Single-file `roots` are supported: `roots = ["src/boot.asm"]`.
* `--force` re-runs `build.steps` / `build.post_steps` as well as recompilation.
* Prefer `kind = "elf"` if you need a relocatable ELF kernel without stripping to raw binary.

View File

@@ -1,12 +1,12 @@
--- ---
sidebar_label: dcr build --profile lto sidebar_label: Build profiles
--- ---
# Встроенные профили # Build Profiles
Профили позволяют переопределять любые поля секции `[build]` для конкретного режима сборки. Profiles allow overriding `[build]` fields for specific build modes.
## Конфигурация ## Configuration
```toml ```toml
[build] [build]
@@ -18,36 +18,36 @@ cflags = ["-Wall"]
cflags = ["-O0", "-g"] cflags = ["-O0", "-g"]
[build.release] [build.release]
cflags = ["-O3", "-flto"] cflags = ["-O3", "-DNDEBUG"]
``` ```
## Правила ## Merge rules
Поля из `[build.\<profile>]` **мержатся поверх** `[build]` Fields from `[build.\<profile>]` are merged on top of `[build]`:
* **Скалярные поля** (строки, числа, логические значения) — заменены * **Scalar fields** (strings, numbers, bools) — replaced
* Массивы (`cflags`, `ldflags`, ...) **заменяются полностью**, а не дополняются * **Arrays** (`cflags`, `ldflags`, ...) — **appended** (extend the `[build]` array)
Установите `inherit = false`, чтобы отключить наследование массивов (будут использоваться только собственные массивы профиля). Set `inherit = false` to disable array inheritance (only profile's own arrays are used).
## Кастомные профили ## Built-in profiles
Флаги по умолчанию для каждого профиля формируются из трёх полей конфигурации: The default flags for each profile are composed from three config fields:
| Поле | Default cflags | Профили сборки | | Field | debug default | release default |
| ---------------- | ------------------ | -------------- | | ----------- | ------------------ | --------------- |
| `opt_level` | `-O0 -g` | `"3"` | | `opt_level` | `"0"` | `"3"` |
| `debug` | `true` | `false` | | `debug` | `true` | `false` |
| `предупреждения` | `["all", "extra"]` | `[]` | | `warnings` | `["all", "extra"]` | `[]` |
Которые генерируют соответствующие флаги компилятора: Which produce the equivalent compiler flags:
| Профиль | Действующие флаги | | Profile | Effective flags |
| ------- | ---------------------------------------------------------- | | --------- | ---------------------------------------------------------- |
| `debug` | `-O0 -g -Wall -Wextra -fno-omit-frame-pointer -DDCR_DEBUG` | | `debug` | `-O0 -g -Wall -Wextra -fno-omit-frame-pointer -DDCR_DEBUG` |
| `релиз` | `-O3 -DNDEBUG` | | `release` | `-O3 -DNDEBUG` |
Дополнительные параметры сборки можно включать или отключать для каждого профиля: Additional build options can be toggled per-profile:
```toml ```toml
[build.release] [build.release]
@@ -63,7 +63,7 @@ debug = false
warnings = ["all", "error"] warnings = ["all", "error"]
``` ```
## Target-specific профили ## Target-specific profiles
```toml ```toml
[build.linux] [build.linux]
@@ -73,10 +73,10 @@ cflags = ["-DLINUX"]
cflags = ["-DWIN32", "-O0", "-g"] cflags = ["-DWIN32", "-O0", "-g"]
``` ```
Порядок применения (в порядке убывания приоритета): Application order (highest priority first):
1. `[build.\<target>.\<profile>]` 1. `[build.\<target>.\<profile>]`
2. `[build.\<profile>.\<target>]` 2. `[build.\<profile>.\<target>]`
3. ]`или`[build.\<target>]\` 3. `[build.\<target>]`
4. `[build.\<profile>]`. 4. `[build.\<profile>]`
5. `[build]` 5. `[build]`

View File

@@ -1,37 +1,37 @@
--- ---
sidebar_label: Система сборки sidebar_label: Build system
--- ---
# Система сборки # Build System
## Бэкенды компилятора ## Compiler Backends
DCR поддерживает 4 бэкенда компиляции. Выбор происходит автоматически на основе расширения файла и target triple. DCR supports 7 compilation backends. Selection is automatic based on file extension and `build.compiler` value.
| Бэкенд | Файлы | Когда используется | | Backend | Files | When used |
| --------- | --------------------------------------- | ------------------------------------- | | --------- | --------------------------------- | ------------------------------------- |
| `unix_cc` | `.c`, `.cpp`, `.cxx`, `.cc`, `.s`, `.S` | gcc/clang на Linux/macOS/BSD | | `unix_cc` | `.c`, `.cpp`, `.cxx`, `.cc`, `.S` | gcc/clang on Linux/macOS/BSD |
| `msvc` | `.c`, `.cpp`, `.cxx`, `.cc` | Windows (cl, clang-cl) | | `msvc` | `.c`, `.cpp`, `.cxx`, `.cc` | Windows (cl, clang-cl) |
| `газ` | `.s`, `.S` | ARM/ARM64 ассемблер | | `gas` | `.s` | ARM/ARM64 assembler (no preprocessor) |
| `nasm` | `.asm`, `.s` | x86/x86_64 ассемблер | | `nasm` | `.asm`, `.s` | x86/x86_64 NASM assembler |
| `masm` | `.asm` | MASM (ml/ml64) в Windows | | `masm` | `.asm` | MASM (ml/ml64) on Windows |
| `fasm` | `.asm`, `.fasm` | Сборщик плоских деталей | | `fasm` | `.asm`, `.fasm` | Flat Assembler |
| `llvm_ir` | `.ll` | LLVM IR с помощью `llc -filetype=obj` | | `llvm_ir` | `.ll` | LLVM IR via `llc -filetype=obj` |
## Поддержка Qt ## Qt Support
DCR обеспечивает встроенную поддержку Qt для автоматической обработки метаобъектов (MOC, UIC, RCC). DCR provides native Qt support for automatic meta-object handling (MOC, UIC, RCC).
Чтобы включить эту функцию, установите значение `build.qt = true` в файле `dcr.toml`. DCR автоматически обнаружит файлы, связанные с Qt (`.ui`, `.qrc`, `.h` с `Q_OBJECT`), и обработает их. Enable it by setting `build.qt = true` in `dcr.toml`. DCR will automatically detect Qt-related files (`.ui`, `.qrc`, `.h` with `Q_OBJECT`) and process them.
```toml ```toml
[build] [build]
qt = true qt = true
``` ```
*Примечание: Требуется установка модулей `qt6` (Core, Widgets, Gui, Svg) с помощью `pkg-config`.* *Note: Requires `qt6` modules (Core, Widgets, Gui, Svg) installed via `pkg-config`.*
Если требуется специальная обработка, по-прежнему можно выполнить расширенную настройку с помощью файла `build.steps`: Advanced customization is still possible via `build.steps` if special handling is needed:
```toml ```toml
[build.steps] [build.steps]
@@ -40,69 +40,64 @@ moc = "moc {in} -o {out}"
### Unix CC ### Unix CC
* Компилятор определяется через `resolve_compiler()`: CC/CXX из [toolchain], DCR_COMPILER/env, PATH * Compiler resolved via `resolve_compiler()`: `DCR_COMPILER` > `DCR_CC` > `[toolchain]` > `build.compiler` > `PATH`
* Поддерживает генерацию `.d` файлов для header dependency tracking * Supports `.d` files for header dependency tracking
* Флаги: `-std=`, `-MMD -MF`, `-c -o`, `-I`, `-L`, `-l` * Flags: `-std=`, `-MMD -MF`, `-c -o`, `-I`, `-L`, `-l`
* Условные флаги, зависящие от настроек: * Conditional flags based on config:
* `freestanding` или целевая среда «bare-metal»: `-ffreestanding` (компиляция), `-nostdlib -static` (линковка) * `freestanding` or bare-metal target: `-ffreestanding` (compile), `-nostdlib -static` (link)
* `lto`: `-flto` (компиляция + линковка) * `lto`: `-flto` (compile + link)
* `panic = "abort"`: `-fno-exceptions` (только для C++), `-fno-unwind-tables`, `-fno-asynchronous-unwind-tables` * `panic = "abort"`: `-fno-exceptions` (C++ only), `-fno-unwind-tables`, `-fno-asynchronous-unwind-tables`
### MSVC ### MSVC
* Поддерживает cl.exe и clang-cl.exe * Supports cl.exe and clang-cl.exe
* Флаги: `/std:`, `/Fo:`, `/Fe:`, `/I`, `/link` * Flags: `/std:`, `/Fo:`, `/Fe:`, `/I`, `/link`
### GAS / NASM ### GAS / NASM / MASM / FASM / LLVM-IR
* GAS: `-I`, `-c -o`, `--defsym` * GAS: `-I`, `-c -o`, `--defsym`
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32; **`bin` when `kind = "flat-bin"`**) * NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32)
* MASM: `/nologo /c /Fo\<obj> <source>` * MASM: `/nologo /c /Fo\<obj> <source>`
* FASM: `<source> \<output>` (путь вывода — объектный файл) * FASM: `<source> \<output>` (output path is the object file)
* LLVM IR: `-filetype=obj <source> -o \<output>` * LLVM IR: `-filetype=obj <source> -o \<output>`
## Инкрементные сборки ## Incremental Builds
Три уровня инкрементальности: Three levels of incrementality:
1. **mtime** — если выходной файл новее всех входных, файл не перекомпилируется 1. **mtime** — if output is newer than all inputs, skip
2. **`.d` files** — отслеживание изменений в заголовочных файлах (включая транзитивные) 2. **`.d` files** — header change tracking (including transitive)
3. **SHA256 fingerprint** — если флаги компиляции изменились, файл перекомпилируется (fingerprint хранится в `.dcr_fingerprint`) 3. **SHA256 fingerprint** — recompile if compiler flags changed (stored in `.dcr_fingerprint`)
## Параллельная компиляция ## Parallel Compilation
* Используется `thread::scope` для создания пула потоков * `thread::scope` for thread pool
* Атомарная очередь задач (`AtomicU64`) * Atomic task queue (`AtomicU64`)
* Мьютекс на запись в stdout (`OUTPUT_MUTEX`) * Mutex on stdout (`OUTPUT_MUTEX`)
* Количество потоков = `available_parallelism()`, ограниченное значением `build.codegen-units`, если оно задано * Thread count = `available_parallelism()`, capped by `build.codegen-units` if set
## Типы сборок ## Build Kinds
| Тип | Тип | Путь (пример для Linux) | | Kind | Type | Path (Linux example) |
| ------------------ | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- | | ----------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `bin` | Исполняемый файл | `target/\<profile>/\<name>` (.exe) | | `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) |
| `staticlib` | Статическая библиотека | `target/\<profile>/lib\<name>.a` (.lib) | | `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) |
| `sharedlib` | Динамическая библиотека | `target/\<profile>/lib\<name>.so` (.dll/.dylib) | | `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) |
| `efi` | UEFI приложение | `target/\<profile>/\<name>.efi` | | `efi` | UEFI application | `target/\<triple>/\<profile>/\<name>.efi` |
| `эльф` | ELF без стандартной библиотеки | `target/\<profile>/\<name>` | | `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` |
| `нет` | Только компиляция, без линковки | — | | `none` | Compile only, no link | — |
| `пользовательский` | Полный контроль filename + extension | `target/\<profile>/\<filename>.\<extension>` | | `custom` | Full filename+extension control | `target/\<triple>/\<profile>/\<filename>.\<extension>` |
| `flat-bin` | Raw binary | ASM: `\<stem>.bin` (NASM `-f bin` / FASM / GAS·MASM·LLC via objcopy); C/C++: `\<name>.bin` (link + objcopy) |
## Disk images (`[archive]`) ## Build Steps
After a successful build, if `[archive]` is present in `dcr.toml`, DCR formats a FAT volume and copies files from `layout` into the image. See [dcr.toml → archive](/docs/reference/dcr-toml#archive). DCR supports pre-build and post-build steps:
## Этапы сборки * `build.steps` — commands before compilation
* `build.post_steps` — commands after compilation
DCR поддерживает pre-build и post-build шаги через Qt codegen: Substitutions: `{stem}`, `{in}`, `{out}`, `{profile}`, `{version}`, `{name}`.
* `build.steps` — команды, выполняемые перед компиляцией Example Qt codegen via build steps:
* `build.post_steps` — команды, выполняемые после компиляции
Подстановки: `{stem}`, `{in}`, `{out}`.
`rcc` — Resource Compiler: `{stem}.qrc → qrc_{stem}.cpp`
```toml ```toml
[build.steps] [build.steps]
@@ -111,26 +106,26 @@ moc = "moc {in} -o {out}"
## pkg-config ## pkg-config
Автоматический поиск (чтение из исходного файла конфигурации): Automatic lookup (read from raw config):
```toml ```toml
[build] [build]
pkg_config = ["sdl2", "gl"] pkg_config = ["sdl2", "gl"]
``` ```
DCR вызывает `pkg-config --cflags sdl2 gl` и `pkg-config --libs 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}` | Версия пакета | | `{version}` | Package version |
| `{version_major}` | Часть, обозначающая основную версию | | `{version_major}` | Major version part |
| `{version_minor}` | Часть, обозначающая второстепенную версию | | `{version_minor}` | Minor version part |
| `{version_patch}` | Переменная | | `{version_patch}` | Patch version |
| `{version_suffix}` | Суффикс (например, `-rc1`) | | `{version_suffix}` | Suffix (e.g., `-rc1`) |
| `{version_suffix_dash}` | Суффикс с тире | | `{version_suffix_dash}` | Suffix with dash |
| `{profile}` | Имя профиля (debug/release/...) | | `{profile}` | Profile name (debug/release) |
| `{name}` | Имя пакета | | `{name}` | Package name |

View File

@@ -1,34 +0,0 @@
---
sidebar_label: CLI output
---
# CLI output (experimental)
The structured output implementation is being developed incrementally.
Currently these global options apply to diagnostics emitted through the logger:
```sh
dcr --output plain build
dcr --output json build
dcr --color never build
dcr --quiet build
dcr --verbose build
```
`--output` accepts `human` (default), `plain`, or `json`.
Diagnostics are written to stderr. JSON diagnostics are newline-delimited objects
with `schema_version: 1`, `event`, and `message` fields. Command statuses use the
shared output helpers, build reporting emits structured lifecycle events, and
compiler output is represented as JSON events with its original stream and text.
The protocol is still experimental: some raw command data and subprocess stdout
remain unstructured.
`--color` accepts `auto`, `always`, or `never`. Automatic coloring requires a
terminal and respects `NO_COLOR`. Plain and JSON diagnostics never add colors.
Quiet mode preserves warnings, errors, and compiler diagnostics; verbose mode
enables debug and trace logging. Arguments following `--` are passed through
unchanged.
Remaining work includes migrating the remaining raw command data and subprocess
stdout, improving progress rendering and contextual errors, and expanding
integration coverage for stdout/stderr and closed pipes.

View File

@@ -1,15 +1,15 @@
--- ---
sidebar_label: Кросс-компиляция sidebar_label: Cross-compilation
--- ---
# Кросс-компиляция # Cross-Compilation
## Сокращённые названия ## Short Names
DCR поддерживает короткие имена платформ, которые автоматически раскрываются в полные triples: DCR supports short platform names:
| Краткое название | Полный тройной | | Short Name | Full Triple |
| ---------------- | -------------------------- | | ---------- | -------------------------- |
| `linux` | `x86_64-unknown-linux-gnu` | | `linux` | `x86_64-unknown-linux-gnu` |
| `macos` | `x86_64-apple-darwin` | | `macos` | `x86_64-apple-darwin` |
| `windows` | `x86_64-pc-windows-msvc` | | `windows` | `x86_64-pc-windows-msvc` |
@@ -18,33 +18,33 @@ DCR поддерживает короткие имена платформ, ко
dcr build --target windows dcr build --target windows
``` ```
## Полные тройки ## Full Triples
```bash ```bash
dcr build --target aarch64-unknown-linux-gnu dcr build --target aarch64-unknown-linux-gnu
dcr build --target x86_64-pc-windows-gnu dcr build --target x86_64-pc-windows-gnu # mingw
dcr build --target armv7-unknown-linux-gnueabihf dcr build --target armv7-unknown-linux-gnueabihf
``` ```
## clang --target ## clang --target
При использовании clang DCR автоматически inject-ит `--target=\<triple>` в CFLAGS/CXXFLAGS. When using clang, DCR injects `--target=\<triple>` into CFLAGS.
```toml ```toml
[build] [build]
compiler = "clang" compiler = "clang"
target = "aarch64-unknown-linux-gnu" target = "aarch64-unknown-linux-gnu"
# Авто: cflags = ["--target=aarch64-unknown-linux-gnu"] # Auto: cflags += ["--target=aarch64-unknown-linux-gnu"]
``` ```
## Bare-Metal ## Bare-Metal / Freestanding
Для целевых платформ, содержащих значения `none`, `-elf`, `eabi` или `baremetal`, DCR автоматически: For targets containing `none`, `-elf`, `eabi`, or `baremetal`, DCR automatically:
1. Для none/elf/eabi/bare-metal target-ов отключаются DCR default флаги (нет `-I` системных путей, нет `-l` libc). 1. **Disables default flags** — no system include paths, no `-l` libc
2. **Вставляет `-ffreestanding`** на этапе компиляции и `-nostdlib -static` на этапе линковки 2. **Injects `-ffreestanding`** at compile time and `-nostdlib -static` at link time
Кроме того, можно явно включить автономный режим: You can also enable freestanding mode explicitly:
```toml ```toml
[build] [build]
@@ -55,10 +55,16 @@ freestanding = true
dcr build --target aarch64-none-elf dcr build --target aarch64-none-elf
``` ```
## Целевой каталог ## Target Directory
By default, the compilation output directories are structured as follows: On Linux with explicit target:
* **Linux and BSD**: Always output to `target/\<triple>/\<profile>/` (using host triple if no target is specified). ```
* **macOS and Windows (without target)**: Output to `target/\<profile>/`. target/<triple>/<profile>/
* **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`. ```
On macOS/Windows or without target:
```
target/<profile>/
```

View File

@@ -1,12 +1,12 @@
--- ---
sidebar_label: Обзор dcr.toml sidebar_label: dcr.toml overview
--- ---
# Обзор dcr.toml # dcr.toml
Основной конфигурационный файл проекта. Располагается в корне проекта. Main project configuration file. Located at the project root.
## Структура ## Structure
```toml ```toml
[package] [package]
@@ -33,95 +33,71 @@ sidebar_label: Обзор dcr.toml
[run] [run]
# run settings # run settings
[archive]
# optional: pack FAT disk image after build
``` ```
## [пакет] ## [package]
| Поле | Обязательное | Описание | | Field | Required | Description |
| ------------- | ------------ | --------------------------------------------------------------------------------------------------------------- | | --------- | -------- | ------------------------------------------- |
| `имя` | да | Имя проекта | | `name` | yes | Project name |
| `версия` | да | Semantic version of the **project** | | `version` | yes | Semantic version |
| `dcr-version` | no | Semver of the **dcr tool** this project targets. Written by `dcr new` / `dcr init` to the current tool version. | | `type` | no | `app`, `lib`, `none` (defaults to `"none"`) |
| `тип` | нет | `app`, `lib`, `none` (defaults to `"none"`) | | `license` | no | SPDX license identifier |
| `лицензия` | нет | SPDX-идентификатор лицензии | | `author` | no | Author |
| `автор` | no | Автор |
```toml ```toml
[package] [package]
name = "my-app" name = "my-app"
version = "0.1.0" version = "0.1.0"
dcr-version = "0.8.4"
type = "app" type = "app"
license = "MIT" license = "MIT"
author = "John Doe" author = "John Doe"
``` ```
### `package.dcr-version` ## [build]
Optional pin of the DCR CLI the project was written for. On every `dcr.toml` load:
| Situation | Behaviour |
| ------------------------------ | ---------------------------------------------------------- |
| Field missing / empty | Warning: add `dcr-version` (set by `dcr new` / `dcr init`) |
| Running dcr **older** than pin | Warning: upgrade dcr (`dcr --update`) |
| Running dcr **newer** than pin | Warning: review changelog, bump the pin when ready |
| Equal | Silent |
| Invalid semver | Warning once, field ignored |
Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) are ignored for comparison (`1.0.0-dev` ≡ `1.0.0`).
## [сборка]
... ...
* `build.qt` — (bool) Включить автоматическую обработку метаобъектов Qt (MOC, UIC, RCC). Требуется установка модулей `qt6` с помощью `pkg-config`. * `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`.
| Поле | По умолчанию | Описание | | Field | Default | Description |
| ------------------------ | ------------- | --------------------------------------------------------------------------------------------------------- | | ---------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
| `язык` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) | | `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"` (optional, defaults to `"c"`) |
| `стандартный` | `"c11"` | Стандарт C (`c11`, `c17`, `c23`) | | `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) |
| `cxx_standard` | — | Стандарт C++ (`c++17`, `c++20`, `c++23`) | | `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) |
| `компилятор` | `cxxflags` | Preferred compiler (optional, defaults to `"clang"`) | | `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) |
| `тип` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom`, `flat-bin` | | `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom` |
| `target` | хост | Target triple для кросс-компиляции | | `target` | host | Target triple for cross-compilation |
| `платформа` | `"нативный"` | `native`, `efi`, `freestanding` | | `platform` | `"native"` | `native`, `efi` |
| `cflags` | `[]` | Дополнительные флаги C++ | | `cflags` | `[]` | Additional C/C++/ASM flags |
| `ldflags` | `[]` | Дополнительные флаги линковки | | `ldflags` | `[]` | Additional linker flags |
| `имя файла` | `""` | Кастомное имя выходного файла | | `filename` | `""` | Custom output file name |
| `расширение` | `""` | Custom file extension (for `flat-bin`, default is `bin`) | | `extension` | `""` | Custom file extension |
| `корни` | `["src"]` | Source roots: directories and/or individual source/header files | | `roots` | `["src"]` | Source root directories |
| `exclude` | `[]` | Паттерны исключений | | `exclude` | `[]` | Exclude patterns |
| `include` | `[]` | Дополнительные include-директории | | `include` | `[]` | Additional include directories |
| `src_disable` | `false` | Отключить автоматический поиск источников | | `src_disable` | `false` | Disable auto source discovery |
| `наследовать` | `false` | Наследовать build от корня workspace | | `inherit` | `false` | Inherit build from workspace root |
| `clean` | `[]` | Шаблоны Glob для настраиваемых чистых путей | | `clean` | `[]` | Glob patterns for custom clean paths |
| `out_dir` | `""` | Пользовательский каталог для вывода данных | | `out_dir` | `""` | Custom output directory |
| `только рабочая область` | `false` | Workspace-only, not built standalone (no `language`/`compiler` required) | | `workspace_only` | `false` | Workspace-only, not built standalone (no `language`/`compiler` required) |
| `отдельно стоящий` | `false` | Компилировать в автономном режиме (`-ffreestanding` + `-nostdlib -static`) | | `freestanding` | `false` | Compile in freestanding mode (`-ffreestanding` + `-nostdlib -static`) |
| `opt_level` | — | Optimization level: `0`-`3`, `"s"`, `"z"` (derived from profile if omitted) | | `opt_level` | — | Optimization level: `0`-`3`, `"s"`, `"z"` (derived from profile if omitted) |
| `ldscript` | profile-based | Emit debug symbols (`-g`): `true` in debug, `false` in release | | `debug` | profile-based | Emit debug symbols (`-g`): `true` in debug, `false` in release |
| `lto` | `false` | Оптимизация на этапе компоновки (`-flto` как для компилятора, так и для компоновщика) | | `lto` | `false` | Link-time optimization (`-flto` for both compiler and linker) |
| `asflags` | `false` | Удалить символы из вывода (опция `-s` в ldflags) | | `strip` | `false` | Strip symbols from output (`-s` in ldflags) |
| `true` | `[]` | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`); engine adds `-Wall -Wextra` in debug if empty | | `warnings` | `[]` | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`); engine adds `-Wall -Wextra` in debug if empty |
| `panic` | `""` | Стратегия «Паника»: `"abort"` отключает исключения и таблицы развертки | | `panic` | `""` | Panic strategy: `"abort"` disables exceptions and unwind tables |
| `codegen-units` | `""` | Максимальное количество параллельных заданий компиляции (`"0"` = автоматически) | | `codegen-units` | `""` | Max parallel compilation jobs (`"0"` = auto) |
| `qt` | `false` | Включить автоматическую обработку метаобъектов Qt (MOC, UIC, RCC) | | `qt` | `false` | Enable automatic Qt meta-object handling (MOC, UIC, RCC) |
Параметры из исходного файла конфигурации (не в виде типизированной структуры): Settings from raw config (not in typed struct):
* `pkg_config` — list of packages queried for build-wide compiler/linker flags * `pkg_config` — list of pkg-config packages
* `ldscript` — linker script path
* `build.steps` / `build.post_steps` — codegen steps
Dependencies can also declare a system package directly, for example ## Per-language overrides: `[build.c]`, `[build.cxx]`, `[build.asm]`
`fmt = { pkg-config = "fmt" }`. This records the package in `dcr.lock` and applies
the flags returned by `pkg-config --cflags` and `pkg-config --libs`.
* Путь к linker script
* `build.steps` / `build.post_steps` — этапы генерации кода
## Per-language overrides: `[build.c]`, `[build.cxx]`, `[build.asm]`, `[build.llvm_ir]`
Each language can have its own table that overrides the flat `[build]` settings: Each language can have its own table that overrides the flat `[build]` settings:
@@ -141,28 +117,28 @@ compiler = "g++"
[build.asm] [build.asm]
compiler = "nasm" compiler = "nasm"
flags = ["-felf64"] flags = ["-felf64"]
[build.llvm_ir]
compiler = "llc"
``` ```
The flat `[build]` acts as fallback; per-language tables take precedence for their language. The flat `[build]` acts as fallback; per-language tables take precedence for their language.
Пример: Example:
```toml ```toml
[build] [build]
language = ["cpp", "c"] language = "c++"
standard = "c17"
standard = "c23" standard = "c23"
cxx_standard = "c++23" cxx_standard = "c++23"
compiler = "clang" compiler = "clang"
kind = "sharedlib" kind = "sharedlib"
cflags = ["-Wall", "-Wextra"] cflags = ["-Wall", "-Wextra"]
pkg_config = ["sdl2", "gl"] opt_level = "z"
lto = true
strip = true
panic = "abort"
codegen-units = "2"
``` ```
## [набор инструментов] ## [toolchain]
```toml ```toml
[toolchain] [toolchain]
@@ -171,114 +147,30 @@ cxx = "/usr/bin/clang++"
as = "/usr/bin/as" as = "/usr/bin/as"
ar = "/usr/bin/ar" ar = "/usr/bin/ar"
ld = "/usr/bin/ld.lld" ld = "/usr/bin/ld.lld"
uic = "/usr/bin/uic" # Qt
moc = "/usr/bin/moc" # Qt
rcc = "/usr/bin/rcc" # Qt
``` ```
Raw config также поддерживает `uic`, `moc` и `rcc` для генерации кода Qt. Raw config also supports `uic`, `moc`, `rcc` for Qt codegen.
## [зависимости] ## [dependencies]
См. [dependencies](/docs/reference/dependencies). See [dependencies](/docs/reference/dependencies).
## [запустить] ## [run]
```toml ```toml
[запустить] [run]
cmd = "./target/{profile}/{name}" cmd = "./target/{profile}/{name}"
``` ```
Подстановки: Substitutions:
* `{version}` — версия из [package] * `{version}` — package version
* `pkg_config` * `{version_major}`, `{version_minor}`, `{version_patch}`, `{version_suffix}`, `{version_suffix_dash}` — version parts
* `{profile}` — отладочная / релизная версия * `{profile}` — debug / release
* `{name}` — имя из [package] * `{name}` — package name
По умолчанию `cmd` вычисляется как `./target/{profile}/{name}`. Default `cmd` = `./target/{profile}/{name}` (macOS/Windows) or `./target/\<triple>/\<profile>/\<name>` (Linux).
## [рабочая область] ## [workspace]
См. [workspaces](/docs/reference/workspaces). See [workspaces](/docs/reference/workspaces).
## [archive]
Optional post-build step: format a FAT volume and copy built artifacts into a disk image. Runs after a successful package build (and after workspace member builds that define `[archive]`).
Requires DCR built with the `archive` Cargo feature (`cargo build --features archive`). Release binaries include this feature.
| Field | Required | Description |
| ------------ | -------- | ------------------------------------------------------------------------------------------- |
| `output` | yes | Image path relative to project root (`{profile}` allowed) |
| `format` | yes | `fat12`, `fat16`, or `fat32` |
| `size` | no | Image size: bytes or `K`/`KB`/`M`/`MB`/`G`/`GB` (default `1474560` ≈ 1.44 MiB) |
| `offset` | no | Byte offset of the FAT volume inside the image (default `0`) |
| `label` | no | Volume label (max 11 chars, default `VOLUME`) |
| `bootsector` | no | Path to a 512-byte boot sector written at offset 0 when `offset` is 0 (`{profile}` allowed) |
| `layout` | no | List of `{ from, to }` entries (files or globs → path inside the volume) |
```toml
[archive]
output = "target/{profile}/disk.img"
format = "fat12"
size = "1440K"
label = "MYOS"
bootsector = "target/{profile}/boot.bin"
[[archive.layout]]
from = "target/{profile}/kernel.bin"
to = "KERNEL.BIN"
[[archive.layout]]
from = "assets/*"
to = "/"
```
Typical pairing with `kind = "flat-bin"` (NASM `-f bin`) for bootloaders and pure-ASM OS images.
## `flat-bin` (kind)
Produces a raw binary (default extension `bin`) for boot sectors, kernels, and freestanding payloads.
### Assemblers
| Tool | Language / compiler | How flat-bin is produced |
| ---- | ------------------------------------------ | -------------------------------------------- |
| NASM | `language = "asm"`, `compiler = "nasm"` | `-f bin` → `\<stem>.bin` |
| FASM | `compiler = "fasm"` | direct write (use `format binary` in source) |
| GAS | `compiler = "as"` / `"gas"` | assemble → `objcopy -O binary` |
| MASM | `compiler = "ml"` / `"ml64"` | assemble → `objcopy -O binary` |
| LLC | `language = "llvm_ir"`, `compiler = "llc"` | `-filetype=obj` → `objcopy -O binary` |
```toml
[build]
language = "asm"
compiler = "nasm"
kind = "flat-bin"
extension = "bin"
roots = ["src/boot.asm"]
```
### C / C++
Compile all sources, link with `-nostdlib -static` (plus your `ldflags` / `ldscript`), then convert the intermediate ELF/PE with `objcopy -O binary` to `\<filename|name>.bin`.
```toml
[build]
language = "c"
compiler = "clang"
kind = "flat-bin"
freestanding = true
filename = "kernel"
extension = "bin"
ldscript = "linker.ld"
ldflags = ["-T", "linker.ld"]
```
Notes:
* Multi-file **ASM** packages emit one `\<stem>.bin` per source; **C/C++** emit a single project binary.
* `objcopy` tools tried in order: `llvm-objcopy`, `objcopy`, `gobjcopy`.
* Incompatible with `build.qt = true`.
* `dcr run` rejects `flat-bin` (not a host executable).

View File

@@ -1,111 +1,65 @@
--- ---
sidebar_label: Зависимости sidebar_label: Dependencies
--- ---
# Зависимости # Dependencies
## Форматы ## Formats
The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies: The `[dependencies]` section supports three formats:
### Строка (реестр) ### String (registry)
```toml ```toml
[dependencies] [dependencies]
fmt = "10.1.1" fmt = "10.1.1"
spdlog = "^1.12" spdlog = "1.12"
catch2 = ">=3.0,<4.0" catch2 = "3.4.0"
``` ```
Строка версии используется без изменений для поиска в реестре. The version string is used as-is for registry lookup.
### Табличный (git) ### Table (git)
```toml ```toml
[dependencies] [dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0" } fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
``` ```
Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`. Fields: `git`, `branch`, `tag`, `rev`.
### Табличный (path) ### Table (path)
```toml ```toml
[dependencies] [dependencies]
mylib = { path = "../mylib" } mylib = { path = "../mylib" }
``` ```
For a prebuilt external library, specify its layout explicitly. The three ## Registry
arrays are paths relative to the dependency root (`include`, `lib`) and linker
names (`libs`):
```toml DCR uses a package registry for dependency lookup by name.
[dependencies]
dcr-math = { path = "../deps/dcr-math", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
### Table (`pkg-config`)
Use an installed `.pc` package when the library is provided by the operating system
or another system package manager. DCR invokes `pkg-config --cflags` and
`pkg-config --libs`, preserving include, library, linker, and other flags:
```toml
[dependencies]
fmt = { pkg-config = "fmt" }
openssl = { pkg-config = ["openssl", "libcrypto"] }
```
The `pkg-config` executable must be available in `PATH`. The named `.pc` files must
be available through pkg-config's standard search paths or via `PKG_CONFIG_PATH`.
These dependencies are not downloaded or built by DCR; they are recorded in
`dcr.lock` with a `pkg-config+...` source.
## Реестр
## RegistryDCR использует реестр пакетов для поиска зависимостей по имени.```toml
# ~/.dcr/config.toml
[registry]
main = { url = "https://github.com/dcr-ports/dcr-index", priority = 1 }
```
```toml ```toml
# ~/.dcr/config.toml # ~/.dcr/config.toml
[registry.default] [registry.default]
url = "https://index.dcr.dexoron.tech" url = "https://index.dcr.pm"
priority = 1 priority = 1
``` ```
Приоритет реестра: порядок в файле `config.toml`. Переменная `DCR_INDEX_PATH` переопределяет путь к index.json. Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`.
## Git-зависимости ## Git dependencies
Git dependencies are cloned into `~/.dcr/git/`; their exact checked-out commit is written to `dcr.lock`. Git dependencies are parsed and recorded in `dcr.lock`. DCR supports specifying branch/tag/rev for git sources:
Both Git and path dependencies have two modes: * `branch` — switch to a branch
* `tag` — switch to a tag
* **DCR package:** the source has `dcr.toml`. DCR builds it before the consumer and uses the package name from its manifest for linking. * `rev` — switch to a specific commit
* **Prebuilt library:** it provides existing headers and binaries through `include`, `lib`, and `libs`. DCR passes them to the compiler/linker without building the dependency. * `features` — feature flags (parsed, but does not affect build)
The mode is normally detected automatically. Use `mode = "build"` or `mode = "prebuild"` when a source contains both a manifest and prebuilt artifacts and you need to choose explicitly.
`dcr-math-lib` publishes both forms. Select its prebuilt library explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
DCR supports specifying branch/tag/rev for git sources:
* `branch` — переключиться на ветку
* `tag` — переключиться на тег
* `rev` — переключиться на конкретный коммит
* `features` — флаги функций (проанализированы, но не влияют на сборку)
## Path dependencies ## Path dependencies
Local paths may point at a DCR package or a prebuilt external library. A path DCR package is built before its consumer, including its own path/git dependencies. DCR detects dependency cycles. A prebuilt library is never built by DCR; it is linked from the directories declared in its dependency entry. Local paths. DCR automatically discovers include and lib directories from the neighbor's `dcr.toml`.
```toml ```toml
[dependencies] [dependencies]
@@ -113,51 +67,16 @@ mylib = { path = "/abs/path/to/lib" }
mylib = { path = "../relative/path" } mylib = { path = "../relative/path" }
``` ```
For DCR packages, the package name from `dcr.toml` is used for linking (so the dependency key may differ from the library name). Header resolution includes the packaged `target/include` directory and link search includes `target/lib`.
### Recommended library layouts
Buildable DCR library:
```text
dcr-math-lib/
├── dcr.toml
└── src/
├── dcr_math.c
└── dcr_math.h
```
Prebuilt library:
```text
dcr-math-lib/
├── include/
│ └── dcr_math.h
└── lib/
└── libdcr-math.a # or .so / .lib
```
`libs` contains linker names without the `lib` prefix and file extension: use
`["dcr-math"]` for `libdcr-math.a`.
If one repository contains both forms, keep the prebuilt files in `include/` and `lib/` and select the mode explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
For a local copy, replace `git` with `path = "../dcr-math-lib"`. In `prebuild` mode DCR does not run the dependency build, even when `dcr.toml` is present.
## dcr.lock ## dcr.lock
Dependency lock file. Contains package names and sources. Dependency lock file. Contains package names and sources.
Created during `dcr build` for resolved registry, path, and Git dependencies. Not updated during `dcr add` — only on the next `dcr build`. Created during `dcr build` when registry dependencies are present. Not updated during `dcr add` — only on the next `dcr build`.
## Resolution process ## Resolution process
1. Resolve dependency sources (registry → git → path) 1. Load all dependencies (registry → git → path)
2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref 2. For path deps: recursively read their `dcr.toml`
3. Build DCR package dependencies recursively 3. For registry deps: search `index.json`
4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler 4. For git deps: clone to cache
5. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler

View File

@@ -1,29 +1,29 @@
--- ---
sidebar_label: Переменные среды sidebar_label: Environment variables
--- ---
# Переменные среды # Environment Variables
## DCR_COMPILER ## DCR_COMPILER
Переопределяет компилятор для всех языков. **Наивысший приоритет.** Overrides the compiler for all languages. **Highest priority.**
```bash ```bash
export DCR_COMPILER=clang export DCR_COMPILER=clang
dcr build dcr build
``` ```
Приоритет разрешения компилятора: Compiler resolution priority:
1. `DCR_COMPILER` (переменная среды) 1. `DCR_COMPILER` (env)
2. `DCR_CC` / `DCR_CXX` / `DCR_AS` (переменная среды) 2. `DCR_CC` / `DCR_CXX` / `DCR_AS` (env)
3. `[toolchain]` (dcr.toml) 3. `[toolchain]` (dcr.toml)
4. `build.compiler` (dcr.toml) 4. `build.compiler` (dcr.toml)
5. `PATH` 5. `PATH`
## DCR_CC / DCR_CXX / DCR_AS ## DCR_CC / DCR_CXX / DCR_AS
Приоритет: `[toolchain]` > `DCR_COMPILER` > `DCR_CC` > `PATH`. Per-language override (lower priority than `DCR_COMPILER`, higher than `[toolchain]`).
```bash ```bash
export DCR_CC=gcc-14 export DCR_CC=gcc-14
@@ -33,7 +33,7 @@ export DCR_AS=arm-linux-gnueabihf-as
## DCR_LD / DCR_AR ## DCR_LD / DCR_AR
Переопределить линкер и архиватор. Override linker and archiver.
```bash ```bash
export DCR_LD=ld.lld export DCR_LD=ld.lld
@@ -42,7 +42,7 @@ export DCR_AR=llvm-ar
## DCR_DEBUG ## DCR_DEBUG
Включает режим отладки — печатает все команды компиляции перед выполнением. Enables debug mode — prints all compilation commands to stderr before execution.
```bash ```bash
export DCR_DEBUG=1 export DCR_DEBUG=1
@@ -51,34 +51,10 @@ dcr build
## DCR_INDEX_PATH ## DCR_INDEX_PATH
Переопределяет путь к index.json реестра. Overrides the path to the registry `index.json`.
```bash ```bash
export DCR_INDEX_PATH=/custom/path/index.json export DCR_INDEX_PATH=/custom/path/index.json
``` ```
По умолчанию: `~/.dcr/index.json`. Default: `~/.dcr/index.json`.
## DCRUP_MIRROR
Download mirror for `dcrup` (prebuilt binaries only).
```bash
export DCRUP_MIRROR=auto # cf → gh → sf → ya (default)
export DCRUP_MIRROR=cf # CloudFlare CDN
export DCRUP_MIRROR=gh # GitHub Releases
export DCRUP_MIRROR=sf # SourceForge
export DCRUP_MIRROR=ya # Yandex CDN (RU fallback)
```
CLI override: `dcrup install stable --mirror cf`.
## DCRUP_HOME / DCRUP_BIN / DCRUP_REPO
Installer layout and source clone URL:
```bash
export DCRUP_HOME=~/.dcr
export DCRUP_BIN=~/.dcr/bin
export DCRUP_REPO=https://github.com/dexoron/dcr
```

View File

@@ -1,44 +1,42 @@
--- ---
sidebar_label: Поддержка платформ sidebar_label: Platform support
--- ---
# Поддержка платформ # Platform Support
## Тройные цели ## Target Triples
DCR нормализует target triple через `platform_triple::normalize_triple()`. Если задано имя платформы (short name), оно раскрывается в triple. DCR normalizes target triples. Short platform names are expanded to full triples.
### Linux ### Linux
``` ```
target/<arch>-unknown-linux-<env>/<profile>/ target/<arch>-unknown-linux-gnu/<profile>/
``` ```
Architectures: `x86_64`, `aarch64`, `i686`, `armv7`, `riscv64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
Environments: `gnu` (default), `musl`.
Тип артефакта: ELF. Расширения: `.so` для sharedlib, `.a` для staticlib Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib).
### macOS ### macOS
``` ```
target/<profile>/ (default) or target/<triple>/<profile>/ (with target) target/<profile>/
``` ```
Поддержка архитектур: `x86_64`, `aarch64`. Architectures: `x86_64`, `aarch64` (host-detected).
`.dylib` для sharedlib, `.a` для staticlib Extensions: `.dylib` (sharedlib), `.a` (staticlib).
### Windows ### Windows
``` ```
target/<profile>/ (default) or target/<triple>/<profile>/ (with target) target/<profile>/
``` ```
Поддержка архитектур: `x86_64`, `aarch64`. Architectures: `x86_64`, `aarch64`.
Environments: `msvc` (default), `gnu` (MinGW).
Расширения: `.exe` (бинарный файл), `.lib` (статическая библиотека), `.dll` (общая библиотека), `.efi` (UEFI). Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI).
### BSD ### BSD
@@ -46,8 +44,8 @@ Environments: `msvc` (default), `gnu` (MinGW).
target/<arch>-unknown-<os>/<profile>/ target/<arch>-unknown-<os>/<profile>/
``` ```
Поддерживаемые системы: `freebsd`, `openbsd`, `netbsd`. Supported systems: `freebsd`, `openbsd`, `netbsd`, `dragonfly`.
## Определение хоста ## Host Detection
`platform_triple::host_triple()` возвращает тройку текущей системы. Используется как fallback, если `target` не указан. DCR uses `std::env::consts::ARCH` and `std::env::consts::OS` for host platform detection. Used as fallback when `target` is not specified.

View File

@@ -1,64 +1,69 @@
--- ---
sidebar_label: Рабочие пространства sidebar_label: Workspaces
--- ---
# Рабочие пространства # Workspaces
Workspaces позволяют управлять несколькими пакетами в одном репозитории. Workspaces allow managing multiple packages in a single repository.
## Конфигурация ## Configuration
```toml ```toml
[workspace] [workspace.lib-core]
members = [ path = "lib-core"
{ path = "pkg-a" },
{ path = "pkg-b", deps = ["pkg-a"] }, [workspace.lib-utils]
{ path = "pkg-c", deps = ["pkg-a", "pkg-b"], main = true }, path = "lib-utils"
] deps = ["lib-core"]
[workspace.app]
path = "app"
deps = ["lib-core", "lib-utils"]
main = true
``` ```
### Поля member ### Member fields
| Поле | Описание | | Field | Description |
| ------ | -------------------------------------------- | | ------ | ------------------------------------------------ |
| `path` | Путь к пакету (относительно корня workspace) | | `path` | Path to the package (relative to workspace root) |
| `deps` | Зависимости от других member-ов | | `deps` | Dependencies on other members |
| `main` | Пометить как главный пакет | | `main` | Mark as the main package |
## Топологическая сортировка ## Topological sort
DCR автоматически сортирует пакеты по зависимостям: пакет A собирается раньше B, если B зависит от A. DCR automatically sorts packages by dependencies: package A is built before B if B depends on A.
Циклические зависимости обнаруживаются и приводят к ошибке. Cyclic dependencies are detected and cause an error.
## Сборка ## Build
```bash ```bash
dcr build # собрать все пакеты dcr build # build all packages in dependency order
dcr build --workspace pkg-a # собрать только pkg-a dcr build --workspace app # build only app (dependencies built automatically)
``` ```
When building a workspace, DCR automatically injects include and library paths of dependent workspace members: When building a workspace, member outputs (libraries) are automatically added to include/lib paths of dependent packages.
* **Include Paths**: Automatically resolves and injects header directories of dependencies, including the member's `src/` directory, local `include/` directory, and the packaged `target/include` directory. ## Clean
* **Library Paths**: Injects compiled library search paths (`target/lib` as well as target-specific build folders) to allow automatic linking with member libraries.
## Очистка
```bash ```bash
dcr clean # очистить только корневой target/ dcr clean # clean only root target/
dcr clean --all # очистить target/ всех пакетов dcr clean --all # clean target/ of all packages
``` ```
## Наследование ## Inheritance
Если у member-а нет своей секции `[build]`, а в корневом `[build]` указано `inherit = true`: If a member has `inherit = true` in its `[build]` section, fields from the root `[build]` are merged into the member:
```toml ```toml
# root dcr.toml
[build] [build]
inherit = true inherit = true
language = "c" language = "c"
standard = "c17" standard = "c17"
# member inherits language and standard
``` ```
## Workspace-only root (no build of its own) ## Workspace-only root (no build of its own)

View File

@@ -1,46 +1,46 @@
--- ---
sidebar_label: Автоматическое обновление sidebar_label: Self Update
--- ---
# Автоматическое обновление # Self Update
## dcr --update ## dcr --update
Автоматическое обновление до последней версии. Загружает бинарный файл (не архив) из раздела «Релизы» на GitHub и заменяет им текущий исполняемый файл. Automatic update to the latest version. Downloads a binary (not an archive) from GitHub Releases and replaces the current executable.
```bash ```bash
dcr --update dcr --update
``` ```
## Как это работает ## How it works
1. DCR определяет текущую платформу и архитектуру 1. DCR detects the current platform and architecture
2. Загружает последнюю версию с `api.github.com/repos/dexoron/dcr/releases/latest` 2. Fetches the latest release from `api.github.com/repos/dexoron/dcr/releases/latest`
3. Сравнивает версии 3. Compares versions
4. Загружает соответствующий ресурс (прямой URL-адрес двоичного файла, а не архива) 4. Downloads the matching asset (direct binary URL, not archive)
5. Заменяет текущий исполняемый файл 5. Replaces the current executable via `self_replace`
## Названия активов ## Asset naming
Шаблон: `dcr-\<triple>.\<ext> ` Pattern: `dcr-\<triple>` or `dcr-\<triple>.exe`
| Платформа | Название актива | | Platform | Asset name |
| -------------- | ------------------------------------- | | -------------- | -------------------------------- |
| Linux x86_64 | `dcr-x86_64-unknown-linux-gnu.tar.gz` | | Linux x86_64 | `dcr-x86_64-unknown-linux-gnu` |
| macOS x86_64 | `dcr-x86_64-apple-darwin.tar.gz` | | macOS x86_64 | `dcr-x86_64-apple-darwin` |
| macOS ARM64 | `dcr-aarch64-apple-darwin.tar.gz` | | macOS ARM64 | `dcr-aarch64-apple-darwin` |
| Windows x86_64 | `dcr-x86_64-pc-windows-msvc.zip` | | Windows x86_64 | `dcr-x86_64-pc-windows-msvc.exe` |
## AUR ## AUR
Если DCR установлен через AUR, `--update` выводит предупреждение: If DCR was installed via AUR, `--update` shows a warning:
``` ```
Обновление через менеджер пакетов: yay/paru -Syu {package_name} или sudo pacman -Syu {package_name} Update via package manager: yay/paru -Syu {package_name} or sudo pacman -Syu {package_name}
``` ```
## Ошибки ## Errors
* Не удалось определить платформу — ошибка * Cannot detect platform — error
* Не удалось скачать релиз — ошибка с URL * Cannot fetch release — error with URL
* Нет прав на запись бинарника — ошибка (нужен `sudo` или ручная установка) * No write permission — error (use `sudo` or manual install)

View File

@@ -1,45 +1,45 @@
--- ---
sidebar_label: Запуск тестов sidebar_label: Running tests
--- ---
# Запуск тестов # Running Tests
## Выполнение ## Execution
```bash ```bash
Тест DCR dcr test
``` ```
Выполняет сборку проекта, а затем компилирует и запускает тестовые файлы из каталога `tests/`. Builds the project, then compiles and runs test files from `tests/`.
## Профили ## Profiles
```bash ```bash
dcr test # debug (по умолчанию) dcr test # debug (default)
dcr test --release # release dcr test --release # release
dcr test --debug # явно debug dcr test --debug # explicit debug
``` ```
## Вывод ## Output
``` ```
===================== =====================
Сводка результатов набора тестов Testsuite summary
===================== =====================
ИСПОЛЬЗОВАНО: 5 TOTAL: 5
ПРОЙДЕНО: 3 PASS: 3
ПРОПУЩЕНО: 1 SKIP: 1
НЕ ПРОЙДЕНО: 1 FAIL: 1
===================== =====================
``` ```
## Код возврата ## Exit code
* 0 — все тесты пройдены (FAIL = 0) * 0 — all tests passed (FAIL = 0)
* 1 — есть упавшие тесты * 1 — test failures or build error
## Что строится ## What gets built
* Все C/C++ файлы из `tests/` * All `.c` files from `tests/` (`.cpp` not supported)
* Include path: `tests/` (для `dcr_test.h`) * Include path: `tests/` (for `dcr_test.h`)
* Линкуется с основным проектом (если `type = "lib"`) * Linked with project if `package.type = "lib"` or `kind = "staticlib"`/`"sharedlib"`

View File

@@ -1,69 +1,69 @@
--- ---
sidebar_label: Тестовая инфраструктура (EXPECT, TEST, ...) sidebar_label: Test framework (EXPECT, TEST, ...)
--- ---
# Тестовая инфраструктура # Test Framework
DCR имеет встроенный минималистичный фреймворк для тестирования на C/C++. DCR has a built-in minimal test framework for C.
## Макросы ## Macros
### `EXPECT(expr, ...)` ### `EXPECT(expr)`
Проверяет, что выражение истинно. Asserts that an expression is true.
```c ```c
EXPECT(1 + 1 == 2); EXPECT(1 + 1 == 2);
EXPECT(ptr != NULL, "ptr should not be NULL"); EXPECT(ptr != NULL);
``` ```
### `SKIP(...)` ### `SKIP(reason)`
Пропускает тест с опциональным сообщением. Skips a test with a message.
```c ```c
SKIP("not implemented on Windows yet"); SKIP("not implemented on Windows");
``` ```
### `TEST(имя)` ### `TEST(name)`
Определяет тест. Defines a test.
```c ```c
TEST(сложение) { TEST(addition) {
EXPECT(1 + 1 == 2); EXPECT(1 + 1 == 2);
EXPECT(2 + 2 == 4); EXPECT(2 + 2 == 4);
} }
``` ```
### `TEST_CASE(name, ...)` ### `TEST_CASE(name)`
Регистрирует тестовый случай. Registers a test case.
```c ```c
TEST_CASE(math, a, b) { TEST_CASE(math) {
EXPECT(a + b == b + a); EXPECT(1 + 1 == 2);
} }
``` ```
## Инициализация ## Initialization
```bash ```bash
dcr test --init dcr test --init
``` ```
Создаются файлы: Creates:
* `tests/dcr_test.h` — заголовочный файл фреймворка * `tests/dcr_test.h` — framework header (do not edit)
* `tests/test.c` — шаблон с примером теста * `tests/test.c` — template with example test
## Структура tests/ ## Structure
``` ```
tests/ tests/
├── dcr_test.h # фреймворк (не редактировать) ├── dcr_test.h # framework (do not edit)
├── test.c # основные тесты ├── test.c # main tests
└── ... # дополнительные .c файлы с тестами └── ... # additional .c test files
``` ```
Компилируются только файлы с расширением `.c` (файлы с расширением `.cpp` не поддерживаются). Only `.c` files are compiled (`.cpp` is not supported).

View File

@@ -8,11 +8,8 @@ sidebar_label: Introduction
<summary>Quick reference</summary> <summary>Quick reference</summary>
```bash ```bash
# Installation (dcrup) # Installation
curl -fsSL https://sh.dcr-tool.ru | sh -s -- self-install curl -fsSL https://dcr.dexoron.su/install.sh | sh
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable # auto: cf → gh → sf → ya
# dcrup install stable --mirror cf # CloudFlare / GitHub / SourceForge / Yandex
# Create a project # Create a project
dcr new my-app dcr new my-app
@@ -54,9 +51,8 @@ dcr gen vscode
* **Incremental builds** — mtime + `.d` headers + SHA256 fingerprint * **Incremental builds** — mtime + `.d` headers + SHA256 fingerprint
* **Parallel compilation** — thread::scope, atomic task queue * **Parallel compilation** — thread::scope, atomic task queue
* **7 backends** — gcc/clang (unix_cc), MSVC/clang-cl (msvc), GAS, NASM, MASM, FASM, LLVM IR * **4 backends** — gcc/clang, MSVC/clang-cl, GAS (ARM), NASM (x86)
* **8 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom, flat-bin * **7 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom
* **Disk images** — optional `[archive]` packs FAT12/16/32 images after build
* **Cross-compilation** — short names and full triples * **Cross-compilation** — short names and full triples
* **Profiles** — debug / release with field overrides * **Profiles** — debug / release with field overrides
* **Workspaces** — multi-package projects with topological sort * **Workspaces** — multi-package projects with topological sort

View File

@@ -4,209 +4,6 @@ sidebar_label: Changelog
# Changelog # Changelog
## 0.9.5 (2026-10-21)
* **Structured CLI output** — shared helpers now provide Cargo-like human, plain, and JSON output modes.
* **Color and diagnostics policy** — `--color`, `NO_COLOR`, `--quiet`, and `--verbose` are applied consistently across commands.
* **Build reporting** — lifecycle events and compiler diagnostics are available as structured JSON events.
* **Output lab** — sandbox scenarios cover help, lifecycle commands, compiler warnings/errors, stream capture, and broken pipes.
## 0.9.1 (2026-09-13)
* **`pkg-config` dependencies** — declare `fmt = { pkg-config = "fmt" }` or multiple package names in `[dependencies]`; DCR applies `.pc` compiler/linker flags and records the resolved package in `dcr.lock`.
* **`dcr add` support for `pkg-config`** — easily add system package dependencies with `dcr add fmt pkg-config:fmt` or `dcr add openssl pkg:openssl,libcrypto`.
* **`dcr tree` & IDE integration** — `pkg-config` packages are marked in `dcr tree` and resolved into compiler flags in `dcr gen` (`compile_commands.json`).
* **Fixed `dcr new` in non-ASCII / spaced paths** — initializing projects from folders with non-ASCII characters or spaces no longer fails validation.
## 0.9.0 (2026-08-31)
* **Download mirrors in `dcrup`** — `--mirror auto|cf|gh|sf|ya` and `DCRUP_MIRROR`.
Default `auto` tries **cf → gh → sf → ya** (CloudFlare CDN, GitHub, SourceForge, Yandex CDN).
* **Complete Path/Git dependencies** — DCR packages from `path` and `git` are built before their consumer. Git sources are cached in `~/.dcr/git`, support `branch`/`tag`/`rev`, and record the exact commit in `dcr.lock`.
* **Build and prebuild modes** — `path` and `git` dependencies can build a DCR package from `dcr.toml` or link existing `include`/`lib`/`libs` artifacts; `mode = "build"` / `"prebuild"` selects explicitly when both forms are present.
* **Prebuilt dependency examples** — documentation now shows the `dcr-math-lib` Git repository and recommended build/prebuilt layouts for both `git` and `path`.
* **Transitive dependency builds and cycle reporting** — DCR recursively builds DCR packages and reports a clear dependency chain for cycles.
* **Bare path arguments for `dcr add`** — `dcr add mylib ../mylib` now works in addition to the explicit `path:` form.
* **Removed `install.sh` / `install.ps1` / `install_bsd.sh`** — superseded by `dcrup`.
## 0.8.5 (2026-08-08)
* **`package.dcr-version`** — optional CLI version pin in `dcr.toml`.
`dcr new` / `dcr init` write 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 with `CompilationDatabase: .dcr` (`# managed by dcr gen`); custom `.clangd` is not overwritten.
* **Helpers** `canonicalize_path`, `atomic_write`, `ensure_dcr_dir`; pure `resolve_artifact_path` via `platform::*`.
* **`dcr new` / `dcr init`** — add `.dcr/` to `.gitignore`.
**Changed (breaking):**
* **`compile_commands.json` moved** 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 clion` launch/run** — use the same artifact path resolver as `project-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 `ldflags` without CLI `--target`; run-arg forwarding; `split_double_dash` unit tests.
### Changed
* **Native builds resolve the host triple** — without `--target` / package `build.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` / man `dcr-run`** — document `--` forwarding.
### Fixed
* **Native artifact paths on Windows and macOS** — without an explicit `--target` / `build.target`, artifacts use `target/\<profile>`, so `dcr run` and flat-bin find the build output.
* Target-specific `ldflags` missing 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 via `fatfs` (`cargo build --features archive`). Release CI builds with the feature; without it `[archive]` fails with a clear message.
* **Tests** — `flat_bin_nasm_build`, package `build.target` without CLI `--target`, stricter workspace `clean --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/member `build.target` is honored (bare-metal / ISO `post_steps` paths).
* **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 local `target/` (shared root `target/`).
* **`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 raw `os 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 binary` in source)
* **GAS / MASM / LLC** — object → `objcopy -O binary` → `\<stem>.bin`
* **C/C++** — objects → freestanding link → `objcopy -O binary` → `\<name>.bin`
* Requires `llvm-objcopy` / `objcopy` / `gobjcopy` except for NASM/FASM direct emit
* **`[archive]` section** — FAT12/16/32 disk images after build (`output`, `format`, `size`, `offset`, `label`, `bootsector`, `layout`). From 0.8.2 requires feature `archive`.
* **Single-file `build.roots`** — a root may be a single source or header file, not only a directory.
### Changed
* **`--force`** also re-runs `build.steps` and `build.post_steps`.
* **`dcr run` on workspace-only root** — if `[run].cmd` is 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 in `src/cli/build.rs` to a reusable, decoupled core build engine.
* **Polymorphic Language Model (`Language` trait)** — introduced the abstract `Language` trait (`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 (`Builder` trait)** — introduced the `Builder` trait to generalize builder invocations (`src/core/build/builder/mod.rs`). Consolidated GCC/Clang logic into `builder/cc_common.rs` and Microsoft Visual C++ logic into `builder/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 in `dcr.toml`.
* **Automatic Workspace Dependency Injection** — during workspace builds, include/lib paths of dependent workspace members (including their source headers, local `include/` folders, and build target `target/include` / `target/lib` folders) are automatically resolved and injected.
* **`BuildReporter` Event 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., in `dcr add`).
* **Path Dependencies Target Include Resolution** — local path dependencies configured via tables now correctly expose headers built and packaged into their `target/include` folder to consumer packages.
* **Modular Integration Test Suite** — refactored the monolith `tests/cli_basic.rs` file 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.rs` module.
* **Workspace-Aware member execution** — `dcr run` executed at the workspace root of a `workspace_only` project now triggers the member build inside the workspace context using the `--workspace` parameter, preventing standalone build issues.
* **Elimination of Global State** — removed global variables and states from the build core, encapsulating build logic inside isolated `BuildContext` structs 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 = true` is set in `dcr.toml`.
* **`dcr lint` command** — C/C++ static analysis via `clang-tidy`. Supports `--fix` for automatic fixes. Respects `build.roots` and `build.src_disable` from config.
* **Three new assembler backends**:
* **MASM** (`compiler = "ml"` / `"ml64"`) — Microsoft Macro Assembler.
* **FASM** (`compiler = "fasm"`) — Flat Assembler.
* **LLVM IR** (`compiler = "llc"`) — compiles `.ll` files via `llc -filetype=obj`.
* **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()` and `home_dir()` extracted to `utils/fs.rs`.
* **Build utilities** — `normalize_target()`, `normalize_kind()`, `normalize_platform()`, `default_profile_flags()` extracted to `utils/build.rs`.
* **Backend helpers** — `asm_lang_flag()`, `source_extensions()`, `elapsed_secs()` added to `core/builder/common.rs`.
* **Full Bare-Metal / Freestanding Automation** — introduced the `build.freestanding = true` configuration option. When enabled (or when a bare-metal target is detected), DCR automatically injects `-ffreestanding` during compilation and both `-nostdlib` and `-static` during linking.
* **Artifact Optimization (LTO & Strip)** — added `build.lto` (auto-injects `-flto` for compiler and linker) and `build.strip` (automatically strips debug symbols via linker `-s` flag) options to `dcr.toml`.
* **Compilation Thread Control** — added the `build.codegen-units` option to strictly limit the maximum number of parallel jobs utilized by the custom `parallel_build` worker 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 if `build.cflags` are overridden.
* **Centralized Bare-Metal Detection** — relocated the `is_bare_metal_target` helper to common build utilities (`src/utils/build.rs`) for unified access across the building core.
* **Architectural Refactoring**:
* Renamed `src/config.rs` to `src/templates.rs`.
* Started consolidation of configuration and build orchestration logic.
## 0.7.3 (2026-06-13)
### Added
* **`--vcs` option for `new` and `init` commands** — 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 `-dirty` suffix if there are uncommitted changes in the DCR repository.
* **Automatic `.gitignore` generation** — Git repository initialization now automatically writes a `.gitignore` file excluding the `/target` directory.
* **Nested repository prevention** — automatic Git initialization is now skipped if `dcr new` or `dcr init` is executed inside an already existing Git repository.
* **VCS verification tests** — added `new_vcs_options_work` and `init_vcs_options_work` integration tests to ensure reliable repository behavior.
### Changed
* **Complete removal of `git2` dependency** — all Git actions (dependency fetching, VCS setup, status checks) are now delegated to the system `git` executable via `Command`. This simplifies compilation and drops the need for `vendored` and `openssl` features.
* **Migrated from `reqwest` to `ureq`** — replaced the heavy `reqwest` crate in `flag_update.rs` with the lightweight synchronous `ureq 2.10` client, reducing overhead and the final binary size.
## 0.7.2 (2026-06-07)
### Added
* `default_target_triple()` now respects `target_env` — Linux (gnu/musl) and Windows (msvc/gnu) use the correct environment instead of hardcoded values.
### Fixed
* **macOS Apple Silicon builds failed with `_main` undefined** — `--target=` is now passed to ldflags, not just cflags. `default_target_triple()` uses `std::env::consts::ARCH` on macOS instead of hardcoded `x86_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) ## 0.7.1 (2026-06-02)
### Added ### Added

View File

@@ -13,7 +13,7 @@ dcr build # debug profile
dcr build --release # release build dcr build --release # release build
dcr build --debug # explicit debug dcr build --debug # explicit debug
dcr build --target aarch64-unknown-linux-gnu dcr build --target aarch64-unknown-linux-gnu
dcr build --force # full rebuild (also re-runs build.steps / post_steps) dcr build --force # full rebuild
dcr build --clean # clean + build dcr build --clean # clean + build
dcr build --verbose # show compilation commands dcr build --verbose # show compilation commands
dcr build --workspace pkg-a # build specific workspace package dcr build --workspace pkg-a # build specific workspace package
@@ -21,8 +21,6 @@ dcr build --workspace pkg-a # build specific workspace package
Artifacts: `target/\<triple>/\<profile>/\<binary-name>` (Linux with explicit target). Artifacts: `target/\<triple>/\<profile>/\<binary-name>` (Linux with explicit target).
With `[archive]` in `dcr.toml`, a FAT disk image is packed after a successful build.
## `dcr run` ## `dcr run`
Builds (if sources are newer than artifacts) and runs the binary. Builds (if sources are newer than artifacts) and runs the binary.
@@ -30,11 +28,8 @@ Builds (if sources are newer than artifacts) and runs the binary.
```bash ```bash
dcr run dcr run
dcr run --release dcr run --release
dcr run --force # force rebuild then run
``` ```
On a **workspace-only** root: if `[run].cmd` is set, that command is used after build; otherwise DCR delegates to a workspace member.
## `dcr clean` ## `dcr clean`
Removes `target/` directory (or `target/\<target>/\<profile>`). Removes `target/` directory (or `target/\<target>/\<profile>`).

View File

@@ -15,8 +15,6 @@ dcr add mylib path:./lib # explicit path prefix
dcr add mylib git:https://github.com/user/repo # explicit git prefix dcr add mylib git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub shorthand dcr add mylib github:user/repo # GitHub shorthand
dcr add mylib gitlab:user/repo # GitLab shorthand dcr add mylib gitlab:user/repo # GitLab shorthand
dcr add fmt pkg-config:fmt # system package via pkg-config
dcr add openssl pkg:openssl,libcrypto # multiple pkg-config packages
``` ```
Source prefixes: Source prefixes:
@@ -25,7 +23,6 @@ Source prefixes:
* `git:` — generic git URL * `git:` — generic git URL
* `github:` — expands to `https://github.com/\<user>/\<repo>` * `github:` — expands to `https://github.com/\<user>/\<repo>`
* `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>` * `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>`
* `pkg-config:` / `pkg:` — one or more packages resolved by `pkg-config`
* `http://` / `https://` / `git@` — full URL * `http://` / `https://` / `git@` — full URL
Flags: Flags:
@@ -34,12 +31,7 @@ Flags:
* `--tag \<name>` — git tag * `--tag \<name>` — git tag
* `--rev \<hash>` — git commit * `--rev \<hash>` — git commit
If source is omitted — DCR searches connected registries. A bare relative or absolute path is accepted as a path dependency. If source is omitted — DCR searches connected registries.
For `pkg-config` dependencies, the referenced packages must already be installed
and provide `.pc` files. DCR invokes `pkg-config` during the build (using
`PATH` and `PKG_CONFIG_PATH`) and forwards the returned compiler and linker
flags; it does not download or build these packages.
## `dcr tree` ## `dcr tree`

View File

@@ -8,7 +8,6 @@ sidebar_label: Contributing
```bash ```bash
git clone https://github.com/dexoron/dcr git clone https://github.com/dexoron/dcr
# or a source mirror: GitVerse / SourceCraft / SourceForge / GitLab (see README)
cd dcr cd dcr
cargo build cargo build
``` ```
@@ -43,11 +42,10 @@ cargo test --all-targets
## CI ## CI
CI runs (see `.github/workflows/ci.yml`): CI runs:
* `cargo fmt --check` * `cargo fmt --check`
* `cargo clippy` (default + `--all-features`) * `cargo clippy --all-targets -- -D warnings`
* `cargo check --all-targets --all-features` * `cargo test --all-targets`
* Unit + integration tests on Linux, macOS, Windows * Build on Linux, macOS, Windows
* Extra Linux job with `--features archive` (FAT images) * Integration tests
* Tools on runners: clang, nasm, clang-format/tidy (Linux)

View File

@@ -39,6 +39,27 @@ which clang
Or specify explicitly via `[toolchain]` in `dcr.toml`. Or specify explicitly via `[toolchain]` in `dcr.toml`.
## openssl-sys build failed
When building DCR from source:
```
error: failed to run custom build command for openssl-sys
```
**Solution:** Install OpenSSL development headers:
```bash
# Ubuntu/Debian
sudo apt install libssl-dev
# Fedora
sudo dnf install openssl-devel
# macOS
brew install openssl
```
## Ctrl+C during build ## Ctrl+C during build
DCR handles SIGINT: interrupts the current compilation and exits with non-zero code. DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
@@ -55,21 +76,6 @@ See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
See [Workspace Recipe](/docs/recipes/multi-package-workspace). See [Workspace Recipe](/docs/recipes/multi-package-workspace).
## Bootloader / pure NASM OS image
Use `kind = "flat-bin"` (NASM `-f bin`) and optional `[archive]` for a FAT disk image.
See [OS-dev recipe](/docs/recipes/os-flat-bin-archive).
## How do I choose a download mirror?
`dcrup install` uses `--mirror auto` by default and tries **cf → gh → sf → ya**.
```bash
dcrup install stable --mirror cf
export DCRUP_MIRROR=ya
```
## Lock file ## Lock file
`dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`. `dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`.

View File

@@ -70,10 +70,3 @@ dcr test # run tests
```bash ```bash
dcr fmt # clang-format with .clang-format dcr fmt # clang-format with .clang-format
``` ```
## Linting
```bash
dcr lint # clang-tidy checks
dcr lint --fix # apply fixes automatically
```

View File

@@ -4,75 +4,28 @@ sidebar_label: Installation
# Installation # Installation
## dcrup (recommended) ## Linux (Dexoron Packages)
Install and switch DCR versions (stable / dev / night, pin `0.8.2`, optional build from source). Configure your package manager at https://pkg.dexoron.su and install:
### Linux / macOS / BSD / Windows (bash) **Arch Linux**
```sh ```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- self-install sudo pacman -Sy dcr
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable
``` ```
Non-interactive install of DCR in one shot: **Debian/Ubuntu**
```sh ```sh
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- install stable sudo apt update && sudo apt install dcr
export PATH="$HOME/.dcr/bin:$PATH"
``` ```
### Windows (PowerShell) **Fedora/RHEL**
```powershell
& ([scriptblock]::Create((irm https://ps1.dcr-tool.ru))) self-install
# $env:Path += ";$env:USERPROFILE\.dcr\bin"
dcrup install stable
```
After `self-install`, the command is **`dcrup`** (no `.sh` / `.ps1`) and is installed in `~/.dcr/bin` (Unix) or `%USERPROFILE%\.dcr\bin` (Windows).
### Common dcrup commands
```sh ```sh
dcrup install stable # latest stable prebuilt (auto: cf → gh → sf → ya) sudo dnf install dcr
dcrup install 0.8.2 # pin → 0.8.2@stable
dcrup install 0.8.2@dev
dcrup install stable --libc musl # Linux: musl asset (default: gnu)
dcrup install stable --mirror cf # CloudFlare CDN
dcrup install stable --mirror ya # Yandex CDN (RU fallback)
dcrup install stable --build # cargo build --features archive
dcrup install night # always build from branch dev HEAD
dcrup default 0.8.2
dcrup update
dcrup list
dcrup show
dcrup which
dcrup uninstall 0.8.2 # remove one installed version
dcrup uninstall --all # remove all installed versions
``` ```
Layout: `~/.dcr/toolchains/\<id>/dcr` and `~/.dcr/bin/dcr` → active version.
### Download mirrors
Prebuilt installs try **cf → gh → sf → ya** unless you pin a host.
| Code | URL | Notes |
| ---- | ------------------------------------------------------------------------------------------------------------ | -------------------------- |
| `cf` | `https://cdn-global.dcr-tool.ru/\<tag>/\<asset>` | CloudFlare CDN (worldwide) |
| `gh` | `https://github.com/dexoron/dcr/releases/download/\<tag>/\<asset>` | GitHub Releases |
| `sf` | `https://sourceforge.net/projects/dcr-tool/files/\<tag>/\<asset>/download` | SourceForge |
| `ya` | `https://cdn-ru.dcr-tool.ru/\<tag>/\<asset>` | Yandex CDN (RU fallback) |
```sh
dcrup install stable --mirror auto # default
export DCRUP_MIRROR=cf # persist for this shell
```
---
## Arch Linux (AUR) ## Arch Linux (AUR)
```sh ```sh
@@ -92,12 +45,11 @@ brew install dcr
sudo snap install dcrup sudo snap install dcrup
``` ```
> If classic Snap Store publishing is unavailable, install the `.snap` from [GitHub Releases](https://github.com/dexoron/dcr/releases/latest) with `--dangerous`.
## Nix (flake) ## Nix (flake)
```sh ```sh
nix run github:dexoron/dcr nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr nix profile install github:dexoron/dcr
``` ```
@@ -107,37 +59,48 @@ nix profile install github:dexoron/dcr
cargo install dcr cargo install dcr
``` ```
Note: crates.io builds may omit optional features. For FAT disk images (`[archive]`), prefer release binaries or: ## Linux / macOS (script)
```sh ```sh
cargo install dcr --features archive curl -fsSL https://dcr.dexoron.su/install.sh | sh
```
## BSD (script)
```sh
curl -fsSL https://dcr.dexoron.su/install_bsd.sh | sh
```
## Windows (PowerShell)
```powershell
irm https://dcr.dexoron.su/install.ps1 | iex
``` ```
## From source ## From source
```sh ```sh
git clone https://github.com/dexoron/dcr.git git clone https://github.com/dexoron/dcr.git
cd dcr cd dcr && cargo build --release
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
``` ```
## Post-install ## Post-install
Verify the installation:
```bash ```bash
dcr --version dcr --version
dcrup show # if installed via dcrup
``` ```
Man pages (package installs / release assets): Man pages are available after installation:
```bash ```bash
man dcr man dcr
man dcr-build man dcr-build
``` ```
Registry (optional) — `~/.dcr/config.toml`: To use the registry, create `~/.dcr/config.toml`:
```toml ```toml
[registry.default] [registry.default]

View File

@@ -6,13 +6,6 @@ sidebar_label: IDE Integration
## VS Code ## VS Code
Install the recommended [DCR extension by Dexoron-Labs](https://marketplace.visualstudio.com/items?itemName=Dexoron-Labs.dcr). Do not install Microsoft C/C++ extensions for DCR projects: DCR uses `clangd`. MS C/C++ is acceptable only when you need its debugger.
Recommended companion extensions:
* [Even Better TOML](https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml)
* [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb), or MS C/C++ for debugger support only
```bash ```bash
dcr gen vscode dcr gen vscode
``` ```

View File

@@ -1,89 +0,0 @@
---
sidebar_label: OS-dev (flat-bin + archive)
---
# Pure ASM / boot image (flat-bin + archive)
Minimal OS-dev style pipeline: assemble raw binaries with NASM, then pack a FAT floppy/image with an optional boot sector.
## Project layout
```
myos/
dcr.toml
src/
boot.asm # boot sector (512 bytes)
kernel.asm # payload
```
For multiple flat artifacts, use a **workspace** (one member per binary) or separate packages; a single `flat-bin` package produces one binary per source stem.
## Boot package (`flat-bin`)
```toml
[package]
name = "boot"
version = "0.1.0"
[build]
language = "asm"
compiler = "nasm"
kind = "flat-bin"
extension = "bin"
roots = ["src/boot.asm"]
```
```bash
dcr build
# → target/<…>/debug/boot.bin (NASM -f bin, no link)
```
## Disk image after build
```toml
[archive]
output = "target/{profile}/disk.img"
format = "fat12"
size = "1440K"
label = "MYOS"
bootsector = "target/{profile}/boot.bin"
[[archive.layout]]
from = "target/{profile}/kernel.bin"
to = "KERNEL.BIN"
```
* `format`: `fat12`, `fat16`, or `fat32`
* `size`: bytes or `K`/`KB`/`M`/`MB`/`G`/`GB` (default ~1.44 MiB)
* `bootsector`: written only when `offset` is omitted or `0`
* `from` may be a glob; `{profile}` is substituted in paths
## C kernel → flat binary
```toml
[build]
language = "c"
compiler = "clang"
kind = "flat-bin"
freestanding = true
filename = "kernel"
extension = "bin"
ldflags = ["-T", "linker.ld"]
```
Pipeline: objects → temporary linked ELF → `objcopy -O binary` → `kernel.bin`. Requires `objcopy` / `llvm-objcopy` in PATH.
## Other assemblers
| Tool | Notes |
| -------- | --------------------------------------------------------------------------------------- |
| **FASM** | Write `format binary` in the source; DCR writes `\<stem>.bin` directly |
| **GAS** | Assemble `.s` → obj → `objcopy -O binary` |
| **LLC** | `language = "llvm_ir"` → obj → objcopy |
| **MASM** | COFF obj → objcopy (needs binutils/LLVM objcopy) |
## Notes
* Single-file `roots` are supported: `roots = ["src/boot.asm"]`.
* `--force` re-runs `build.steps` / `build.post_steps` as well as recompilation.
* Prefer `kind = "elf"` if you need a relocatable ELF kernel without stripping to raw binary.

View File

@@ -56,7 +56,7 @@ moc = "moc {in} -o {out}"
### GAS / NASM / MASM / FASM / LLVM-IR ### GAS / NASM / MASM / FASM / LLVM-IR
* GAS: `-I`, `-c -o`, `--defsym` * GAS: `-I`, `-c -o`, `--defsym`
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32; **`bin` when `kind = "flat-bin"`**) * NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32)
* MASM: `/nologo /c /Fo\<obj> <source>` * MASM: `/nologo /c /Fo\<obj> <source>`
* FASM: `<source> \<output>` (output path is the object file) * FASM: `<source> \<output>` (output path is the object file)
* LLVM IR: `-filetype=obj <source> -o \<output>` * LLVM IR: `-filetype=obj <source> -o \<output>`
@@ -79,7 +79,7 @@ Three levels of incrementality:
## Build Kinds ## Build Kinds
| Kind | Type | Path (Linux example) | | Kind | Type | Path (Linux example) |
| ----------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | | ----------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) | | `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) |
| `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) | | `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) |
| `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) | | `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) |
@@ -87,11 +87,6 @@ Three levels of incrementality:
| `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` | | `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` |
| `none` | Compile only, no link | — | | `none` | Compile only, no link | — |
| `custom` | Full filename+extension control | `target/\<triple>/\<profile>/\<filename>.\<extension>` | | `custom` | Full filename+extension control | `target/\<triple>/\<profile>/\<filename>.\<extension>` |
| `flat-bin` | Raw binary | ASM: `\<stem>.bin` (NASM `-f bin` / FASM / GAS·MASM·LLC via objcopy); C/C++: `\<name>.bin` (link + objcopy) |
## Disk images (`[archive]`)
After a successful build, if `[archive]` is present in `dcr.toml`, DCR formats a FAT volume and copies files from `layout` into the image. See [dcr.toml → archive](/docs/reference/dcr-toml#archive).
## Build Steps ## Build Steps

View File

@@ -1,34 +0,0 @@
---
sidebar_label: CLI output
---
# CLI output (experimental)
The structured output implementation is being developed incrementally.
Currently these global options apply to diagnostics emitted through the logger:
```sh
dcr --output plain build
dcr --output json build
dcr --color never build
dcr --quiet build
dcr --verbose build
```
`--output` accepts `human` (default), `plain`, or `json`.
Diagnostics are written to stderr. JSON diagnostics are newline-delimited objects
with `schema_version: 1`, `event`, and `message` fields. Command statuses use the
shared output helpers, build reporting emits structured lifecycle events, and
compiler output is represented as JSON events with its original stream and text.
The protocol is still experimental: some raw command data and subprocess stdout
remain unstructured.
`--color` accepts `auto`, `always`, or `never`. Automatic coloring requires a
terminal and respects `NO_COLOR`. Plain and JSON diagnostics never add colors.
Quiet mode preserves warnings, errors, and compiler diagnostics; verbose mode
enables debug and trace logging. Arguments following `--` are passed through
unchanged.
Remaining work includes migrating the remaining raw command data and subprocess
stdout, improving progress rendering and contextual errors, and expanding
integration coverage for stdout/stderr and closed pipes.

View File

@@ -57,8 +57,14 @@ dcr build --target aarch64-none-elf
## Target Directory ## Target Directory
By default, the compilation output directories are structured as follows: On Linux with explicit target:
* **Linux and BSD**: Always output to `target/\<triple>/\<profile>/` (using host triple if no target is specified). ```
* **macOS and Windows (without target)**: Output to `target/\<profile>/`. target/<triple>/<profile>/
* **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`. ```
On macOS/Windows or without target:
```
target/<profile>/
```

View File

@@ -33,18 +33,14 @@ Main project configuration file. Located at the project root.
[run] [run]
# run settings # run settings
[archive]
# optional: pack FAT disk image after build
``` ```
## [package] ## [package]
| Field | Required | Description | | Field | Required | Description |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------- | | --------- | -------- | ------------------------------------------- |
| `name` | yes | Project name | | `name` | yes | Project name |
| `version` | yes | Semantic version of the **project** | | `version` | yes | Semantic version |
| `dcr-version` | no | Semver of the **dcr tool** this project targets. Written by `dcr new` / `dcr init` to the current tool version. |
| `type` | no | `app`, `lib`, `none` (defaults to `"none"`) | | `type` | no | `app`, `lib`, `none` (defaults to `"none"`) |
| `license` | no | SPDX license identifier | | `license` | no | SPDX license identifier |
| `author` | no | Author | | `author` | no | Author |
@@ -53,26 +49,11 @@ Main project configuration file. Located at the project root.
[package] [package]
name = "my-app" name = "my-app"
version = "0.1.0" version = "0.1.0"
dcr-version = "0.8.4"
type = "app" type = "app"
license = "MIT" license = "MIT"
author = "John Doe" author = "John Doe"
``` ```
### `package.dcr-version`
Optional pin of the DCR CLI the project was written for. On every `dcr.toml` load:
| Situation | Behaviour |
| ------------------------------ | ---------------------------------------------------------- |
| Field missing / empty | Warning: add `dcr-version` (set by `dcr new` / `dcr init`) |
| Running dcr **older** than pin | Warning: upgrade dcr (`dcr --update`) |
| Running dcr **newer** than pin | Warning: review changelog, bump the pin when ready |
| Equal | Silent |
| Invalid semver | Warning once, field ignored |
Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) are ignored for comparison (`1.0.0-dev` ≡ `1.0.0`).
## [build] ## [build]
... ...
@@ -80,19 +61,19 @@ Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) ar
* `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`. * `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`.
| Field | Default | Description | | Field | Default | Description |
| ---------------- | ------------- | --------------------------------------------------------------------------------------------------------- | | ---------------- | ------------- | ---------------------------------------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) | | `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"` (optional, defaults to `"c"`) |
| `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) | | `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) |
| `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) | | `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) |
| `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) | | `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom`, `flat-bin` | | `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom` |
| `target` | host | Target triple for cross-compilation | | `target` | host | Target triple for cross-compilation |
| `platform` | `"native"` | `native`, `efi` | | `platform` | `"native"` | `native`, `efi` |
| `cflags` | `[]` | Additional C/C++/ASM flags | | `cflags` | `[]` | Additional C/C++/ASM flags |
| `ldflags` | `[]` | Additional linker flags | | `ldflags` | `[]` | Additional linker flags |
| `filename` | `""` | Custom output file name | | `filename` | `""` | Custom output file name |
| `extension` | `""` | Custom file extension (for `flat-bin`, default is `bin`) | | `extension` | `""` | Custom file extension |
| `roots` | `["src"]` | Source roots: directories and/or individual source/header files | | `roots` | `["src"]` | Source root directories |
| `exclude` | `[]` | Exclude patterns | | `exclude` | `[]` | Exclude patterns |
| `include` | `[]` | Additional include directories | | `include` | `[]` | Additional include directories |
| `src_disable` | `false` | Disable auto source discovery | | `src_disable` | `false` | Disable auto source discovery |
@@ -112,16 +93,11 @@ Never fails the command — warnings only. Pre-release suffixes (`1.0.0-dev`) ar
Settings from raw config (not in typed struct): Settings from raw config (not in typed struct):
* `pkg_config` — list of packages queried for build-wide compiler/linker flags * `pkg_config` — list of pkg-config packages
Dependencies can also declare a system package directly, for example
`fmt = { pkg-config = "fmt" }`. This records the package in `dcr.lock` and applies
the flags returned by `pkg-config --cflags` and `pkg-config --libs`.
* `ldscript` — linker script path * `ldscript` — linker script path
* `build.steps` / `build.post_steps` — codegen steps * `build.steps` / `build.post_steps` — codegen steps
## Per-language overrides: `[build.c]`, `[build.cxx]`, `[build.asm]`, `[build.llvm_ir]` ## Per-language overrides: `[build.c]`, `[build.cxx]`, `[build.asm]`
Each language can have its own table that overrides the flat `[build]` settings: Each language can have its own table that overrides the flat `[build]` settings:
@@ -141,9 +117,6 @@ compiler = "g++"
[build.asm] [build.asm]
compiler = "nasm" compiler = "nasm"
flags = ["-felf64"] flags = ["-felf64"]
[build.llvm_ir]
compiler = "llc"
``` ```
The flat `[build]` acts as fallback; per-language tables take precedence for their language. The flat `[build]` acts as fallback; per-language tables take precedence for their language.
@@ -201,84 +174,3 @@ Default `cmd` = `./target/{profile}/{name}` (macOS/Windows) or `./target/\<tripl
## [workspace] ## [workspace]
See [workspaces](/docs/reference/workspaces). See [workspaces](/docs/reference/workspaces).
## [archive]
Optional post-build step: format a FAT volume and copy built artifacts into a disk image. Runs after a successful package build (and after workspace member builds that define `[archive]`).
Requires DCR built with the `archive` Cargo feature (`cargo build --features archive`). Release binaries include this feature.
| Field | Required | Description |
| ------------ | -------- | ------------------------------------------------------------------------------------------- |
| `output` | yes | Image path relative to project root (`{profile}` allowed) |
| `format` | yes | `fat12`, `fat16`, or `fat32` |
| `size` | no | Image size: bytes or `K`/`KB`/`M`/`MB`/`G`/`GB` (default `1474560` ≈ 1.44 MiB) |
| `offset` | no | Byte offset of the FAT volume inside the image (default `0`) |
| `label` | no | Volume label (max 11 chars, default `VOLUME`) |
| `bootsector` | no | Path to a 512-byte boot sector written at offset 0 when `offset` is 0 (`{profile}` allowed) |
| `layout` | no | List of `{ from, to }` entries (files or globs → path inside the volume) |
```toml
[archive]
output = "target/{profile}/disk.img"
format = "fat12"
size = "1440K"
label = "MYOS"
bootsector = "target/{profile}/boot.bin"
[[archive.layout]]
from = "target/{profile}/kernel.bin"
to = "KERNEL.BIN"
[[archive.layout]]
from = "assets/*"
to = "/"
```
Typical pairing with `kind = "flat-bin"` (NASM `-f bin`) for bootloaders and pure-ASM OS images.
## `flat-bin` (kind)
Produces a raw binary (default extension `bin`) for boot sectors, kernels, and freestanding payloads.
### Assemblers
| Tool | Language / compiler | How flat-bin is produced |
| ---- | ------------------------------------------ | -------------------------------------------- |
| NASM | `language = "asm"`, `compiler = "nasm"` | `-f bin` → `\<stem>.bin` |
| FASM | `compiler = "fasm"` | direct write (use `format binary` in source) |
| GAS | `compiler = "as"` / `"gas"` | assemble → `objcopy -O binary` |
| MASM | `compiler = "ml"` / `"ml64"` | assemble → `objcopy -O binary` |
| LLC | `language = "llvm_ir"`, `compiler = "llc"` | `-filetype=obj` → `objcopy -O binary` |
```toml
[build]
language = "asm"
compiler = "nasm"
kind = "flat-bin"
extension = "bin"
roots = ["src/boot.asm"]
```
### C / C++
Compile all sources, link with `-nostdlib -static` (plus your `ldflags` / `ldscript`), then convert the intermediate ELF/PE with `objcopy -O binary` to `\<filename|name>.bin`.
```toml
[build]
language = "c"
compiler = "clang"
kind = "flat-bin"
freestanding = true
filename = "kernel"
extension = "bin"
ldscript = "linker.ld"
ldflags = ["-T", "linker.ld"]
```
Notes:
* Multi-file **ASM** packages emit one `\<stem>.bin` per source; **C/C++** emit a single project binary.
* `objcopy` tools tried in order: `llvm-objcopy`, `objcopy`, `gobjcopy`.
* Incompatible with `build.qt = true`.
* `dcr run` rejects `flat-bin` (not a host executable).

View File

@@ -6,7 +6,7 @@ sidebar_label: Dependencies
## Formats ## Formats
The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies: The `[dependencies]` section supports three formats:
### String (registry) ### String (registry)
@@ -23,10 +23,10 @@ The version string is used as-is for registry lookup.
```toml ```toml
[dependencies] [dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0" } fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
``` ```
Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`. Fields: `git`, `branch`, `tag`, `rev`.
### Table (path) ### Table (path)
@@ -35,32 +35,6 @@ Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`.
mylib = { path = "../mylib" } mylib = { path = "../mylib" }
``` ```
For a prebuilt external library, specify its layout explicitly. The three
arrays are paths relative to the dependency root (`include`, `lib`) and linker
names (`libs`):
```toml
[dependencies]
dcr-math = { path = "../deps/dcr-math", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
### Table (`pkg-config`)
Use an installed `.pc` package when the library is provided by the operating system
or another system package manager. DCR invokes `pkg-config --cflags` and
`pkg-config --libs`, preserving include, library, linker, and other flags:
```toml
[dependencies]
fmt = { pkg-config = "fmt" }
openssl = { pkg-config = ["openssl", "libcrypto"] }
```
The `pkg-config` executable must be available in `PATH`. The named `.pc` files must
be available through pkg-config's standard search paths or via `PKG_CONFIG_PATH`.
These dependencies are not downloaded or built by DCR; they are recorded in
`dcr.lock` with a `pkg-config+...` source.
## Registry ## Registry
DCR uses a package registry for dependency lookup by name. DCR uses a package registry for dependency lookup by name.
@@ -68,7 +42,7 @@ DCR uses a package registry for dependency lookup by name.
```toml ```toml
# ~/.dcr/config.toml # ~/.dcr/config.toml
[registry.default] [registry.default]
url = "https://index.dcr.dexoron.tech" url = "https://index.dcr.pm"
priority = 1 priority = 1
``` ```
@@ -76,23 +50,7 @@ Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrid
## Git dependencies ## Git dependencies
Git dependencies are cloned into `~/.dcr/git/`; their exact checked-out commit is written to `dcr.lock`. Git dependencies are parsed and recorded in `dcr.lock`. DCR supports specifying branch/tag/rev for git sources:
Both Git and path dependencies have two modes:
* **DCR package:** the source has `dcr.toml`. DCR builds it before the consumer and uses the package name from its manifest for linking.
* **Prebuilt library:** it provides existing headers and binaries through `include`, `lib`, and `libs`. DCR passes them to the compiler/linker without building the dependency.
The mode is normally detected automatically. Use `mode = "build"` or `mode = "prebuild"` when a source contains both a manifest and prebuilt artifacts and you need to choose explicitly.
`dcr-math-lib` publishes both forms. Select its prebuilt library explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
DCR supports specifying branch/tag/rev for git sources:
* `branch` — switch to a branch * `branch` — switch to a branch
* `tag` — switch to a tag * `tag` — switch to a tag
@@ -101,7 +59,7 @@ DCR supports specifying branch/tag/rev for git sources:
## Path dependencies ## Path dependencies
Local paths may point at a DCR package or a prebuilt external library. A path DCR package is built before its consumer, including its own path/git dependencies. DCR detects dependency cycles. A prebuilt library is never built by DCR; it is linked from the directories declared in its dependency entry. Local paths. DCR automatically discovers include and lib directories from the neighbor's `dcr.toml`.
```toml ```toml
[dependencies] [dependencies]
@@ -109,51 +67,16 @@ mylib = { path = "/abs/path/to/lib" }
mylib = { path = "../relative/path" } mylib = { path = "../relative/path" }
``` ```
For DCR packages, the package name from `dcr.toml` is used for linking (so the dependency key may differ from the library name). Header resolution includes the packaged `target/include` directory and link search includes `target/lib`.
### Recommended library layouts
Buildable DCR library:
```text
dcr-math-lib/
├── dcr.toml
└── src/
├── dcr_math.c
└── dcr_math.h
```
Prebuilt library:
```text
dcr-math-lib/
├── include/
│ └── dcr_math.h
└── lib/
└── libdcr-math.a # or .so / .lib
```
`libs` contains linker names without the `lib` prefix and file extension: use
`["dcr-math"]` for `libdcr-math.a`.
If one repository contains both forms, keep the prebuilt files in `include/` and `lib/` and select the mode explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
For a local copy, replace `git` with `path = "../dcr-math-lib"`. In `prebuild` mode DCR does not run the dependency build, even when `dcr.toml` is present.
## dcr.lock ## dcr.lock
Dependency lock file. Contains package names and sources. Dependency lock file. Contains package names and sources.
Created during `dcr build` for resolved registry, path, and Git dependencies. Not updated during `dcr add` — only on the next `dcr build`. Created during `dcr build` when registry dependencies are present. Not updated during `dcr add` — only on the next `dcr build`.
## Resolution process ## Resolution process
1. Resolve dependency sources (registry → git → path) 1. Load all dependencies (registry → git → path)
2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref 2. For path deps: recursively read their `dcr.toml`
3. Build DCR package dependencies recursively 3. For registry deps: search `index.json`
4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler 4. For git deps: clone to cache
5. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler

View File

@@ -58,27 +58,3 @@ export DCR_INDEX_PATH=/custom/path/index.json
``` ```
Default: `~/.dcr/index.json`. Default: `~/.dcr/index.json`.
## DCRUP_MIRROR
Download mirror for `dcrup` (prebuilt binaries only).
```bash
export DCRUP_MIRROR=auto # cf → gh → sf → ya (default)
export DCRUP_MIRROR=cf # CloudFlare CDN
export DCRUP_MIRROR=gh # GitHub Releases
export DCRUP_MIRROR=sf # SourceForge
export DCRUP_MIRROR=ya # Yandex CDN (RU fallback)
```
CLI override: `dcrup install stable --mirror cf`.
## DCRUP_HOME / DCRUP_BIN / DCRUP_REPO
Installer layout and source clone URL:
```bash
export DCRUP_HOME=~/.dcr
export DCRUP_BIN=~/.dcr/bin
export DCRUP_REPO=https://github.com/dexoron/dcr
```

View File

@@ -11,18 +11,17 @@ DCR normalizes target triples. Short platform names are expanded to full triples
### Linux ### Linux
``` ```
target/<arch>-unknown-linux-<env>/<profile>/ target/<arch>-unknown-linux-gnu/<profile>/
``` ```
Architectures: `x86_64`, `aarch64`, `i686`, `armv7`, `riscv64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
Environments: `gnu` (default), `musl`.
Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib). Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib).
### macOS ### macOS
``` ```
target/<profile>/ (default) or target/<triple>/<profile>/ (with target) target/<profile>/
``` ```
Architectures: `x86_64`, `aarch64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
@@ -32,11 +31,10 @@ Extensions: `.dylib` (sharedlib), `.a` (staticlib).
### Windows ### Windows
``` ```
target/<profile>/ (default) or target/<triple>/<profile>/ (with target) target/<profile>/
``` ```
Architectures: `x86_64`, `aarch64`. Architectures: `x86_64`, `aarch64`.
Environments: `msvc` (default), `gnu` (MinGW).
Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI). Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI).

View File

@@ -43,10 +43,7 @@ dcr build # build all packages in dependency order
dcr build --workspace app # build only app (dependencies built automatically) dcr build --workspace app # build only app (dependencies built automatically)
``` ```
When building a workspace, DCR automatically injects include and library paths of dependent workspace members: When building a workspace, member outputs (libraries) are automatically added to include/lib paths of dependent packages.
* **Include Paths**: Automatically resolves and injects header directories of dependencies, including the member's `src/` directory, local `include/` directory, and the packaged `target/include` directory.
* **Library Paths**: Injects compiled library search paths (`target/lib` as well as target-specific build folders) to allow automatic linking with member libraries.
## Clean ## Clean