192 Commits

Author SHA1 Message Date
87406928ff New translations cli-output.mdx (Ukrainian)
[ci skip]
2026-10-21 21:18:45 +08:00
78ad3bf3d8 New translations installation.mdx (Ukrainian)
[ci skip]
2026-10-21 21:18:43 +08:00
0d8830edc5 New translations changelog.mdx (Ukrainian)
[ci skip]
2026-10-21 21:18:40 +08:00
b087f24b83 New translations cli-output.mdx (Russian)
[ci skip]
2026-10-21 21:18:36 +08:00
238aaae9d4 New translations installation.mdx (Russian)
[ci skip]
2026-10-21 21:18:33 +08:00
4bc037a159 New translations changelog.mdx (Russian)
[ci skip]
2026-10-21 21:18:30 +08:00
400f1d0e7b New translations cli-output.mdx (Polish)
[ci skip]
2026-10-21 21:18:26 +08:00
471a008721 New translations installation.mdx (Polish)
[ci skip]
2026-10-21 21:18:23 +08:00
5610b5de38 New translations changelog.mdx (Polish)
[ci skip]
2026-10-21 21:18:20 +08:00
bc55b9f50a New translations cli-output.mdx (German)
[ci skip]
2026-10-21 21:18:17 +08:00
7fbf5e466f New translations installation.mdx (German)
[ci skip]
2026-10-21 21:18:14 +08:00
86c0154c93 New translations changelog.mdx (German)
[ci skip]
2026-10-21 21:18:11 +08:00
000ad89798 New translations dcr-toml.mdx (Ukrainian)
[ci skip]
2026-09-13 15:12:45 +08:00
2c7ca13775 New translations dcr-toml.mdx (Russian)
[ci skip]
2026-09-13 15:12:42 +08:00
8fd2dd00d2 New translations dcr-toml.mdx (Polish)
[ci skip]
2026-09-13 15:12:39 +08:00
8c3fbf4d80 New translations dcr-toml.mdx (German)
[ci skip]
2026-09-13 15:12:36 +08:00
cd566872db New translations dependencies.mdx (Ukrainian)
[ci skip]
2026-09-13 15:12:33 +08:00
864cd0565e New translations dependency-commands.mdx (Ukrainian)
[ci skip]
2026-09-13 15:12:30 +08:00
706131ea57 New translations changelog.mdx (Ukrainian)
[ci skip]
2026-09-13 15:12:28 +08:00
0b461ac906 New translations dependencies.mdx (Russian)
[ci skip]
2026-09-13 15:12:24 +08:00
2a777d1124 New translations dependency-commands.mdx (Russian)
[ci skip]
2026-09-13 15:12:22 +08:00
3200d7f719 New translations changelog.mdx (Russian)
[ci skip]
2026-09-13 15:12:19 +08:00
543099e934 New translations dependencies.mdx (Polish)
[ci skip]
2026-09-13 15:12:16 +08:00
07e8776bf8 New translations dependency-commands.mdx (Polish)
[ci skip]
2026-09-13 15:12:13 +08:00
e516f17704 New translations changelog.mdx (Polish)
[ci skip]
2026-09-13 15:12:10 +08:00
2bc37d5960 New translations dependencies.mdx (German)
[ci skip]
2026-09-13 15:12:07 +08:00
ddd06b4b06 New translations dependency-commands.mdx (German)
[ci skip]
2026-09-13 15:12:05 +08:00
46356739e9 New translations changelog.mdx (German)
[ci skip]
2026-09-13 15:12:02 +08:00
80c87539f5 New translations dependencies.mdx (Ukrainian)
[ci skip]
2026-08-31 15:09:11 +08:00
dee16616e4 New translations dependency-commands.mdx (Ukrainian)
[ci skip]
2026-08-31 15:09:08 +08:00
9181276bde New translations changelog.mdx (Ukrainian)
[ci skip]
2026-08-31 15:09:06 +08:00
0ca083a6c0 New translations dependencies.mdx (Russian)
[ci skip]
2026-08-31 15:09:02 +08:00
95fe4eab02 New translations dependency-commands.mdx (Russian)
[ci skip]
2026-08-31 15:08:59 +08:00
bf0d38e2e9 New translations changelog.mdx (Russian)
[ci skip]
2026-08-31 15:08:56 +08:00
3ffe6eeca9 New translations dependencies.mdx (Polish)
[ci skip]
2026-08-31 15:08:53 +08:00
51439a79a0 New translations dependency-commands.mdx (Polish)
[ci skip]
2026-08-31 15:08:50 +08:00
0820574db6 New translations changelog.mdx (Polish)
[ci skip]
2026-08-31 15:08:48 +08:00
2857bfa058 New translations dependencies.mdx (German)
[ci skip]
2026-08-31 15:08:44 +08:00
790c4933fa New translations dependency-commands.mdx (German)
[ci skip]
2026-08-31 15:08:42 +08:00
396412048f New translations changelog.mdx (German)
[ci skip]
2026-08-31 15:08:39 +08:00
01f76fe052 New translations environment-variables.mdx (Ukrainian)
[ci skip]
2026-08-13 13:07:10 +08:00
bee6a4a2e8 New translations installation.mdx (Ukrainian)
[ci skip]
2026-08-13 13:07:07 +08:00
ac5e2d9785 New translations faq.mdx (Ukrainian)
[ci skip]
2026-08-13 13:07:05 +08:00
ac6fa37097 New translations contributing.mdx (Ukrainian)
[ci skip]
2026-08-13 13:07:02 +08:00
a1118ca7da New translations readme.mdx (Ukrainian)
[ci skip]
2026-08-13 13:07:00 +08:00
57a1247871 New translations environment-variables.mdx (Russian)
[ci skip]
2026-08-13 13:06:57 +08:00
f7ccafaa35 New translations installation.mdx (Russian)
[ci skip]
2026-08-13 13:06:54 +08:00
a629fb43b8 New translations faq.mdx (Russian)
[ci skip]
2026-08-13 13:06:52 +08:00
19a4f20bb2 New translations contributing.mdx (Russian)
[ci skip]
2026-08-13 13:06:49 +08:00
19eada9e9f New translations readme.mdx (Russian)
[ci skip]
2026-08-13 13:06:47 +08:00
369db6a14c New translations environment-variables.mdx (Polish)
[ci skip]
2026-08-13 13:06:44 +08:00
cd38d36eb9 New translations installation.mdx (Polish)
[ci skip]
2026-08-13 13:06:42 +08:00
68b779fa94 New translations faq.mdx (Polish)
[ci skip]
2026-08-13 13:06:39 +08:00
7760a7ba76 New translations contributing.mdx (Polish)
[ci skip]
2026-08-13 13:06:37 +08:00
1827f312c0 New translations readme.mdx (Polish)
[ci skip]
2026-08-13 13:06:34 +08:00
abd78ad7c8 New translations environment-variables.mdx (German)
[ci skip]
2026-08-13 13:06:31 +08:00
18952378e4 New translations installation.mdx (German)
[ci skip]
2026-08-13 13:06:29 +08:00
b9b457ebad New translations faq.mdx (German)
[ci skip]
2026-08-13 13:06:26 +08:00
e80fd0b62c New translations contributing.mdx (German)
[ci skip]
2026-08-13 13:06:24 +08:00
e2b9f1ffa7 New translations readme.mdx (German)
[ci skip]
2026-08-13 13:06:21 +08:00
1c43af2234 New translations changelog.mdx (Ukrainian)
[ci skip]
2026-08-13 13:06:19 +08:00
715ecba2bb New translations changelog.mdx (Russian)
[ci skip]
2026-08-13 13:06:16 +08:00
c3b769c0ae New translations changelog.mdx (Polish)
[ci skip]
2026-08-13 13:06:13 +08:00
cc01cf4c2f New translations changelog.mdx (German)
[ci skip]
2026-08-13 13:06:10 +08:00
06462adf69 New translations ide-integration.mdx (Ukrainian)
[ci skip]
2026-08-12 18:02:47 +08:00
77327244ee New translations ide-integration.mdx (Russian)
[ci skip]
2026-08-12 18:02:44 +08:00
16a1a01dc5 New translations ide-integration.mdx (Polish)
[ci skip]
2026-08-12 18:02:41 +08:00
828649caa7 New translations ide-integration.mdx (German)
[ci skip]
2026-08-12 18:02:39 +08:00
59a7cb6b8c New translations dcr-toml.mdx (Ukrainian)
[ci skip]
2026-08-08 15:03:14 +08:00
e90eda5fa8 New translations dcr-toml.mdx (Russian)
[ci skip]
2026-08-08 15:03:11 +08:00
820114d7d8 New translations dcr-toml.mdx (Polish)
[ci skip]
2026-08-08 15:03:08 +08:00
46c7607b62 New translations dcr-toml.mdx (German)
[ci skip]
2026-08-08 15:03:06 +08:00
ffcc245cec New translations changelog.mdx (Ukrainian)
[ci skip]
2026-08-08 15:03:03 +08:00
f0a0da18b0 New translations changelog.mdx (Russian)
[ci skip]
2026-08-08 15:02:59 +08:00
7a64c2e944 New translations changelog.mdx (Polish)
[ci skip]
2026-08-08 15:02:56 +08:00
098724a1ea New translations changelog.mdx (German)
[ci skip]
2026-08-08 15:02:53 +08:00
ba810d2d98 New translations changelog.mdx (Ukrainian)
[ci skip]
2026-08-05 21:37:42 +08:00
61ad537055 New translations changelog.mdx (Russian)
[ci skip]
2026-08-05 21:37:39 +08:00
59f0a80ff5 New translations changelog.mdx (Polish)
[ci skip]
2026-08-05 21:37:35 +08:00
20bca3b66b New translations changelog.mdx (German)
[ci skip]
2026-08-05 21:37:32 +08:00
e1b32a5161 New translations changelog.mdx (Ukrainian)
[ci skip]
2026-08-03 21:38:13 +08:00
85783ff981 New translations changelog.mdx (Russian)
[ci skip]
2026-08-03 21:38:10 +08:00
199f663d1b New translations changelog.mdx (Polish)
[ci skip]
2026-08-03 21:38:06 +08:00
c68f639e61 New translations changelog.mdx (German)
[ci skip]
2026-08-03 21:38:03 +08:00
19aee3e079 New translations contributing.mdx (Ukrainian)
[ci skip]
2026-07-24 19:40:52 +08:00
4b061dae37 New translations changelog.mdx (Ukrainian)
[ci skip]
2026-07-24 19:40:50 +08:00
e294cc47e6 New translations readme.mdx (Ukrainian)
[ci skip]
2026-07-24 19:40:47 +08:00
81ae976c15 New translations contributing.mdx (Russian)
[ci skip]
2026-07-24 19:40:45 +08:00
587d6aeb80 New translations changelog.mdx (Russian)
[ci skip]
2026-07-24 19:40:42 +08:00
0e7825ab77 New translations readme.mdx (Russian)
[ci skip]
2026-07-24 19:40:39 +08:00
b9a53bbed1 New translations contributing.mdx (Polish)
[ci skip]
2026-07-24 19:40:36 +08:00
12950b0c46 New translations changelog.mdx (Polish)
[ci skip]
2026-07-24 19:40:34 +08:00
5ba6d07847 New translations readme.mdx (Polish)
[ci skip]
2026-07-24 19:40:31 +08:00
cd33597a8a New translations contributing.mdx (German)
[ci skip]
2026-07-24 19:40:28 +08:00
81ac949d6d New translations changelog.mdx (German)
[ci skip]
2026-07-24 19:40:26 +08:00
9487b10e2d New translations readme.mdx (German)
[ci skip]
2026-07-24 19:40:22 +08:00
9cf6223fcf New translations dcr-toml.mdx (Ukrainian)
[ci skip]
2026-07-24 19:40:20 +08:00
ceddc3bb5c New translations dcr-toml.mdx (Russian)
[ci skip]
2026-07-24 19:40:17 +08:00
82de6e8c60 New translations dcr-toml.mdx (Polish)
[ci skip]
2026-07-24 19:40:14 +08:00
6badcb7465 New translations dcr-toml.mdx (German)
[ci skip]
2026-07-24 19:40:11 +08:00
60a14c7a4c New translations installation.mdx (Ukrainian)
[ci skip]
2026-07-24 19:40:07 +08:00
72e7a4c7ad New translations installation.mdx (Russian)
[ci skip]
2026-07-24 19:40:05 +08:00
a0216a8fb0 New translations installation.mdx (Polish)
[ci skip]
2026-07-24 19:40:02 +08:00
9c9a66d0fe New translations installation.mdx (German)
[ci skip]
2026-07-24 19:40:00 +08:00
47d88d13ff New translations os-flat-bin-archive.mdx (Ukrainian)
[ci skip]
2026-07-21 18:19:02 +08:00
f56f23b501 New translations platform-support.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:59 +08:00
fc75d6239a New translations cross-compilation.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:57 +08:00
edf1c6d181 New translations build-system.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:54 +08:00
f104472a7e New translations first-steps.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:52 +08:00
39a99e85fd New translations workspaces.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:49 +08:00
42c5cbe97e New translations dependencies.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:47 +08:00
9a18dae5fd New translations dcr-toml.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:44 +08:00
7287af6a84 New translations faq.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:41 +08:00
f1b66c511d New translations contributing.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:39 +08:00
fd6077ff74 New translations build-commands.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:36 +08:00
983ca31a0e New translations changelog.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:34 +08:00
0fcfc41f1b New translations readme.mdx (Ukrainian)
[ci skip]
2026-07-21 18:18:31 +08:00
a0da1bc328 New translations os-flat-bin-archive.mdx (Russian)
[ci skip]
2026-07-21 18:18:28 +08:00
d334d2bcb3 New translations platform-support.mdx (Russian)
[ci skip]
2026-07-21 18:18:25 +08:00
781081f791 New translations cross-compilation.mdx (Russian)
[ci skip]
2026-07-21 18:18:23 +08:00
80355ab713 New translations build-system.mdx (Russian)
[ci skip]
2026-07-21 18:18:20 +08:00
5aee983fd4 New translations first-steps.mdx (Russian)
[ci skip]
2026-07-21 18:18:18 +08:00
1cb585b2b2 New translations contributing.mdx (Russian)
[ci skip]
2026-07-21 18:18:15 +08:00
638f26c5df New translations build-commands.mdx (Russian)
[ci skip]
2026-07-21 18:18:13 +08:00
054e715b06 New translations changelog.mdx (Russian)
[ci skip]
2026-07-21 18:18:10 +08:00
1960f354ef New translations readme.mdx (Russian)
[ci skip]
2026-07-21 18:18:07 +08:00
e41b69f0e2 New translations os-flat-bin-archive.mdx (Polish)
[ci skip]
2026-07-21 18:18:05 +08:00
c10fbccfef New translations platform-support.mdx (Polish)
[ci skip]
2026-07-21 18:18:02 +08:00
52dd403065 New translations cross-compilation.mdx (Polish)
[ci skip]
2026-07-21 18:18:00 +08:00
39f6817481 New translations build-system.mdx (Polish)
[ci skip]
2026-07-21 18:17:57 +08:00
3caa5e0fc8 New translations first-steps.mdx (Polish)
[ci skip]
2026-07-21 18:17:54 +08:00
bb5be69f89 New translations contributing.mdx (Polish)
[ci skip]
2026-07-21 18:17:52 +08:00
20d7c33440 New translations build-commands.mdx (Polish)
[ci skip]
2026-07-21 18:17:49 +08:00
8579a22127 New translations changelog.mdx (Polish)
[ci skip]
2026-07-21 18:17:47 +08:00
c2e66576d5 New translations readme.mdx (Polish)
[ci skip]
2026-07-21 18:17:44 +08:00
e011803ad7 New translations os-flat-bin-archive.mdx (German)
[ci skip]
2026-07-21 18:17:42 +08:00
ea96f279cc New translations platform-support.mdx (German)
[ci skip]
2026-07-21 18:17:39 +08:00
5f80e65b4c New translations cross-compilation.mdx (German)
[ci skip]
2026-07-21 18:17:37 +08:00
91bc295f41 New translations build-system.mdx (German)
[ci skip]
2026-07-21 18:17:34 +08:00
6c23a8316a New translations first-steps.mdx (German)
[ci skip]
2026-07-21 18:17:32 +08:00
d50ae819f8 New translations contributing.mdx (German)
[ci skip]
2026-07-21 18:17:29 +08:00
084059d414 New translations build-commands.mdx (German)
[ci skip]
2026-07-21 18:17:27 +08:00
92f02abfd3 New translations changelog.mdx (German)
[ci skip]
2026-07-21 18:17:24 +08:00
f9ad515f4c New translations readme.mdx (German)
[ci skip]
2026-07-21 18:17:21 +08:00
5222038639 New translations workspaces.mdx (Russian)
[ci skip]
2026-07-21 18:17:19 +08:00
5fabc5b432 New translations workspaces.mdx (Polish)
[ci skip]
2026-07-21 18:17:16 +08:00
18736a544a New translations workspaces.mdx (German)
[ci skip]
2026-07-21 18:17:14 +08:00
fc6edd6a56 New translations dependencies.mdx (Russian)
[ci skip]
2026-07-21 18:17:11 +08:00
493da800bf New translations dependencies.mdx (Polish)
[ci skip]
2026-07-21 18:17:09 +08:00
ccc4749eb8 New translations dependencies.mdx (German)
[ci skip]
2026-07-21 18:17:06 +08:00
533874a331 New translations dcr-toml.mdx (Russian)
[ci skip]
2026-07-21 18:17:03 +08:00
87b9828511 New translations dcr-toml.mdx (Polish)
[ci skip]
2026-07-21 18:17:00 +08:00
4901ad59d6 New translations dcr-toml.mdx (German)
[ci skip]
2026-07-21 18:16:58 +08:00
e42fc593c5 New translations faq.mdx (Russian)
[ci skip]
2026-07-21 18:16:55 +08:00
3b6aca3560 New translations faq.mdx (Polish)
[ci skip]
2026-07-21 18:16:52 +08:00
5b1f774ac6 New translations faq.mdx (German)
[ci skip]
2026-07-21 18:16:49 +08:00
e72bc4e778 New translations workspaces.mdx (Ukrainian)
[ci skip]
2026-07-18 20:13:09 +08:00
57cff02e58 New translations workspaces.mdx (Russian)
[ci skip]
2026-07-18 20:13:06 +08:00
6157f1d860 New translations workspaces.mdx (Polish)
[ci skip]
2026-07-18 20:13:04 +08:00
4868b5d0d0 New translations workspaces.mdx (German)
[ci skip]
2026-07-18 20:13:01 +08:00
2dc80ea281 New translations dependencies.mdx (Ukrainian)
[ci skip]
2026-07-18 20:12:59 +08:00
80ec220477 New translations dependencies.mdx (Russian)
[ci skip]
2026-07-18 20:12:56 +08:00
7dc8d77e19 New translations dependencies.mdx (Polish)
[ci skip]
2026-07-18 20:12:54 +08:00
aaba0d4f3d New translations dependencies.mdx (German)
[ci skip]
2026-07-18 20:12:51 +08:00
f7bb1fee0f New translations dcr-toml.mdx (Ukrainian)
[ci skip]
2026-07-18 20:12:48 +08:00
2d182e7259 New translations dcr-toml.mdx (Russian)
[ci skip]
2026-07-18 20:12:46 +08:00
02872886fd New translations dcr-toml.mdx (Polish)
[ci skip]
2026-07-18 20:12:43 +08:00
a8538fe408 New translations dcr-toml.mdx (German)
[ci skip]
2026-07-18 20:12:40 +08:00
140dbe9469 New translations multi-package-workspace.mdx (Ukrainian)
[ci skip]
2026-07-18 20:12:38 +08:00
7d23753199 New translations multi-package-workspace.mdx (Russian)
[ci skip]
2026-07-18 20:12:35 +08:00
bdf4c0baee New translations multi-package-workspace.mdx (Polish)
[ci skip]
2026-07-18 20:12:33 +08:00
09dbd7f8e2 New translations multi-package-workspace.mdx (German)
[ci skip]
2026-07-18 20:12:30 +08:00
78151ff0de New translations license.mdx (Ukrainian)
[ci skip]
2026-07-18 20:12:28 +08:00
66797c2265 New translations license.mdx (Russian)
[ci skip]
2026-07-18 20:12:25 +08:00
b07ca1c0ac New translations license.mdx (Polish)
[ci skip]
2026-07-18 20:12:23 +08:00
8ff841f2f5 New translations license.mdx (German)
[ci skip]
2026-07-18 20:12:20 +08:00
54849b2c43 New translations installation.mdx (Ukrainian)
[ci skip]
2026-07-18 20:12:17 +08:00
8dae42f8ea New translations installation.mdx (Russian)
[ci skip]
2026-07-18 20:12:15 +08:00
8edb16f1e4 New translations installation.mdx (Polish)
[ci skip]
2026-07-18 20:12:12 +08:00
6704c96b30 New translations installation.mdx (German)
[ci skip]
2026-07-18 20:12:10 +08:00
02ad12a902 New translations faq.mdx (Ukrainian)
[ci skip]
2026-07-18 20:12:08 +08:00
c7d5d135ca New translations faq.mdx (Russian)
[ci skip]
2026-07-18 20:12:05 +08:00
8998d19bce New translations faq.mdx (Polish)
[ci skip]
2026-07-18 20:12:02 +08:00
d42eeee0ff New translations faq.mdx (German)
[ci skip]
2026-07-18 20:11:59 +08:00
ba408c3dcc New translations system-commands.mdx (Ukrainian)
[ci skip]
2026-07-18 20:11:57 +08:00
98068b54f7 New translations system-commands.mdx (Russian)
[ci skip]
2026-07-18 20:11:54 +08:00
5770d69128 New translations system-commands.mdx (Polish)
[ci skip]
2026-07-18 20:11:52 +08:00
80fc509997 New translations system-commands.mdx (German)
[ci skip]
2026-07-18 20:11:49 +08:00
05f16fc6b4 New translations project-commands.mdx (Ukrainian)
[ci skip]
2026-07-18 20:11:47 +08:00
e63175549c New translations project-commands.mdx (Russian)
[ci skip]
2026-07-18 20:11:44 +08:00
525bd52f8b New translations project-commands.mdx (Polish)
[ci skip]
2026-07-18 20:11:41 +08:00
9f97202121 New translations project-commands.mdx (German)
[ci skip]
2026-07-18 20:11:39 +08:00
88 changed files with 3300 additions and 727 deletions

View File

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

View File

@@ -4,6 +4,209 @@ sidebar_label: 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)
### Added

View File

@@ -13,7 +13,7 @@ dcr build # debug profile
dcr build --release # release build
dcr build --debug # explicit debug
dcr build --target aarch64-unknown-linux-gnu
dcr build --force # full rebuild
dcr build --force # full rebuild (also re-runs build.steps / post_steps)
dcr build --clean # clean + build
dcr build --verbose # show compilation commands
dcr build --workspace pkg-a # build specific workspace package
@@ -21,6 +21,8 @@ dcr build --workspace pkg-a # build specific workspace package
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`
Builds (if sources are newer than artifacts) and runs the binary.
@@ -28,8 +30,11 @@ Builds (if sources are newer than artifacts) and runs the binary.
```bash
dcr run
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`
Removes `target/` directory (or `target/\<target>/\<profile>`).

View File

@@ -15,6 +15,8 @@ dcr add mylib path:./lib # explicit path prefix
dcr add mylib git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub 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:
@@ -23,6 +25,7 @@ Source prefixes:
* `git:` — generic git URL
* `github:` — expands to `https://github.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
Flags:
@@ -31,7 +34,12 @@ Flags:
* `--tag \<name>` — git tag
* `--rev \<hash>` — git commit
If source is omitted — DCR searches connected registries.
If source is omitted — DCR searches connected registries. A bare relative or absolute path is accepted as a path dependency.
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`

View File

@@ -12,8 +12,13 @@ Only ASCII letters, digits, underscores `_` and hyphens `-` are allowed in the p
```bash
dcr new my-app
dcr new my-app --vcs none
```
Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
Generates:
* `dcr.toml` with basic fields
@@ -24,8 +29,12 @@ Generates:
Initializes a DCR project in the current (empty) directory.
```bash
mkdir app && cd app
dcr init
dcr init --vcs none
```
Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
The project name is taken from the current directory name. The directory name must follow the same naming rules as `dcr new`.

View File

@@ -15,9 +15,9 @@ dcr setup
If `~/.dcr/config.toml` is not found, DCR returns an error. Create it manually:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```
## `dcr --help`

View File

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

View File

@@ -13,9 +13,9 @@ error: registry not found
**Solution:** Make sure `~/.dcr/config.toml` exists:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```
And check `DCR_INDEX_PATH`:
@@ -39,27 +39,6 @@ which clang
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
DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
@@ -76,6 +55,21 @@ See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
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
`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,3 +70,10 @@ dcr test # run tests
```bash
dcr fmt # clang-format with .clang-format
```
## Linting
```bash
dcr lint # clang-tidy checks
dcr lint --fix # apply fixes automatically
```

View File

@@ -4,28 +4,75 @@ sidebar_label: Installation
# Installation
## Linux (Dexoron Packages)
## dcrup (recommended)
Configure your package manager at https://pkg.dexoron.su and install:
Install and switch DCR versions (stable / dev / night, pin `0.8.2`, optional build from source).
**Arch Linux**
### Linux / macOS / BSD / Windows (bash)
```sh
sudo pacman -Sy dcr
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- self-install
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable
```
**Debian/Ubuntu**
Non-interactive install of DCR in one shot:
```sh
sudo apt update && sudo apt install dcr
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- install stable
export PATH="$HOME/.dcr/bin:$PATH"
```
**Fedora/RHEL**
### Windows (PowerShell)
```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
sudo dnf install dcr
dcrup install stable # latest stable prebuilt (auto: cf → gh → sf → ya)
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)
```sh
@@ -45,11 +92,12 @@ brew install dcr
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)
```sh
nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr
```
@@ -59,51 +107,40 @@ nix profile install github:dexoron/dcr
cargo install dcr
```
## Linux / macOS (script)
Note: crates.io builds may omit optional features. For FAT disk images (`[archive]`), prefer release binaries or:
```sh
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
cargo install dcr --features archive
```
## From source
```sh
git clone https://github.com/dexoron/dcr.git
cd dcr && cargo build --release
cd dcr
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
```
## Post-install
Verify the installation:
```bash
dcr --version
dcrup show # if installed via dcrup
```
Man pages are available after installation:
Man pages (package installs / release assets):
```bash
man dcr
man dcr-build
```
To use the registry, create `~/.dcr/config.toml`:
Registry (optional) — `~/.dcr/config.toml`:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```

View File

@@ -6,6 +6,13 @@ sidebar_label: IDE Integration
## 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
dcr gen vscode
```

View File

@@ -10,36 +10,23 @@ DCR itself is [GPL-3.0-or-later](https://spdx.org/licenses/GPL-3.0-or-later.html
> **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.
## Vendored libraries
DCR statically links the following C libraries through its vendored Rust dependencies:
| Library | License | Bundled by |
| ------------------------------------------ | ------------------ | ----------------------------- |
| [libgit2](https://libgit2.org) | MIT OR Apache-2.0 | `git2` / `libgit2-sys` |
| [libssh2](https://libssh2.org) | MIT OR Apache-2.0 | `libgit2-sys` |
| [zlib](https://zlib.net) | MIT OR Apache-2.0 | `libgit2-sys` |
| [OpenSSL](https://openssl.org) | Apache-2.0 | `openssl-sys` / `openssl-src` |
| [ring](https://github.com/briansmith/ring) | Apache-2.0 AND ISC | `rustls` |
## Rust dependencies
DCR is written in Rust. The following notable Rust crates are statically linked:
| Crate | License |
| --------------------------------------------- | ------------------------ |
| [`reqwest`](https://crates.io/crates/reqwest) | MIT OR Apache-2.0 |
| [`rustls`](https://crates.io/crates/rustls) | Apache-2.0 OR ISC OR MIT |
| ------------------------------------------------------- | ----------------- |
| [`ureq`](https://crates.io/crates/ureq) | MIT OR Apache-2.0 |
| [`serde`](https://crates.io/crates/serde) | MIT OR 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 |
| [`serde_json`](https://crates.io/crates/serde_json) | MIT OR Apache-2.0 |
| [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 |
| [`git2`](https://crates.io/crates/git2) | MIT OR Apache-2.0 |
| [`openssl`](https://crates.io/crates/openssl) | Apache-2.0 |
| [`tokio`](https://crates.io/crates/tokio) | MIT |
| [`hyper`](https://crates.io/crates/hyper) | MIT |
| [`glob`](https://crates.io/crates/glob) | MIT OR Apache-2.0 |
| [`self-replace`](https://crates.io/crates/self-replace) | MIT OR Apache-2.0 |
| [`ctrlc`](https://crates.io/crates/ctrlc) | MIT OR Apache-2.0 |
Full dependency tree (143 packages) 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.
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

View File

@@ -34,6 +34,7 @@ type = "none"
inherit = true
language = "c"
standard = "c11"
workspace_only = true
[workspace.lib-core]
path = "lib-core"

View File

@@ -0,0 +1,89 @@
---
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: `-I`, `-c -o`, `--defsym`
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32)
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32; **`bin` when `kind = "flat-bin"`**)
* MASM: `/nologo /c /Fo\<obj> <source>`
* FASM: `<source> \<output>` (output path is the object file)
* LLVM IR: `-filetype=obj <source> -o \<output>`
@@ -79,7 +79,7 @@ Three levels of incrementality:
## Build Kinds
| Kind | Type | Path (Linux example) |
| ----------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| ----------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) |
| `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) |
| `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) |
@@ -87,6 +87,11 @@ Three levels of incrementality:
| `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` |
| `none` | Compile only, no link | — |
| `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

View File

@@ -0,0 +1,34 @@
---
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,14 +57,8 @@ dcr build --target aarch64-none-elf
## Target Directory
On Linux with explicit target:
By default, the compilation output directories are structured as follows:
```
target/<triple>/<profile>/
```
On macOS/Windows or without target:
```
target/<profile>/
```
* **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>/`.
* **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`.

View File

@@ -33,15 +33,19 @@ Main project configuration file. Located at the project root.
[run]
# run settings
[archive]
# optional: pack FAT disk image after build
```
## [package]
| Field | Required | Description |
| --------- | -------- | ----------------------- |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------- |
| `name` | yes | Project name |
| `version` | yes | Semantic version |
| `type` | yes | `app`, `lib`, `none` |
| `version` | yes | Semantic version of the **project** |
| `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"`) |
| `license` | no | SPDX license identifier |
| `author` | no | Author |
@@ -49,11 +53,26 @@ Main project configuration file. Located at the project root.
[package]
name = "my-app"
version = "0.1.0"
dcr-version = "0.8.4"
type = "app"
license = "MIT"
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]
...
@@ -61,42 +80,74 @@ author = "John Doe"
* `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`.
| Field | Default | Description |
| ---------------- | ------------------------------------------- | --------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"` |
| ---------------- | ------------- | --------------------------------------------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) |
| `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) |
| `cxx_standard` | `"c++20"` | C++ standard (`c++17`, `c++20`, `c++23`) |
| `compiler` | `"clang"` | Preferred compiler |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom` |
| `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) |
| `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom`, `flat-bin` |
| `target` | host | Target triple for cross-compilation |
| `platform` | `"native"` | `native`, `efi` |
| `cflags` | `[]` | Additional C/C++/ASM flags |
| `ldflags` | `[]` | Additional linker flags |
| `filename` | `""` | Custom output file name |
| `extension` | `""` | Custom file extension |
| `roots` | `["src"]` | Source root directories |
| `extension` | `""` | Custom file extension (for `flat-bin`, default is `bin`) |
| `roots` | `["src"]` | Source roots: directories and/or individual source/header files |
| `exclude` | `[]` | Exclude patterns |
| `include` | `[]` | Additional include directories |
| `src_disable` | `false` | Disable auto source discovery |
| `inherit` | `false` | Inherit build from workspace root |
| `clean` | `[]` | Glob patterns for custom clean paths |
| `out_dir` | `""` | Custom output directory |
| `workspace_only` | `false` | Workspace-only, not built standalone |
| `workspace_only` | `false` | Workspace-only, not built standalone (no `language`/`compiler` required) |
| `freestanding` | `false` | Compile in freestanding mode (`-ffreestanding` + `-nostdlib -static`) |
| `opt_level` | `"0"` (debug) / `"3"` (release) | Optimization level: `0`-`3`, `"s"`, `"z"` |
| `debug` | `true` (debug) / `false` (release) | Emit debug symbols (`-g`) |
| `opt_level` | — | Optimization level: `0`-`3`, `"s"`, `"z"` (derived from profile if omitted) |
| `debug` | profile-based | Emit debug symbols (`-g`): `true` in debug, `false` in release |
| `lto` | `false` | Link-time optimization (`-flto` for both compiler and linker) |
| `strip` | `false` | Strip symbols from output (`-s` in ldflags) |
| `warnings` | `["all", "extra"]` (debug) / `[]` (release) | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`) |
| `warnings` | `[]` | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`); engine adds `-Wall -Wextra` in debug if empty |
| `panic` | `""` | Panic strategy: `"abort"` disables exceptions and unwind tables |
| `codegen-units` | `""` | Max parallel compilation jobs (`"0"` = auto) |
| `qt` | `false` | Enable automatic Qt meta-object handling (MOC, UIC, RCC) |
Settings from raw config (not in typed struct):
* `pkg_config` — list of pkg-config packages
* `pkg_config` — list of packages queried for build-wide compiler/linker flags
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
* `build.steps` / `build.post_steps` — codegen 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:
```toml
[build]
compiler = "clang"
standard = "c11"
[build.c]
standard = "c23"
compiler = "gcc"
[build.cxx]
standard = "c++23"
compiler = "g++"
[build.asm]
compiler = "nasm"
flags = ["-felf64"]
[build.llvm_ir]
compiler = "llc"
```
The flat `[build]` acts as fallback; per-language tables take precedence for their language.
Example:
```toml
@@ -150,3 +201,84 @@ Default `cmd` = `./target/{profile}/{name}` (macOS/Windows) or `./target/\<tripl
## [workspace]
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
The `[dependencies]` section supports three formats:
The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies:
### String (registry)
@@ -23,10 +23,10 @@ The version string is used as-is for registry lookup.
```toml
[dependencies]
fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0" }
```
Fields: `git`, `branch`, `tag`, `rev`.
Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`.
### Table (path)
@@ -35,33 +35,73 @@ Fields: `git`, `branch`, `tag`, `rev`.
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
DCR uses a package registry for dependency lookup by name.
```toml
# ~/.dcr/config.toml
[[registry]]
name = "default"
url = "https://index.dcr.pm"
[registry.default]
url = "https://index.dcr.dexoron.tech"
priority = 1
```
Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`.
## Git dependencies
DCR clones git repositories via `git2`:
Git dependencies are cloned into `~/.dcr/git/`; their exact checked-out commit is written to `dcr.lock`.
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
* `tag` — switch to a tag
* `rev` — switch to a specific commit
* `features` — feature flags (parsed, but does not affect build)
Cache path: `~/.dcr/git/\<hash>/`.
## Path dependencies
Local paths. DCR automatically discovers include and lib directories from the neighbor's `dcr.toml`.
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.
```toml
[dependencies]
@@ -69,16 +109,51 @@ mylib = { path = "/abs/path/to/lib" }
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
Dependency lock file. Contains package names and sources.
Created during `dcr build` when registry dependencies are present. Not updated during `dcr add` — only on the next `dcr build`.
Created during `dcr build` for resolved registry, path, and Git dependencies. Not updated during `dcr add` — only on the next `dcr build`.
## Resolution process
1. Load all dependencies (registry → git → path)
2. For path deps: recursively read their `dcr.toml`
3. For registry deps: search `index.json`
4. For git deps: clone to cache
5. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler
1. Resolve dependency sources (registry → git → path)
2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref
3. Build DCR package dependencies recursively
4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler

View File

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

View File

@@ -43,7 +43,10 @@ dcr build # build all packages in dependency order
dcr build --workspace app # build only app (dependencies built automatically)
```
When building a workspace, member outputs (libraries) are automatically added to include/lib paths of dependent packages.
When building a workspace, DCR automatically injects include and library paths of dependent workspace members:
* **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
@@ -65,3 +68,21 @@ standard = "c17"
# member inherits language and standard
```
## Workspace-only root (no build of its own)
A workspace root can set `workspace_only = true` — it won't be built itself, and doesn't need `language` or `compiler`:
```toml
[package]
name = "my-workspace"
version = "0.1.0"
[build]
workspace_only = true
kind = "bin"
[workspace]
lib-core = { path = "lib-core" }
app = { path = "app", deps = ["lib-core"] }
```

View File

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

View File

@@ -4,6 +4,209 @@ sidebar_label: 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)
### Added

View File

@@ -13,7 +13,7 @@ dcr build # debug profile
dcr build --release # release build
dcr build --debug # explicit debug
dcr build --target aarch64-unknown-linux-gnu
dcr build --force # full rebuild
dcr build --force # full rebuild (also re-runs build.steps / post_steps)
dcr build --clean # clean + build
dcr build --verbose # show compilation commands
dcr build --workspace pkg-a # build specific workspace package
@@ -21,6 +21,8 @@ dcr build --workspace pkg-a # build specific workspace package
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`
Builds (if sources are newer than artifacts) and runs the binary.
@@ -28,8 +30,11 @@ Builds (if sources are newer than artifacts) and runs the binary.
```bash
dcr run
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`
Removes `target/` directory (or `target/\<target>/\<profile>`).

View File

@@ -15,6 +15,8 @@ dcr add mylib path:./lib # explicit path prefix
dcr add mylib git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub 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:
@@ -23,6 +25,7 @@ Source prefixes:
* `git:` — generic git URL
* `github:` — expands to `https://github.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
Flags:
@@ -31,7 +34,12 @@ Flags:
* `--tag \<name>` — git tag
* `--rev \<hash>` — git commit
If source is omitted — DCR searches connected registries.
If source is omitted — DCR searches connected registries. A bare relative or absolute path is accepted as a path dependency.
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`

View File

@@ -12,8 +12,13 @@ Only ASCII letters, digits, underscores `_` and hyphens `-` are allowed in the p
```bash
dcr new my-app
dcr new my-app --vcs none
```
Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
Generates:
* `dcr.toml` with basic fields
@@ -24,8 +29,12 @@ Generates:
Initializes a DCR project in the current (empty) directory.
```bash
mkdir app && cd app
dcr init
dcr init --vcs none
```
Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
The project name is taken from the current directory name. The directory name must follow the same naming rules as `dcr new`.

View File

@@ -15,9 +15,9 @@ dcr setup
If `~/.dcr/config.toml` is not found, DCR returns an error. Create it manually:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```
## `dcr --help`

View File

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

View File

@@ -13,9 +13,9 @@ error: registry not found
**Solution:** Make sure `~/.dcr/config.toml` exists:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```
And check `DCR_INDEX_PATH`:
@@ -39,27 +39,6 @@ which clang
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
DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
@@ -76,6 +55,21 @@ See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
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
`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,3 +70,10 @@ dcr test # run tests
```bash
dcr fmt # clang-format with .clang-format
```
## Linting
```bash
dcr lint # clang-tidy checks
dcr lint --fix # apply fixes automatically
```

View File

@@ -4,28 +4,75 @@ sidebar_label: Installation
# Installation
## Linux (Dexoron Packages)
## dcrup (recommended)
Configure your package manager at https://pkg.dexoron.su and install:
Install and switch DCR versions (stable / dev / night, pin `0.8.2`, optional build from source).
**Arch Linux**
### Linux / macOS / BSD / Windows (bash)
```sh
sudo pacman -Sy dcr
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- self-install
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable
```
**Debian/Ubuntu**
Non-interactive install of DCR in one shot:
```sh
sudo apt update && sudo apt install dcr
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- install stable
export PATH="$HOME/.dcr/bin:$PATH"
```
**Fedora/RHEL**
### Windows (PowerShell)
```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
sudo dnf install dcr
dcrup install stable # latest stable prebuilt (auto: cf → gh → sf → ya)
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)
```sh
@@ -45,11 +92,12 @@ brew install dcr
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)
```sh
nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr
```
@@ -59,51 +107,40 @@ nix profile install github:dexoron/dcr
cargo install dcr
```
## Linux / macOS (script)
Note: crates.io builds may omit optional features. For FAT disk images (`[archive]`), prefer release binaries or:
```sh
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
cargo install dcr --features archive
```
## From source
```sh
git clone https://github.com/dexoron/dcr.git
cd dcr && cargo build --release
cd dcr
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
```
## Post-install
Verify the installation:
```bash
dcr --version
dcrup show # if installed via dcrup
```
Man pages are available after installation:
Man pages (package installs / release assets):
```bash
man dcr
man dcr-build
```
To use the registry, create `~/.dcr/config.toml`:
Registry (optional) — `~/.dcr/config.toml`:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```

View File

@@ -6,6 +6,13 @@ sidebar_label: IDE Integration
## 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
dcr gen vscode
```

View File

@@ -10,36 +10,23 @@ DCR itself is [GPL-3.0-or-later](https://spdx.org/licenses/GPL-3.0-or-later.html
> **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.
## Vendored libraries
DCR statically links the following C libraries through its vendored Rust dependencies:
| Library | License | Bundled by |
| ------------------------------------------ | ------------------ | ----------------------------- |
| [libgit2](https://libgit2.org) | MIT OR Apache-2.0 | `git2` / `libgit2-sys` |
| [libssh2](https://libssh2.org) | MIT OR Apache-2.0 | `libgit2-sys` |
| [zlib](https://zlib.net) | MIT OR Apache-2.0 | `libgit2-sys` |
| [OpenSSL](https://openssl.org) | Apache-2.0 | `openssl-sys` / `openssl-src` |
| [ring](https://github.com/briansmith/ring) | Apache-2.0 AND ISC | `rustls` |
## Rust dependencies
DCR is written in Rust. The following notable Rust crates are statically linked:
| Crate | License |
| --------------------------------------------- | ------------------------ |
| [`reqwest`](https://crates.io/crates/reqwest) | MIT OR Apache-2.0 |
| [`rustls`](https://crates.io/crates/rustls) | Apache-2.0 OR ISC OR MIT |
| ------------------------------------------------------- | ----------------- |
| [`ureq`](https://crates.io/crates/ureq) | MIT OR Apache-2.0 |
| [`serde`](https://crates.io/crates/serde) | MIT OR 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 |
| [`serde_json`](https://crates.io/crates/serde_json) | MIT OR Apache-2.0 |
| [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 |
| [`git2`](https://crates.io/crates/git2) | MIT OR Apache-2.0 |
| [`openssl`](https://crates.io/crates/openssl) | Apache-2.0 |
| [`tokio`](https://crates.io/crates/tokio) | MIT |
| [`hyper`](https://crates.io/crates/hyper) | MIT |
| [`glob`](https://crates.io/crates/glob) | MIT OR Apache-2.0 |
| [`self-replace`](https://crates.io/crates/self-replace) | MIT OR Apache-2.0 |
| [`ctrlc`](https://crates.io/crates/ctrlc) | MIT OR Apache-2.0 |
Full dependency tree (143 packages) 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.
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

View File

@@ -34,6 +34,7 @@ type = "none"
inherit = true
language = "c"
standard = "c11"
workspace_only = true
[workspace.lib-core]
path = "lib-core"

View File

@@ -0,0 +1,89 @@
---
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: `-I`, `-c -o`, `--defsym`
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32)
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32; **`bin` when `kind = "flat-bin"`**)
* MASM: `/nologo /c /Fo\<obj> <source>`
* FASM: `<source> \<output>` (output path is the object file)
* LLVM IR: `-filetype=obj <source> -o \<output>`
@@ -79,7 +79,7 @@ Three levels of incrementality:
## Build Kinds
| Kind | Type | Path (Linux example) |
| ----------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| ----------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) |
| `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) |
| `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) |
@@ -87,6 +87,11 @@ Three levels of incrementality:
| `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` |
| `none` | Compile only, no link | — |
| `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

View File

@@ -0,0 +1,34 @@
---
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,14 +57,8 @@ dcr build --target aarch64-none-elf
## Target Directory
On Linux with explicit target:
By default, the compilation output directories are structured as follows:
```
target/<triple>/<profile>/
```
On macOS/Windows or without target:
```
target/<profile>/
```
* **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>/`.
* **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`.

View File

@@ -33,15 +33,19 @@ Main project configuration file. Located at the project root.
[run]
# run settings
[archive]
# optional: pack FAT disk image after build
```
## [package]
| Field | Required | Description |
| --------- | -------- | ----------------------- |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------- |
| `name` | yes | Project name |
| `version` | yes | Semantic version |
| `type` | yes | `app`, `lib`, `none` |
| `version` | yes | Semantic version of the **project** |
| `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"`) |
| `license` | no | SPDX license identifier |
| `author` | no | Author |
@@ -49,11 +53,26 @@ Main project configuration file. Located at the project root.
[package]
name = "my-app"
version = "0.1.0"
dcr-version = "0.8.4"
type = "app"
license = "MIT"
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]
...
@@ -61,42 +80,74 @@ author = "John Doe"
* `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`.
| Field | Default | Description |
| ---------------- | ------------------------------------------- | --------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"` |
| ---------------- | ------------- | --------------------------------------------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) |
| `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) |
| `cxx_standard` | `"c++20"` | C++ standard (`c++17`, `c++20`, `c++23`) |
| `compiler` | `"clang"` | Preferred compiler |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom` |
| `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) |
| `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom`, `flat-bin` |
| `target` | host | Target triple for cross-compilation |
| `platform` | `"native"` | `native`, `efi` |
| `cflags` | `[]` | Additional C/C++/ASM flags |
| `ldflags` | `[]` | Additional linker flags |
| `filename` | `""` | Custom output file name |
| `extension` | `""` | Custom file extension |
| `roots` | `["src"]` | Source root directories |
| `extension` | `""` | Custom file extension (for `flat-bin`, default is `bin`) |
| `roots` | `["src"]` | Source roots: directories and/or individual source/header files |
| `exclude` | `[]` | Exclude patterns |
| `include` | `[]` | Additional include directories |
| `src_disable` | `false` | Disable auto source discovery |
| `inherit` | `false` | Inherit build from workspace root |
| `clean` | `[]` | Glob patterns for custom clean paths |
| `out_dir` | `""` | Custom output directory |
| `workspace_only` | `false` | Workspace-only, not built standalone |
| `workspace_only` | `false` | Workspace-only, not built standalone (no `language`/`compiler` required) |
| `freestanding` | `false` | Compile in freestanding mode (`-ffreestanding` + `-nostdlib -static`) |
| `opt_level` | `"0"` (debug) / `"3"` (release) | Optimization level: `0`-`3`, `"s"`, `"z"` |
| `debug` | `true` (debug) / `false` (release) | Emit debug symbols (`-g`) |
| `opt_level` | — | Optimization level: `0`-`3`, `"s"`, `"z"` (derived from profile if omitted) |
| `debug` | profile-based | Emit debug symbols (`-g`): `true` in debug, `false` in release |
| `lto` | `false` | Link-time optimization (`-flto` for both compiler and linker) |
| `strip` | `false` | Strip symbols from output (`-s` in ldflags) |
| `warnings` | `["all", "extra"]` (debug) / `[]` (release) | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`) |
| `warnings` | `[]` | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`); engine adds `-Wall -Wextra` in debug if empty |
| `panic` | `""` | Panic strategy: `"abort"` disables exceptions and unwind tables |
| `codegen-units` | `""` | Max parallel compilation jobs (`"0"` = auto) |
| `qt` | `false` | Enable automatic Qt meta-object handling (MOC, UIC, RCC) |
Settings from raw config (not in typed struct):
* `pkg_config` — list of pkg-config packages
* `pkg_config` — list of packages queried for build-wide compiler/linker flags
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
* `build.steps` / `build.post_steps` — codegen 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:
```toml
[build]
compiler = "clang"
standard = "c11"
[build.c]
standard = "c23"
compiler = "gcc"
[build.cxx]
standard = "c++23"
compiler = "g++"
[build.asm]
compiler = "nasm"
flags = ["-felf64"]
[build.llvm_ir]
compiler = "llc"
```
The flat `[build]` acts as fallback; per-language tables take precedence for their language.
Example:
```toml
@@ -150,3 +201,84 @@ Default `cmd` = `./target/{profile}/{name}` (macOS/Windows) or `./target/\<tripl
## [workspace]
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
The `[dependencies]` section supports three formats:
The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies:
### String (registry)
@@ -23,10 +23,10 @@ The version string is used as-is for registry lookup.
```toml
[dependencies]
fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0" }
```
Fields: `git`, `branch`, `tag`, `rev`.
Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`.
### Table (path)
@@ -35,33 +35,73 @@ Fields: `git`, `branch`, `tag`, `rev`.
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
DCR uses a package registry for dependency lookup by name.
```toml
# ~/.dcr/config.toml
[[registry]]
name = "default"
url = "https://index.dcr.pm"
[registry.default]
url = "https://index.dcr.dexoron.tech"
priority = 1
```
Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`.
## Git dependencies
DCR clones git repositories via `git2`:
Git dependencies are cloned into `~/.dcr/git/`; their exact checked-out commit is written to `dcr.lock`.
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
* `tag` — switch to a tag
* `rev` — switch to a specific commit
* `features` — feature flags (parsed, but does not affect build)
Cache path: `~/.dcr/git/\<hash>/`.
## Path dependencies
Local paths. DCR automatically discovers include and lib directories from the neighbor's `dcr.toml`.
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.
```toml
[dependencies]
@@ -69,16 +109,51 @@ mylib = { path = "/abs/path/to/lib" }
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
Dependency lock file. Contains package names and sources.
Created during `dcr build` when registry dependencies are present. Not updated during `dcr add` — only on the next `dcr build`.
Created during `dcr build` for resolved registry, path, and Git dependencies. Not updated during `dcr add` — only on the next `dcr build`.
## Resolution process
1. Load all dependencies (registry → git → path)
2. For path deps: recursively read their `dcr.toml`
3. For registry deps: search `index.json`
4. For git deps: clone to cache
5. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler
1. Resolve dependency sources (registry → git → path)
2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref
3. Build DCR package dependencies recursively
4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler

View File

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

View File

@@ -43,7 +43,10 @@ dcr build # build all packages in dependency order
dcr build --workspace app # build only app (dependencies built automatically)
```
When building a workspace, member outputs (libraries) are automatically added to include/lib paths of dependent packages.
When building a workspace, DCR automatically injects include and library paths of dependent workspace members:
* **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
@@ -65,3 +68,21 @@ standard = "c17"
# member inherits language and standard
```
## Workspace-only root (no build of its own)
A workspace root can set `workspace_only = true` — it won't be built itself, and doesn't need `language` or `compiler`:
```toml
[package]
name = "my-workspace"
version = "0.1.0"
[build]
workspace_only = true
kind = "bin"
[workspace]
lib-core = { path = "lib-core" }
app = { path = "app", deps = ["lib-core"] }
```

View File

@@ -8,15 +8,28 @@ sidebar_label: Введение
<summary>Быстрая справка</summary>
```bash
# Установка(Linux/MacOS скрипт)
curl -fsSL https://dcr.dexoron.su/install.sh | sh
# Installation (dcrup)
curl -fsSL https://sh.dcr-tool.ru | sh -s -- self-install
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
dcr new my-app
cd my-app
# Собрать и запустить
# Build and run
dcr build
dcr run
# Run tests
dcr test
# Add a dependency
dcr add fmt
# Generate IDE files
dcr gen vscode
```
</details>
@@ -41,8 +54,9 @@ dcr run
* **Инкрементальная сборка** — mtime + `.d` headers + SHA256 fingerprint
* **Параллельная компиляция** — thread::scope, атомарная очередь задач
* **4 бэкенда** — gcc/clang, MSVC/clang-cl, GAS, NASM
* **7 типов проекта** — bin, staticlib, sharedlib, efi, elf, none, custom
* **7 backends** — gcc/clang (unix_cc), MSVC/clang-cl (msvc), GAS, NASM, MASM, FASM, LLVM IR
* **8 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom, flat-bin
* **Disk images** — optional `[archive]` packs FAT12/16/32 images after build
* **Cross-compilation** — short names (linux, windows, macos) и полные triples
* **Профили** — debug / release с переопределением любого поля
* **Workspaces** — мультипакетные проекты с топологической сортировкой

View File

@@ -4,10 +4,213 @@ sidebar_label: Список изменений
# Список изменений
## 0.7.1 (02.06.2026)
## 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)
### Добавлено:
* **`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
* **`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.
### Исправлено
* **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 setup --help`, `dcr tree --help`, `dcr gen --help`, `dcr --update --help`,
@@ -29,7 +232,7 @@ sidebar_label: Список изменений
* **Публикация Snap** — автоматическая публикация Snapcraft в рамках непрерывной интеграции (CI).
* **Значок Snap** — в файле README.
### Изменено:
### Changed
* **`validate_package_name` стал общедоступным** — его можно вызывать из команд CLI.
* **Таблица платформы README** — реорганизована: варианты libc вынесены в отдельные строки по ОС,
@@ -38,7 +241,7 @@ sidebar_label: Список изменений
* **`tree.rs`, `fmt.rs` и `setup.rs`** — теперь поддерживают аргументы для опции `--help`.
* **Команды установки из файла README** — `| bash` → `| sh` для обеспечения совместимости с POSIX.
### Исправлено:
### Fixed
* **`dcr new \<invalid-name>` создает каталог, а затем завершается с ошибкой** — теперь проверка
выполняется до начала любых операций с файлами.
@@ -50,7 +253,7 @@ sidebar_label: Список изменений
## 0.7.0 (01.06.2026)
### Добавлено
### Added
* **Поддержка целевых платформ OpenBSD и NetBSD** — полная маршрутизация по платформам с динамически генерируемыми тройками целевых параметров с использованием `std::env::consts::ARCH` и `std::env::consts::OS`. Затрагивает команды `build`, `run`, `clean` и модуль платформы.
* **`src/platform/bsd.rs`** — новый специальный модуль платформы BSD, общий для FreeBSD, OpenBSD и NetBSD, предоставляющий `bin_path`, `lib_path`, `elf_path`, `efi_path` и `shared_lib_path`.
@@ -65,7 +268,7 @@ sidebar_label: Список изменений
* **Интеграционные тесты** — `build_with_target_config` (проверяет `build.target = «linux»`) и `build_with_out_dir` (проверяет настраиваемый каталог вывода).
* **`get_build_string_with_profile` стал `pub`** — чтобы `run.rs` мог определять конфигурацию настраиваемого каталога вывода.
### Изменено
### Changed
* **Изменена семантика `build.target`** — теперь строго содержит тройку целей (например, `x86_64-unknown-linux-gnu`) или короткое имя (`linux`, `macos`, `windows`). Больше не используется в качестве пользовательского каталога вывода — эта функциональность перенесена в `build.out_dir`.
* **`build.standard` стал опциональным** — изменен с `String` на `Option\<String>`. Проверка обеспечивает только непустоту для языков, отличных от ASM. Пропускается в выводе `dcr.toml`, если пуст.
@@ -75,7 +278,7 @@ sidebar_label: Список изменений
* **Таблица совместимости README** — статус сборки/работы на FreeBSD, OpenBSD, NetBSD повышен с «сообщество/по возможности» до «официально поддерживается».
* **Обновлена документация** — `build-section.md` описывает новые поля `build.target` и `build.out_dir`. `target-directory.md` переписан для уточнения различия.
### Исправлено
### Fixed
* **stdout/stderr `dcr run` не наследуются** — вывод дочернего процесса захватывался и выводился вручную, что приводило к сбоям интерактивных программ. Исправлено путем перехода на `Command::status()`.
* **Условие гонки в CI релиза** — задания матрицы сборки могли загружать ресурсы в релиз, который еще не существовал. Исправлено добавлением специального задания `create-release`.

View File

@@ -9,19 +9,20 @@ sidebar_label: Команды сборки (build, run, clean)
Собирает проект по `dcr.toml`.
```bash
dcr build # debug профиль
dcr build --release # release профиль
dcr build --debug # явно debug
dcr build --profile custom # произвольный профиль
dcr build # debug profile
dcr build --release # release build
dcr build --debug # explicit debug
dcr build --target aarch64-unknown-linux-gnu
dcr build --force # пересобрать всё с нуля
dcr build --force # full rebuild (also re-runs build.steps / post_steps)
dcr build --clean # clean + build
dcr build --verbose # показать команды компиляции
dcr build --workspace pkg-a # собрать конкретный пакет в workspace
dcr build --verbose # show compilation commands
dcr build --workspace pkg-a # build specific workspace package
```
Артефакты: `target/\<triple>/\<profile>/\<binary-name>` (Linux с явным целевым объектом).
With `[archive]` in `dcr.toml`, a FAT disk image is packed after a successful build.
## `dcr run`
Собирает (если исходники новее артефакта) и запускает бинарник.
@@ -29,8 +30,11 @@ dcr build --workspace pkg-a # собрать конкретный паке
```bash
dcr run
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`
Удаляет директорию `target/`(или `target/\<target>/\<profile>`).

View File

@@ -9,12 +9,14 @@ sidebar_label: Команды зависимостей (add, tree)
Добавляет зависимость в `dcr.toml`.
```bash
dcr add fmt # поиск в реестре
dcr add mylib ../path/to/lib # путь как источник
dcr add mylib path:./lib # явный префикс пути
dcr add mylib git:https://github.com/user/repo # явный префикс git
dcr add mylib github:user/repo # сокращённая запись GitHub
dcr add mylib gitlab:user/repo # сокращённая запись GitLab
dcr add fmt # registry lookup
dcr add mylib ../path/to/lib # path as source
dcr add mylib path:./lib # explicit path prefix
dcr add mylib git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub 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
```
Префиксы источника:
@@ -23,6 +25,7 @@ dcr add mylib gitlab:user/repo # сокращённая запись GitLab
* `git:` — URL адрес git-репозитория
* `github:` — расширение `https://github.com/\<user>/\<repo>`
* `gitlab:` — расширение `https://gitlab.com/\<user>/\<repo>`
* `pkg-config:` / `pkg:` — one or more packages resolved by `pkg-config`
* `http://` / `https://` / `git@` — полный URL
Флаги:
@@ -31,7 +34,12 @@ dcr add mylib gitlab:user/repo # сокращённая запись GitLab
* `--tag \<name>` — git tag
* `--rev \<hash>` — git commit
Если источник не указан — DCR выполняет поиск в подключенных реестрах.
Если источник не указан — DCR выполняет поиск в подключенных реестрах. A bare relative or absolute path is accepted as a path dependency.
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`

View File

@@ -12,8 +12,13 @@ sidebar_label: Команды проекта (new, init)
```bash
dcr new my-app
dcr new my-app --vcs none
```
Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
Генерирует:
* `dcr.toml` с базовыми полями
@@ -24,8 +29,12 @@ dcr new my-app
Инициализирует проект DCR в текущем (пустом) каталоге.
```bash
mkdir app && cd app
dcr init
dcr init --vcs none
```
Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
Название проекта взято из имени текущего каталога. Имя каталога должно соответствовать тем же правилам именования, что и в `dcr new`.

View File

@@ -15,9 +15,9 @@ dcr setup
Если файл `~/.dcr/config.toml` не найден, DCR возвращает ошибку. Создайте его вручную:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```
## `dcr --help`

View File

@@ -8,6 +8,7 @@ sidebar_label: Вклад
```bash
git clone https://github.com/dexoron/dcr
# or a source mirror: GitVerse / SourceCraft / SourceForge / GitLab (see README)
cd dcr
cargo build
```
@@ -42,10 +43,11 @@ cargo clippy --all-targets -- -D warnings
## CI
В CI запускаются:
CI runs (see `.github/workflows/ci.yml`):
* `cargo fmt --check`
* `cargo clippy --all-targets -- -D warnings`
* `cargo test --all-targets`
* Сборка под Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD
* Интеграционные тесты
* `cargo clippy` (default + `--all-features`)
* `cargo check --all-targets --all-features`
* Unit + integration tests on Linux, macOS, Windows
* Extra Linux job with `--features archive` (FAT images)
* Tools on runners: clang, nasm, clang-format/tidy (Linux)

View File

@@ -13,9 +13,9 @@ sidebar_label: Часто задаваемые вопросы
**Решение:** Убедитесь, что файл `~/.dcr/config.toml` существует:
```toml
[[реестр]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```
Если реестр кастомный, проверьте `DCR_INDEX_PATH`:
@@ -39,27 +39,6 @@ echo $DCR_INDEX_PATH
Или укажите явно через `[toolchain]` или `DCR_COMPILER`.
## Сбой сборки openssl-sys
При сборке DCR из исходников:
```
Ошибка: не удалось выполнить пользовательскую команду сборки для openssl-sys
```
**Решение:** Установите OpenSSL development headers:
```bash
# Ubuntu/Debian
sudo apt install libssl-dev
# Fedora
sudo dnf install openssl-devel
# macOS
brew install openssl
```
## Ctrl+C во время сборки
DCR корректно обрабатывает SIGINT: прерывает текущую компиляцию и завершает процесс с ненулевым кодом.
@@ -76,6 +55,21 @@ DCR корректно обрабатывает SIGINT: прерывает те
См. [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-файл устарел
При изменении зависимостей `dcr.lock` автоматически обновляется при следующем `dcr add`. Если нужно принудительно обновить — удалите `dcr.lock` и выполните `dcr build`.

View File

@@ -70,3 +70,10 @@ dcr test # запустить тесты
```bash
dcr fmt # clang-format по .clang-format
```
## Linting
```bash
dcr lint # clang-tidy checks
dcr lint --fix # apply fixes automatically
```

View File

@@ -4,28 +4,75 @@ sidebar_label: Установка
# Установка
## Linux (Dexoron Packages)
## dcrup (recommended)
Настройте менеджер пакетов на https://pkg.dexoron.su и установите:
Install and switch DCR versions (stable / dev / night, pin `0.8.2`, optional build from source).
**Arch Linux**
### Linux / macOS / BSD / Windows (bash)
```sh
sudo pacman -Sy dcr
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- self-install
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable
```
**Debian/Ubuntu**
Non-interactive install of DCR in one shot:
```sh
sudo apt update && sudo apt install dcr
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- install stable
export PATH="$HOME/.dcr/bin:$PATH"
```
**Fedora/RHEL**
### Windows (PowerShell)
```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
sudo dnf install dcr
dcrup install stable # latest stable prebuilt (auto: cf → gh → sf → ya)
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)
```sh
@@ -45,11 +92,12 @@ brew install dcr
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)
```sh
nix run github:dexoron/dcr
# или установить в профиль:
nix profile install github:dexoron/dcr
```
@@ -59,51 +107,40 @@ nix profile install github:dexoron/dcr
cargo install dcr
```
## Linux / macOS (скрипт)
Note: crates.io builds may omit optional features. For FAT disk images (`[archive]`), prefer release binaries or:
```sh
curl -fsSL https://dcr.dexoron.su/install_bsd.sh | bash
```
## BSD (скрипт)
```sh
curl -fsSL https://dcr.dexoron.su/install.sh | bash
```
## Windows (PowerShell)
```powershell
irm https://dcr.dexoron.su/install.ps1 | iex
cargo install dcr --features archive
```
## Из источника
```sh
git clone https://github.com/dexoron/dcr.git
cd dcr && cargo build --release
cd dcr
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
```
## После установки
Проверьте установку:
```bash
dcr setup
dcr --version
dcrup show # if installed via dcrup
```
После установки становятся доступны man страницы:
Man pages (package installs / release assets):
```bash
man dcr
man dcr-build
```
Чтобы использовать реестр, создайте файл `~/.dcr/config.toml`:
Registry (optional) — `~/.dcr/config.toml`:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```

View File

@@ -6,6 +6,13 @@ sidebar_label: Интеграция с IDE
## 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
dcr gen vscode
```

View File

@@ -10,36 +10,23 @@ DCR распространяется под лицензией [GPL-3.0-or-later
> **Важно:** DCR — инструмент сборки, а не библиотека. GPL распространяется только на исходный код самого DCR. Проекты, собранные с помощью DCR, не подпадают под лицензию DCR — их лицензирование определяется исключительно их собственным кодом и зависимостями.
## Вендорные библиотеки
DCR статически связывает следующие C-библиотеки через вендорные Rust-зависимости:
| Библиотека | Лицензия | В комплекте с |
| -------------------------------------------- | ------------------ | ----------------------------- |
| [libgit2](https://libgit2.org) | MIT ИЛИ Apache-2.0 | `git2` / `libgit2-sys` |
| [libssh2](https://libssh2.org) | MIT ИЛИ Apache-2.0 | `libgit2-sys` |
| [zlib](https://zlib.net) | MIT ИЛИ Apache-2.0 | `libgit2-sys` |
| [OpenSSL](https://openssl.org) | Apache-2.0 | `openssl-sys` / `openssl-src` |
| [кольцо](https://github.com/briansmith/ring) | Apache-2.0 И ISC | `rustls` |
## Rust-зависимости
DCR написан на Rust. Ниже перечислены основные статически связываемые крейты:
| Крейт | Лицензия |
| --------------------------------------------- | -------------------------- |
| [`reqwest`](https://crates.io/crates/reqwest) | MIT ИЛИ Apache-2.0 |
| [`rustls`](https://crates.io/crates/rustls) | Apache-2.0 ИЛИ ISC ИЛИ MIT |
| ------------------------------------------------------- | ------------------ |
| [`ureq`](https://crates.io/crates/ureq) | MIT ИЛИ Apache-2.0 |
| [`serde`](https://crates.io/crates/serde) | MIT ИЛИ Apache-2.0 |
| [`toml`](https://crates.io/crates/toml) | MIT ИЛИ 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 |
| [`sha2`](https://crates.io/crates/sha2) | MIT ИЛИ Apache-2.0 |
| [`git2`](https://crates.io/crates/git2) | MIT ИЛИ Apache-2.0 |
| [`openssl`](https://crates.io/crates/openssl) | Apache-2.0 |
| [`tokio`](https://crates.io/crates/tokio) | MIT |
| [`hyper`](https://crates.io/crates/hyper) | MIT |
| [`glob`](https://crates.io/crates/glob) | MIT ИЛИ Apache-2.0 |
| [`self-replace`](https://crates.io/crates/self-replace) | MIT ИЛИ Apache-2.0 |
| [`ctrlc`](https://crates.io/crates/ctrlc) | MIT ИЛИ Apache-2.0 |
Полное дерево зависимостей (143 пакета) доступно в [`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). Подавляющее большинство имеют двойную лицензию MIT OR Apache-2.0.
## Дополнительные благодарности

View File

@@ -33,14 +33,20 @@ type = "none"
[build]
inherit = true
language = "c"
standard = "c17"
standard = "c11"
workspace_only = true
[workspace]
members = [
{ path = "lib-core" },
{ path = "lib-utils", deps = ["lib-core"] },
{ path = "app", deps = ["lib-core", "lib-utils"], main = true },
]
[workspace.lib-core]
path = "lib-core"
[workspace.lib-utils]
path = "lib-utils"
deps = ["lib-core"]
[workspace.app]
path = "app"
deps = ["lib-core", "lib-utils"]
main = true
```
## Пакеты

View File

@@ -0,0 +1,89 @@
---
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
* GAS: `-I`, `-c -o`, `--defsym`
* NASM: `-I`, `-c -o`, `-D`, `-f` (формат: win64/elf64/macho64/macho32/elf32)
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32; **`bin` when `kind = "flat-bin"`**)
* MASM: `/nologo /c /Fo\<obj> <source>`
* FASM: `<source> \<output>` (путь вывода — объектный файл)
* LLVM IR: `-filetype=obj <source> -o \<output>`
@@ -79,7 +79,7 @@ moc = "moc {in} -o {out}"
## Типы сборок
| Тип | Тип | Путь (пример для Linux) |
| ------------------ | ------------------------------------ | ----------------------------------------------------------------------------------------------- |
| ------------------ | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `bin` | Исполняемый файл | `target/\<profile>/\<name>` (.exe) |
| `staticlib` | Статическая библиотека | `target/\<profile>/lib\<name>.a` (.lib) |
| `sharedlib` | Динамическая библиотека | `target/\<profile>/lib\<name>.so` (.dll/.dylib) |
@@ -87,6 +87,11 @@ moc = "moc {in} -o {out}"
| `эльф` | ELF без стандартной библиотеки | `target/\<profile>/\<name>` |
| `нет` | Только компиляция, без линковки | — |
| `пользовательский` | Полный контроль filename + extension | `target/\<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).
## Этапы сборки

View File

@@ -0,0 +1,34 @@
---
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,14 +57,8 @@ dcr build --target aarch64-none-elf
## Целевой каталог
В Linux с явным указанием цели:
By default, the compilation output directories are structured as follows:
```
target/<triple>/<profile>/
```
В macOS/Windows или без указания целевой платформы:
```
target/<profile>/
```
* **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>/`.
* **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`.

View File

@@ -10,51 +10,69 @@ sidebar_label: Обзор dcr.toml
```toml
[package]
# обязательные поля
# required fields
[build]
# настройки сборки
# build settings
[build.debug] # опционально: переопределение для debug
[build.release] # опционально: переопределение для release
[build.debug] # optional: debug override
[build.release] # optional: release override
[build.linux] # опционально: переопределение для Linux
[build.windows] # опционально: переопределение для Windows
[build.windows.debug] # комбинация target + profile
[build.linux] # optional: Linux override
[build.windows] # optional: Windows override
[build.windows.debug] # target + profile combination
[toolchain]
# пути к компиляторам/линкеру
# compiler/linker paths
[dependencies]
# зависимости проекта
# project dependencies
[workspace]
# мультипакетная конфигурация
# multi-package configuration
[run]
[run.release] # опционально: переопределение для release
# настройки запуска
# run settings
[archive]
# optional: pack FAT disk image after build
```
## [пакет]
| Поле | Обязательное | Описание |
| ---------- | ------------ | --------------------------- |
| ------------- | ------------ | --------------------------------------------------------------------------------------------------------------- |
| `имя` | да | Имя проекта |
| `версия` | да | Семантическая версия |
| `тип` | да | `app`, `lib`, `none` |
| `версия` | да | Semantic version of the **project** |
| `dcr-version` | no | Semver of the **dcr tool** this project targets. Written by `dcr new` / `dcr init` to the current tool version. |
| `тип` | нет | `app`, `lib`, `none` (defaults to `"none"`) |
| `лицензия` | нет | SPDX-идентификатор лицензии |
| `автор` | нет | Автор |
| `автор` | no | Автор |
```toml
[package]
name = "my-app"
version = "0.1.0"
dcr-version = "0.8.4"
type = "app"
license = "MIT"
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`).
## [сборка]
...
@@ -62,42 +80,74 @@ author = "John Doe"
* `build.qt` — (bool) Включить автоматическую обработку метаобъектов Qt (MOC, UIC, RCC). Требуется установка модулей `qt6` с помощью `pkg-config`.
| Поле | По умолчанию | Описание |
| ------------------------ | --------------------------------------------------------------- | ------------------------------------------------------------------------------------- |
| `язык` | `"c"` | `"c"`, `"cxx"`, `"cpp"` |
| ------------------------ | ------------- | --------------------------------------------------------------------------------------------------------- |
| `язык` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) |
| `стандартный` | `"c11"` | Стандарт C (`c11`, `c17`, `c23`) |
| `cxx_standard` | `"c++20"` | Стандарт C++ (`c++17`, `c++20`, `c++23`) |
| `компилятор` | `cxxflags` | Предпочитаемый компилятор |
| `тип` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom` |
| `cxx_standard` | — | Стандарт C++ (`c++17`, `c++20`, `c++23`) |
| `компилятор` | `cxxflags` | Preferred compiler (optional, defaults to `"clang"`) |
| `тип` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom`, `flat-bin` |
| `target` | хост | Target triple для кросс-компиляции |
| `платформа` | `"нативный"` | `native`, `efi`, `freestanding` |
| `cflags` | `[]` | Дополнительные флаги C++ |
| `ldflags` | `[]` | Дополнительные флаги линковки |
| `имя файла` | `""` | Кастомное имя выходного файла |
| `расширение` | `""` | Пользовательское расширение файла |
| `корни` | `["src"]` | Корневые директории с исходниками |
| `расширение` | `""` | Custom file extension (for `flat-bin`, default is `bin`) |
| `корни` | `["src"]` | Source roots: directories and/or individual source/header files |
| `exclude` | `[]` | Паттерны исключений |
| `include` | `[]` | Дополнительные include-директории |
| `src_disable` | `false` | Отключить автоматический поиск источников |
| `наследовать` | `false` | Наследовать build от корня workspace |
| `clean` | `[]` | Шаблоны Glob для настраиваемых чистых путей |
| `out_dir` | `""` | Пользовательский каталог для вывода данных |
| `только рабочая область` | `false` | Только для workspace, не собирать отдельно |
| `только рабочая область` | `false` | Workspace-only, not built standalone (no `language`/`compiler` required) |
| `отдельно стоящий` | `false` | Компилировать в автономном режиме (`-ffreestanding` + `-nostdlib -static`) |
| `opt_level` | `"0"` (отладочная версия) / `"3"` (релизная версия) | Уровень оптимизации: `0`–`3`, `"s"`, `"z"` |
| `ldscript` | `true` (отладочный режим) / `false` (релизный режим) | Выводить отладочные символы (`-g`) |
| `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 |
| `lto` | `false` | Оптимизация на этапе компоновки (`-flto` как для компилятора, так и для компоновщика) |
| `asflags` | `false` | Удалить символы из вывода (опция `-s` в ldflags) |
| `true` | `["all", "extra"]` (отладочная версия) / `[]` (релизная версия) | Флаги предупреждений (например, `"all"`, `"extra"`, `"pedantic"`) |
| `true` | `[]` | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`); engine adds `-Wall -Wextra` in debug if empty |
| `panic` | `""` | Стратегия «Паника»: `"abort"` отключает исключения и таблицы развертки |
| `codegen-units` | `""` | Максимальное количество параллельных заданий компиляции (`"0"` = автоматически) |
| `qt` | `false` | Включить автоматическую обработку метаобъектов Qt (MOC, UIC, RCC) |
Параметры из исходного файла конфигурации (не в виде типизированной структуры):
* Пакеты для pkg-config
* `pkg_config` — list of packages queried for build-wide compiler/linker flags
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`.
* Путь к 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:
```toml
[build]
compiler = "clang"
standard = "c11"
[build.c]
standard = "c23"
compiler = "gcc"
[build.cxx]
standard = "c++23"
compiler = "g++"
[build.asm]
compiler = "nasm"
flags = ["-felf64"]
[build.llvm_ir]
compiler = "llc"
```
The flat `[build]` acts as fallback; per-language tables take precedence for their language.
Пример:
```toml
@@ -151,3 +201,84 @@ cmd = "./target/{profile}/{name}"
## [рабочая область]
См. [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]` поддерживаются три формата:
The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies:
### Строка (реестр)
@@ -23,10 +23,10 @@ catch2 = ">=3.0,<4.0"
```toml
[dependencies]
fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0" }
```
Поля: `git`, `branch`, `tag`, `rev`, `features`.
Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`.
### Табличный (path)
@@ -35,6 +35,32 @@ fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
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.
## Реестр
## RegistryDCR использует реестр пакетов для поиска зависимостей по имени.```toml
@@ -45,27 +71,41 @@ main = { url = "https://github.com/dcr-ports/dcr-index", priority = 1 }
```toml
# ~/.dcr/config.toml
[[registry]]
name = "default"
url = "https://index.dcr.pm"
[registry.default]
url = "https://index.dcr.dexoron.tech"
priority = 1
```
Приоритет реестра: порядок в файле `config.toml`. Переменная `DCR_INDEX_PATH` переопределяет путь к index.json.
## Git-зависимости
При добавлении git-зависимости DCR клонирует репозиторий через `git2`:
Git dependencies are cloned into `~/.dcr/git/`; their exact checked-out commit is written to `dcr.lock`.
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` — переключиться на ветку
* `tag` — переключиться на тег
* `rev` — переключиться на конкретный коммит
* `features` — флаги функций (проанализированы, но не влияют на сборку)
Путь к кэшу: `~/.dcr/git/\<hash>/`.
## Path dependencies
## Path-зависимости
Локальные пути. DCR автоматически находит include и lib директории.
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.
```toml
[dependencies]
@@ -73,16 +113,51 @@ mylib = { path = "/abs/path/to/lib" }
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
Файл блокировки зависимостей. Содержит точные версии, хеши и источники.
Dependency lock file. Contains package names and sources.
Создаётся при выполнении команды `dcr build` при наличии зависимостей реестра. Автоматически обновляется при `dcr add`.
Created during `dcr build` for resolved registry, path, and Git dependencies. Not updated during `dcr add` — only on the next `dcr build`.
## Процесс резолва
## Resolution process
1. Загружаются все зависимости (registry → git → path)
2. Для зависимостей типа «path»: рекурсивно прочитать их файлы `dcr.toml`
3. Для зависимостей реестра: выполните поиск в файле `index.json`
4. Для зависимостей Git: клонировать в кэш
5. Собираются include_dirs, lib_dirs, libs для передачи компилятору
1. Resolve dependency sources (registry → git → path)
2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref
3. Build DCR package dependencies recursively
4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler

View File

@@ -58,3 +58,27 @@ export DCR_INDEX_PATH=/custom/path/index.json
```
По умолчанию: `~/.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,17 +11,18 @@ DCR нормализует target triple через `platform_triple::normalize_
### Linux
```
target/<arch>-unknown-linux-gnu/<profile>/
target/<arch>-unknown-linux-<env>/<profile>/
```
Поддержка архитектур: `x86_64`, `aarch64`.
Architectures: `x86_64`, `aarch64`, `i686`, `armv7`, `riscv64` (host-detected).
Environments: `gnu` (default), `musl`.
Тип артефакта: ELF. Расширения: `.so` для sharedlib, `.a` для staticlib
### macOS
```
target/<profile>/
target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
```
Поддержка архитектур: `x86_64`, `aarch64`.
@@ -31,10 +32,11 @@ target/<profile>/
### Windows
```
target/<profile>/
target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
```
Поддержка архитектур: `x86_64`, `aarch64`.
Environments: `msvc` (default), `gnu` (MinGW).
Расширения: `.exe` (бинарный файл), `.lib` (статическая библиотека), `.dll` (общая библиотека), `.efi` (UEFI).

View File

@@ -38,7 +38,10 @@ dcr build # собрать все пакеты
dcr build --workspace pkg-a # собрать только pkg-a
```
При сборке workspace выходные файлы member-ов (библиотеки) автоматически добавляются в include/lib пути зависимых пакетов.
When building a workspace, DCR automatically injects include and library paths of dependent workspace members:
* **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.
## Очистка
@@ -57,3 +60,21 @@ inherit = true
language = "c"
standard = "c17"
```
## Workspace-only root (no build of its own)
A workspace root can set `workspace_only = true` — it won't be built itself, and doesn't need `language` or `compiler`:
```toml
[package]
name = "my-workspace"
version = "0.1.0"
[build]
workspace_only = true
kind = "bin"
[workspace]
lib-core = { path = "lib-core" }
app = { path = "app", deps = ["lib-core"] }
```

View File

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

View File

@@ -4,6 +4,209 @@ sidebar_label: 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)
### Added

View File

@@ -13,7 +13,7 @@ dcr build # debug profile
dcr build --release # release build
dcr build --debug # explicit debug
dcr build --target aarch64-unknown-linux-gnu
dcr build --force # full rebuild
dcr build --force # full rebuild (also re-runs build.steps / post_steps)
dcr build --clean # clean + build
dcr build --verbose # show compilation commands
dcr build --workspace pkg-a # build specific workspace package
@@ -21,6 +21,8 @@ dcr build --workspace pkg-a # build specific workspace package
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`
Builds (if sources are newer than artifacts) and runs the binary.
@@ -28,8 +30,11 @@ Builds (if sources are newer than artifacts) and runs the binary.
```bash
dcr run
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`
Removes `target/` directory (or `target/\<target>/\<profile>`).

View File

@@ -15,6 +15,8 @@ dcr add mylib path:./lib # explicit path prefix
dcr add mylib git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub 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:
@@ -23,6 +25,7 @@ Source prefixes:
* `git:` — generic git URL
* `github:` — expands to `https://github.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
Flags:
@@ -31,7 +34,12 @@ Flags:
* `--tag \<name>` — git tag
* `--rev \<hash>` — git commit
If source is omitted — DCR searches connected registries.
If source is omitted — DCR searches connected registries. A bare relative or absolute path is accepted as a path dependency.
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`

View File

@@ -12,8 +12,13 @@ Only ASCII letters, digits, underscores `_` and hyphens `-` are allowed in the p
```bash
dcr new my-app
dcr new my-app --vcs none
```
Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
Generates:
* `dcr.toml` with basic fields
@@ -24,8 +29,12 @@ Generates:
Initializes a DCR project in the current (empty) directory.
```bash
mkdir app && cd app
dcr init
dcr init --vcs none
```
Flags:
* `--vcs \<git|none>` — Initialize version control system (defaults to `git` if available, or `none`).
The project name is taken from the current directory name. The directory name must follow the same naming rules as `dcr new`.

View File

@@ -15,9 +15,9 @@ dcr setup
If `~/.dcr/config.toml` is not found, DCR returns an error. Create it manually:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```
## `dcr --help`

View File

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

View File

@@ -13,9 +13,9 @@ error: registry not found
**Solution:** Make sure `~/.dcr/config.toml` exists:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```
And check `DCR_INDEX_PATH`:
@@ -39,27 +39,6 @@ which clang
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
DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
@@ -76,6 +55,21 @@ See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
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
`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,3 +70,10 @@ dcr test # run tests
```bash
dcr fmt # clang-format with .clang-format
```
## Linting
```bash
dcr lint # clang-tidy checks
dcr lint --fix # apply fixes automatically
```

View File

@@ -4,28 +4,75 @@ sidebar_label: Installation
# Installation
## Linux (Dexoron Packages)
## dcrup (recommended)
Configure your package manager at https://pkg.dexoron.su and install:
Install and switch DCR versions (stable / dev / night, pin `0.8.2`, optional build from source).
**Arch Linux**
### Linux / macOS / BSD / Windows (bash)
```sh
sudo pacman -Sy dcr
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- self-install
export PATH="$HOME/.dcr/bin:$PATH"
dcrup install stable
```
**Debian/Ubuntu**
Non-interactive install of DCR in one shot:
```sh
sudo apt update && sudo apt install dcr
curl --proto '=https' --tlsv1.2 -sSf https://sh.dcr-tool.ru | sh -s -- install stable
export PATH="$HOME/.dcr/bin:$PATH"
```
**Fedora/RHEL**
### Windows (PowerShell)
```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
sudo dnf install dcr
dcrup install stable # latest stable prebuilt (auto: cf → gh → sf → ya)
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)
```sh
@@ -45,11 +92,12 @@ brew install dcr
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)
```sh
nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr
```
@@ -59,51 +107,40 @@ nix profile install github:dexoron/dcr
cargo install dcr
```
## Linux / macOS (script)
Note: crates.io builds may omit optional features. For FAT disk images (`[archive]`), prefer release binaries or:
```sh
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
cargo install dcr --features archive
```
## From source
```sh
git clone https://github.com/dexoron/dcr.git
cd dcr && cargo build --release
cd dcr
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
```
## Post-install
Verify the installation:
```bash
dcr --version
dcrup show # if installed via dcrup
```
Man pages are available after installation:
Man pages (package installs / release assets):
```bash
man dcr
man dcr-build
```
To use the registry, create `~/.dcr/config.toml`:
Registry (optional) — `~/.dcr/config.toml`:
```toml
[[registry]]
name = "default"
[registry.default]
url = "https://index.dcr.pm"
priority = 1
```

View File

@@ -6,6 +6,13 @@ sidebar_label: IDE Integration
## 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
dcr gen vscode
```

View File

@@ -10,36 +10,23 @@ DCR itself is [GPL-3.0-or-later](https://spdx.org/licenses/GPL-3.0-or-later.html
> **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.
## Vendored libraries
DCR statically links the following C libraries through its vendored Rust dependencies:
| Library | License | Bundled by |
| ------------------------------------------ | ------------------ | ----------------------------- |
| [libgit2](https://libgit2.org) | MIT OR Apache-2.0 | `git2` / `libgit2-sys` |
| [libssh2](https://libssh2.org) | MIT OR Apache-2.0 | `libgit2-sys` |
| [zlib](https://zlib.net) | MIT OR Apache-2.0 | `libgit2-sys` |
| [OpenSSL](https://openssl.org) | Apache-2.0 | `openssl-sys` / `openssl-src` |
| [ring](https://github.com/briansmith/ring) | Apache-2.0 AND ISC | `rustls` |
## Rust dependencies
DCR is written in Rust. The following notable Rust crates are statically linked:
| Crate | License |
| --------------------------------------------- | ------------------------ |
| [`reqwest`](https://crates.io/crates/reqwest) | MIT OR Apache-2.0 |
| [`rustls`](https://crates.io/crates/rustls) | Apache-2.0 OR ISC OR MIT |
| ------------------------------------------------------- | ----------------- |
| [`ureq`](https://crates.io/crates/ureq) | MIT OR Apache-2.0 |
| [`serde`](https://crates.io/crates/serde) | MIT OR 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 |
| [`serde_json`](https://crates.io/crates/serde_json) | MIT OR Apache-2.0 |
| [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 |
| [`git2`](https://crates.io/crates/git2) | MIT OR Apache-2.0 |
| [`openssl`](https://crates.io/crates/openssl) | Apache-2.0 |
| [`tokio`](https://crates.io/crates/tokio) | MIT |
| [`hyper`](https://crates.io/crates/hyper) | MIT |
| [`glob`](https://crates.io/crates/glob) | MIT OR Apache-2.0 |
| [`self-replace`](https://crates.io/crates/self-replace) | MIT OR Apache-2.0 |
| [`ctrlc`](https://crates.io/crates/ctrlc) | MIT OR Apache-2.0 |
Full dependency tree (143 packages) 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.
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

View File

@@ -34,6 +34,7 @@ type = "none"
inherit = true
language = "c"
standard = "c11"
workspace_only = true
[workspace.lib-core]
path = "lib-core"

View File

@@ -0,0 +1,89 @@
---
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: `-I`, `-c -o`, `--defsym`
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32)
* NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32; **`bin` when `kind = "flat-bin"`**)
* MASM: `/nologo /c /Fo\<obj> <source>`
* FASM: `<source> \<output>` (output path is the object file)
* LLVM IR: `-filetype=obj <source> -o \<output>`
@@ -79,7 +79,7 @@ Three levels of incrementality:
## Build Kinds
| Kind | Type | Path (Linux example) |
| ----------- | ------------------------------- | -------------------------------------------------------------------------------------------------------------------------- |
| ----------- | ------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `bin` | Executable | `target/\<triple>/\<profile>/\<name>` (.exe on Windows) |
| `staticlib` | Static library | `target/\<triple>/\<profile>/lib\<name>.a` (.lib) |
| `sharedlib` | Dynamic library | `target/\<triple>/\<profile>/lib\<name>.so` (.dll/.dylib) |
@@ -87,6 +87,11 @@ Three levels of incrementality:
| `elf` | ELF without stdlib | `target/\<triple>/\<profile>/\<name>` |
| `none` | Compile only, no link | — |
| `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

View File

@@ -0,0 +1,34 @@
---
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,14 +57,8 @@ dcr build --target aarch64-none-elf
## Target Directory
On Linux with explicit target:
By default, the compilation output directories are structured as follows:
```
target/<triple>/<profile>/
```
On macOS/Windows or without target:
```
target/<profile>/
```
* **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>/`.
* **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`.

View File

@@ -33,15 +33,19 @@ Main project configuration file. Located at the project root.
[run]
# run settings
[archive]
# optional: pack FAT disk image after build
```
## [package]
| Field | Required | Description |
| --------- | -------- | ----------------------- |
| ------------- | -------- | --------------------------------------------------------------------------------------------------------------- |
| `name` | yes | Project name |
| `version` | yes | Semantic version |
| `type` | yes | `app`, `lib`, `none` |
| `version` | yes | Semantic version of the **project** |
| `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"`) |
| `license` | no | SPDX license identifier |
| `author` | no | Author |
@@ -49,11 +53,26 @@ Main project configuration file. Located at the project root.
[package]
name = "my-app"
version = "0.1.0"
dcr-version = "0.8.4"
type = "app"
license = "MIT"
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]
...
@@ -61,42 +80,74 @@ author = "John Doe"
* `build.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`.
| Field | Default | Description |
| ---------------- | ------------------------------------------- | --------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"` |
| ---------------- | ------------- | --------------------------------------------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) |
| `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) |
| `cxx_standard` | `"c++20"` | C++ standard (`c++17`, `c++20`, `c++23`) |
| `compiler` | `"clang"` | Preferred compiler |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom` |
| `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) |
| `compiler` | `"clang"` | Preferred compiler (optional, defaults to `"clang"`) |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom`, `flat-bin` |
| `target` | host | Target triple for cross-compilation |
| `platform` | `"native"` | `native`, `efi` |
| `cflags` | `[]` | Additional C/C++/ASM flags |
| `ldflags` | `[]` | Additional linker flags |
| `filename` | `""` | Custom output file name |
| `extension` | `""` | Custom file extension |
| `roots` | `["src"]` | Source root directories |
| `extension` | `""` | Custom file extension (for `flat-bin`, default is `bin`) |
| `roots` | `["src"]` | Source roots: directories and/or individual source/header files |
| `exclude` | `[]` | Exclude patterns |
| `include` | `[]` | Additional include directories |
| `src_disable` | `false` | Disable auto source discovery |
| `inherit` | `false` | Inherit build from workspace root |
| `clean` | `[]` | Glob patterns for custom clean paths |
| `out_dir` | `""` | Custom output directory |
| `workspace_only` | `false` | Workspace-only, not built standalone |
| `workspace_only` | `false` | Workspace-only, not built standalone (no `language`/`compiler` required) |
| `freestanding` | `false` | Compile in freestanding mode (`-ffreestanding` + `-nostdlib -static`) |
| `opt_level` | `"0"` (debug) / `"3"` (release) | Optimization level: `0`-`3`, `"s"`, `"z"` |
| `debug` | `true` (debug) / `false` (release) | Emit debug symbols (`-g`) |
| `opt_level` | — | Optimization level: `0`-`3`, `"s"`, `"z"` (derived from profile if omitted) |
| `debug` | profile-based | Emit debug symbols (`-g`): `true` in debug, `false` in release |
| `lto` | `false` | Link-time optimization (`-flto` for both compiler and linker) |
| `strip` | `false` | Strip symbols from output (`-s` in ldflags) |
| `warnings` | `["all", "extra"]` (debug) / `[]` (release) | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`) |
| `warnings` | `[]` | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`); engine adds `-Wall -Wextra` in debug if empty |
| `panic` | `""` | Panic strategy: `"abort"` disables exceptions and unwind tables |
| `codegen-units` | `""` | Max parallel compilation jobs (`"0"` = auto) |
| `qt` | `false` | Enable automatic Qt meta-object handling (MOC, UIC, RCC) |
Settings from raw config (not in typed struct):
* `pkg_config` — list of pkg-config packages
* `pkg_config` — list of packages queried for build-wide compiler/linker flags
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
* `build.steps` / `build.post_steps` — codegen 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:
```toml
[build]
compiler = "clang"
standard = "c11"
[build.c]
standard = "c23"
compiler = "gcc"
[build.cxx]
standard = "c++23"
compiler = "g++"
[build.asm]
compiler = "nasm"
flags = ["-felf64"]
[build.llvm_ir]
compiler = "llc"
```
The flat `[build]` acts as fallback; per-language tables take precedence for their language.
Example:
```toml
@@ -150,3 +201,84 @@ Default `cmd` = `./target/{profile}/{name}` (macOS/Windows) or `./target/\<tripl
## [workspace]
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
The `[dependencies]` section supports three formats:
The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies:
### String (registry)
@@ -23,10 +23,10 @@ The version string is used as-is for registry lookup.
```toml
[dependencies]
fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0" }
```
Fields: `git`, `branch`, `tag`, `rev`.
Fields: `git`, `branch`, `tag`, `rev`, `mode`, `include`, `lib`, `libs`.
### Table (path)
@@ -35,33 +35,73 @@ Fields: `git`, `branch`, `tag`, `rev`.
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
DCR uses a package registry for dependency lookup by name.
```toml
# ~/.dcr/config.toml
[[registry]]
name = "default"
url = "https://index.dcr.pm"
[registry.default]
url = "https://index.dcr.dexoron.tech"
priority = 1
```
Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`.
## Git dependencies
DCR clones git repositories via `git2`:
Git dependencies are cloned into `~/.dcr/git/`; their exact checked-out commit is written to `dcr.lock`.
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
* `tag` — switch to a tag
* `rev` — switch to a specific commit
* `features` — feature flags (parsed, but does not affect build)
Cache path: `~/.dcr/git/\<hash>/`.
## Path dependencies
Local paths. DCR automatically discovers include and lib directories from the neighbor's `dcr.toml`.
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.
```toml
[dependencies]
@@ -69,16 +109,51 @@ mylib = { path = "/abs/path/to/lib" }
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
Dependency lock file. Contains package names and sources.
Created during `dcr build` when registry dependencies are present. Not updated during `dcr add` — only on the next `dcr build`.
Created during `dcr build` for resolved registry, path, and Git dependencies. Not updated during `dcr add` — only on the next `dcr build`.
## Resolution process
1. Load all dependencies (registry → git → path)
2. For path deps: recursively read their `dcr.toml`
3. For registry deps: search `index.json`
4. For git deps: clone to cache
5. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler
1. Resolve dependency sources (registry → git → path)
2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref
3. Build DCR package dependencies recursively
4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler

View File

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

View File

@@ -43,7 +43,10 @@ dcr build # build all packages in dependency order
dcr build --workspace app # build only app (dependencies built automatically)
```
When building a workspace, member outputs (libraries) are automatically added to include/lib paths of dependent packages.
When building a workspace, DCR automatically injects include and library paths of dependent workspace members:
* **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
@@ -65,3 +68,21 @@ standard = "c17"
# member inherits language and standard
```
## Workspace-only root (no build of its own)
A workspace root can set `workspace_only = true` — it won't be built itself, and doesn't need `language` or `compiler`:
```toml
[package]
name = "my-workspace"
version = "0.1.0"
[build]
workspace_only = true
kind = "bin"
[workspace]
lib-core = { path = "lib-core" }
app = { path = "app", deps = ["lib-core"] }
```