213 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
0e2d05788a New translations test-framework.mdx (Russian)
[ci skip]
2026-07-06 15:02:04 +08:00
468cdef2d9 New translations running-tests.mdx (Russian)
[ci skip]
2026-07-06 15:02:02 +08:00
ee9cade5c8 New translations self-update.mdx (Russian)
[ci skip]
2026-07-06 15:01:59 +08:00
25ab25b9a2 New translations platform-support.mdx (Russian)
[ci skip]
2026-07-06 15:01:54 +08:00
360619fb78 New translations environment-variables.mdx (Russian)
[ci skip]
2026-07-06 15:01:52 +08:00
4c24089cb2 New translations dependencies.mdx (Russian)
[ci skip]
2026-07-06 15:01:49 +08:00
3e810c476d New translations dcr-toml.mdx (Russian)
[ci skip]
2026-07-06 15:01:47 +08:00
5682792c2f New translations cross-compilation.mdx (Russian)
[ci skip]
2026-07-06 15:01:44 +08:00
ff5d8ba4bf New translations build-system.mdx (Russian)
[ci skip]
2026-07-06 15:01:41 +08:00
0f1fff7072 New translations build-profiles.mdx (Russian)
[ci skip]
2026-07-06 15:01:38 +08:00
b8cceb2945 New translations license.mdx (Russian)
[ci skip]
2026-07-06 15:01:29 +08:00
fce6804c32 New translations ide-integration.mdx (Russian)
[ci skip]
2026-07-06 15:01:27 +08:00
a988adea3a New translations installation.mdx (Russian)
[ci skip]
2026-07-06 15:01:24 +08:00
6575f5d2f0 New translations first-steps.mdx (Russian)
[ci skip]
2026-07-06 15:01:22 +08:00
17aa2937be New translations faq.mdx (Russian)
[ci skip]
2026-07-06 15:01:19 +08:00
828624860a New translations contributing.mdx (Russian)
[ci skip]
2026-07-06 15:01:16 +08:00
66195b53e2 New translations system-commands.mdx (Russian)
[ci skip]
2026-07-06 15:01:14 +08:00
8ded7958f6 New translations quality-commands.mdx (Russian)
[ci skip]
2026-07-06 15:01:11 +08:00
9c9a2d9096 New translations changelog.mdx (Russian)
[ci skip]
2026-07-06 15:01:09 +08:00
9d033ef9a4 New translations readme.mdx (Russian)
[ci skip]
2026-07-06 15:01:06 +08:00
50fa84c317 New translations quality-commands.mdx (Russian)
[ci skip]
2026-07-06 13:57:31 +08:00
93 changed files with 3517 additions and 952 deletions

View File

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

View File

@@ -4,6 +4,209 @@ sidebar_label: Changelog
# Changelog # Changelog
## 0.9.5 (2026-10-21)
* **Structured CLI output** — shared helpers now provide Cargo-like human, plain, and JSON output modes.
* **Color and diagnostics policy** — `--color`, `NO_COLOR`, `--quiet`, and `--verbose` are applied consistently across commands.
* **Build reporting** — lifecycle events and compiler diagnostics are available as structured JSON events.
* **Output lab** — sandbox scenarios cover help, lifecycle commands, compiler warnings/errors, stream capture, and broken pipes.
## 0.9.1 (2026-09-13)
* **`pkg-config` dependencies** — declare `fmt = { pkg-config = "fmt" }` or multiple package names in `[dependencies]`; DCR applies `.pc` compiler/linker flags and records the resolved package in `dcr.lock`.
* **`dcr add` support for `pkg-config`** — easily add system package dependencies with `dcr add fmt pkg-config:fmt` or `dcr add openssl pkg:openssl,libcrypto`.
* **`dcr tree` & IDE integration** — `pkg-config` packages are marked in `dcr tree` and resolved into compiler flags in `dcr gen` (`compile_commands.json`).
* **Fixed `dcr new` in non-ASCII / spaced paths** — initializing projects from folders with non-ASCII characters or spaces no longer fails validation.
## 0.9.0 (2026-08-31)
* **Download mirrors in `dcrup`** — `--mirror auto|cf|gh|sf|ya` and `DCRUP_MIRROR`.
Default `auto` tries **cf → gh → sf → ya** (CloudFlare CDN, GitHub, SourceForge, Yandex CDN).
* **Complete Path/Git dependencies** — DCR packages from `path` and `git` are built before their consumer. Git sources are cached in `~/.dcr/git`, support `branch`/`tag`/`rev`, and record the exact commit in `dcr.lock`.
* **Build and prebuild modes** — `path` and `git` dependencies can build a DCR package from `dcr.toml` or link existing `include`/`lib`/`libs` artifacts; `mode = "build"` / `"prebuild"` selects explicitly when both forms are present.
* **Prebuilt dependency examples** — documentation now shows the `dcr-math-lib` Git repository and recommended build/prebuilt layouts for both `git` and `path`.
* **Transitive dependency builds and cycle reporting** — DCR recursively builds DCR packages and reports a clear dependency chain for cycles.
* **Bare path arguments for `dcr add`** — `dcr add mylib ../mylib` now works in addition to the explicit `path:` form.
* **Removed `install.sh` / `install.ps1` / `install_bsd.sh`** — superseded by `dcrup`.
## 0.8.5 (2026-08-08)
* **`package.dcr-version`** — optional CLI version pin in `dcr.toml`.
`dcr new` / `dcr init` write the current version. On config load:
* missing / empty pin → warn "add dcr-version";
* dcr older than pin → warn "update dcr";
* dcr newer than pin → warn "check changelog, update pin";
* equal → silent.
Commands do not fail, warning only (once per path per process).
## 0.8.4 (2026-08-04)
**Added:**
* **`.dcr/` directory** — shared machine-readable build facts for IDE integrations:
* `.dcr/compile_commands.json`
* `.dcr/build-info.json` (`schemaVersion`, `artifact_path`, `profile`, …)
* `.dcr/toolchain.json` (compiler/debugger paths, moc/uic/rcc)
* `.dcr/ide/` (placeholder for IDE lock files)
* **`dcr gen project-info`** — `target`, `target_dir`, `artifact_path`, `artifact_kind`, `source_roots`, `include_globs`, `exclude_globs`; absolute/canonical paths.
* **`dcr build --print-artifact-path`** — one absolute artifact path line on stdout after a successful build.
* **`dcr gen … --quiet` / `-q`** — suppress human success logs for gen subcommands.
* **`.clangd`** — created on first gen with `CompilationDatabase: .dcr` (`# managed by dcr gen`); custom `.clangd` is not overwritten.
* **Helpers** `canonicalize_path`, `atomic_write`, `ensure_dcr_dir`; pure `resolve_artifact_path` via `platform::*`.
* **`dcr new` / `dcr init`** — add `.dcr/` to `.gitignore`.
**Changed (breaking):**
* **`compile_commands.json` moved** from project root to **`.dcr/compile_commands.json`**.\
clangd discovers it via `.clangd` / `--compile-commands-dir=.dcr`.\
CLion and VSCode generators updated accordingly.
* **Atomic write** for compile_commands (tmp + rename).
* **`gen vscode` / `gen clion` launch/run** — use the same artifact path resolver as `project-info` / `build-info.json`.
**Fixed:**
* Launch configs no longer hardcode `target/\<profile>/\<name>` without the Linux triple segment.
* Symlink/mount roots: best-effort canonicalize for root and compile database paths.
## 0.8.3 (2026-08-03)
### Added
* **`dcr run -- \<args>...`** — cargo-style argument forwarding after a bare `--`\
(`dcr run --release -- --test_help`). Applies to direct binary runs and `[run].cmd`.
* **Tests** — host target section `ldflags` without CLI `--target`; run-arg forwarding; `split_double_dash` unit tests.
### Changed
* **Native builds resolve the host triple** — without `--target` / package `build.target`, host sections such as\
`[build.x86_64-unknown-linux-gnu]` apply again (`cflags` / `ldflags` / toolchain).\
Previously the target was empty and those sections were ignored while artifacts already used the host triple path.
* **Empty target** — no more `Unknown target ''` warning.
* **`dcr run --help` / man `dcr-run`** — document `--` forwarding.
### Fixed
* **Native artifact paths on Windows and macOS** — without an explicit `--target` / `build.target`, artifacts use `target/\<profile>`, so `dcr run` and flat-bin find the build output.
* Target-specific `ldflags` missing on native host builds (e.g. micro-lang + `libsct-elf`).
* Spurious empty-target warning.
## 0.8.2 (2026-07-22)
### Added
* **Compile progress `[N/M]`** — live TTY status line (`compile pkg v0.1.0 [12/41]`) so long mono-package builds do not look hung.
* **DCR status style** — fixed-width verbs: `project`, `compile`, `dep`, `ready`, `pack`, `done`, `run`.
* **Cargo feature `archive`** — optional FAT packing via `fatfs` (`cargo build --features archive`). Release CI builds with the feature; without it `[archive]` fails with a clear message.
* **Tests** — `flat_bin_nasm_build`, package `build.target` without CLI `--target`, stricter workspace `clean --all`.
* **CI expansion** — unit + integration on Linux/macOS/Windows, archive feature job, rust-cache, clippy default + all-features (see `.github/workflows/ci.yml`).
### Changed
* **No forced host triple from CLI** — without `--target`, package/member `build.target` is honored (bare-metal / ISO `post_steps` paths).
* **Relative include/lib flags** (`-I`, `-i`, `-isystem`, `-idirafter`, `-L`, `-T`) absolutized against the package root under workspace builds.
* **`dcr clean --all`** — no spam for members without a local `target/` (shared root `target/`).
* **`error` / `warn`** — red / yellow on stderr; CLI fully English (`Hint:`).
* **Help / man** — list `add`, `lint`, `setup`; unknown command exits with code 1.
* **Tool NotFound** — `linker not found: ld.lld …` / `{tool} not found …` instead of raw `os error 2`.
## 0.8.1 (2026-07-20)
### Added
* **`build.kind = "flat-bin"`** — raw binary (default `.bin`) for OS-dev payloads:
* **NASM** — `-f bin` → `\<stem>.bin`
* **FASM** — direct output (`format binary` in source)
* **GAS / MASM / LLC** — object → `objcopy -O binary` → `\<stem>.bin`
* **C/C++** — objects → freestanding link → `objcopy -O binary` → `\<name>.bin`
* Requires `llvm-objcopy` / `objcopy` / `gobjcopy` except for NASM/FASM direct emit
* **`[archive]` section** — FAT12/16/32 disk images after build (`output`, `format`, `size`, `offset`, `label`, `bootsector`, `layout`). From 0.8.2 requires feature `archive`.
* **Single-file `build.roots`** — a root may be a single source or header file, not only a directory.
### Changed
* **`--force`** also re-runs `build.steps` and `build.post_steps`.
* **`dcr run` on workspace-only root** — if `[run].cmd` is set, run that after build; otherwise delegate to a workspace member.
## 0.8.0 (2026-07-18)
### Added
* **Dedicated Build Engine (`src/core/build/engine.rs`)** — decoupled the build orchestration logic completely from the CLI front-end wrapper in `src/cli/build.rs` to a reusable, decoupled core build engine.
* **Polymorphic Language Model (`Language` trait)** — introduced the abstract `Language` trait (`src/core/build/language/mod.rs`). File scanning, compiler resolution, and flags handling are now encapsulated in dedicated language modules for C, C++ (including Qt code generation), LLVM IR, and ASM (GAS, NASM, FASM, MASM).
* **Polymorphic Compilation Dispatch (`Builder` trait)** — introduced the `Builder` trait to generalize builder invocations (`src/core/build/builder/mod.rs`). Consolidated GCC/Clang logic into `builder/cc_common.rs` and Microsoft Visual C++ logic into `builder/msvc/`.
* **Per-Language Configuration overrides (`[build.\<lang>]`)** — introduced support for configuring language-specific compiler, standard, and flags (e.g. `[build.c]`, `[build.cxx]`, `[build.asm]`) independently in `dcr.toml`.
* **Automatic Workspace Dependency Injection** — during workspace builds, include/lib paths of dependent workspace members (including their source headers, local `include/` folders, and build target `target/include` / `target/lib` folders) are automatically resolved and injected.
* **`BuildReporter` Event System** — decoupled build orchestration output into a structured event-driven reporter model (`src/core/build/report.rs`), making DCR suitable for library embedding and IDE integrations without stderr capturing.
* **Build Cancellation Support** — introduced thread-safe cancellation tokens (`Arc\<AtomicBool>`) allowing clients to safely abort compile runs mid-execution.
* **TOML Formatting & Custom Keys Preservation** — migrated the config editor to `toml_edit`, preserving all unknown/user-defined TOML keys, structures, and comments during file write operations (e.g., in `dcr add`).
* **Path Dependencies Target Include Resolution** — local path dependencies configured via tables now correctly expose headers built and packaged into their `target/include` folder to consumer packages.
* **Modular Integration Test Suite** — refactored the monolith `tests/cli_basic.rs` file into clean, specialized integration tests: `cli_build.rs`, `cli_deps.rs`, `cli_lint.rs`, `cli_new.rs`, `cli_qt.rs`, `cli_test.rs`, `cli_workspace.rs`.
### Changed
* **Consolidated Linking and Archiving** — artifact generation (linking executables/shared libraries and archiving static libraries) consolidated into a single `src/core/build/builder/artifact.rs` module.
* **Workspace-Aware member execution** — `dcr run` executed at the workspace root of a `workspace_only` project now triggers the member build inside the workspace context using the `--workspace` parameter, preventing standalone build issues.
* **Elimination of Global State** — removed global variables and states from the build core, encapsulating build logic inside isolated `BuildContext` structs for thread safety.
* **Build Cache Separation** — relocated mtime tracking, incremental caching, and header-dependency checking logic to `src/core/build/cache.rs`.
* **Modularized Pre-build Steps** — decoupled generator scripts and pre-build commands parsing into `src/core/build/steps.rs`.
## 0.7.4 (2026-06-17)
### Added
* **Native Qt support** — automatic meta-object handling (MOC, UIC, RCC) added when `build.qt = true` is set in `dcr.toml`.
* **`dcr lint` command** — C/C++ static analysis via `clang-tidy`. Supports `--fix` for automatic fixes. Respects `build.roots` and `build.src_disable` from config.
* **Three new assembler backends**:
* **MASM** (`compiler = "ml"` / `"ml64"`) — Microsoft Macro Assembler.
* **FASM** (`compiler = "fasm"`) — Flat Assembler.
* **LLVM IR** (`compiler = "llc"`) — compiles `.ll` files via `llc -filetype=obj`.
* **Shared ASM pipeline** — linking and archiving logic consolidated into `core/builder/asm.rs`. Adding a new assembler backend now takes ~30 lines.
* **Filesystem utilities** — `to_hex()` and `home_dir()` extracted to `utils/fs.rs`.
* **Build utilities** — `normalize_target()`, `normalize_kind()`, `normalize_platform()`, `default_profile_flags()` extracted to `utils/build.rs`.
* **Backend helpers** — `asm_lang_flag()`, `source_extensions()`, `elapsed_secs()` added to `core/builder/common.rs`.
* **Full Bare-Metal / Freestanding Automation** — introduced the `build.freestanding = true` configuration option. When enabled (or when a bare-metal target is detected), DCR automatically injects `-ffreestanding` during compilation and both `-nostdlib` and `-static` during linking.
* **Artifact Optimization (LTO & Strip)** — added `build.lto` (auto-injects `-flto` for compiler and linker) and `build.strip` (automatically strips debug symbols via linker `-s` flag) options to `dcr.toml`.
* **Compilation Thread Control** — added the `build.codegen-units` option to strictly limit the maximum number of parallel jobs utilized by the custom `parallel_build` worker pool.
* **Panic Behavior Management** — added `build.panic = "abort"` support. For C++ targets, it automatically strips exception handling and unwind tables via `-fno-exceptions`, `-fno-unwind-tables`, and `-fno-asynchronous-unwind-tables`.
### Changed
* **Intelligent Default Flags Generation** — automated injection of fallback optimization (`-O3`/`-O0`), debug (`-g`), and warning (`-Wall -Wextra`) flags is now suppressed for bare-metal and freestanding builds if `build.cflags` are overridden.
* **Centralized Bare-Metal Detection** — relocated the `is_bare_metal_target` helper to common build utilities (`src/utils/build.rs`) for unified access across the building core.
* **Architectural Refactoring**:
* Renamed `src/config.rs` to `src/templates.rs`.
* Started consolidation of configuration and build orchestration logic.
## 0.7.3 (2026-06-13)
### Added
* **`--vcs` option for `new` and `init` commands** — introduced explicit version control system selection via `--vcs \<git|none>`.
* **Git metadata integration in `--version`** — the CLI now appends the current short commit hash and a `-dirty` suffix if there are uncommitted changes in the DCR repository.
* **Automatic `.gitignore` generation** — Git repository initialization now automatically writes a `.gitignore` file excluding the `/target` directory.
* **Nested repository prevention** — automatic Git initialization is now skipped if `dcr new` or `dcr init` is executed inside an already existing Git repository.
* **VCS verification tests** — added `new_vcs_options_work` and `init_vcs_options_work` integration tests to ensure reliable repository behavior.
### Changed
* **Complete removal of `git2` dependency** — all Git actions (dependency fetching, VCS setup, status checks) are now delegated to the system `git` executable via `Command`. This simplifies compilation and drops the need for `vendored` and `openssl` features.
* **Migrated from `reqwest` to `ureq`** — replaced the heavy `reqwest` crate in `flag_update.rs` with the lightweight synchronous `ureq 2.10` client, reducing overhead and the final binary size.
## 0.7.2 (2026-06-07)
### Added
* `default_target_triple()` now respects `target_env` — Linux (gnu/musl) and Windows (msvc/gnu) use the correct environment instead of hardcoded values.
### Fixed
* **macOS Apple Silicon builds failed with `_main` undefined** — `--target=` is now passed to ldflags, not just cflags. `default_target_triple()` uses `std::env::consts::ARCH` on macOS instead of hardcoded `x86_64`.
* **GitHub Stars and GPL-3.0 badges not rendering in README** — badge block converted to pure HTML.
### Changed
* Default target resolution extracted into shared `default_target_triple()` — removed duplication across build, run, clean.
## 0.7.1 (2026-06-02) ## 0.7.1 (2026-06-02)
### Added ### Added

View File

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

View File

@@ -15,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 git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub shorthand dcr add mylib github:user/repo # GitHub shorthand
dcr add mylib gitlab:user/repo # GitLab shorthand dcr add mylib gitlab:user/repo # GitLab shorthand
dcr add fmt pkg-config:fmt # system package via pkg-config
dcr add openssl pkg:openssl,libcrypto # multiple pkg-config packages
``` ```
Source prefixes: Source prefixes:
@@ -23,6 +25,7 @@ Source prefixes:
* `git:` — generic git URL * `git:` — generic git URL
* `github:` — expands to `https://github.com/\<user>/\<repo>` * `github:` — expands to `https://github.com/\<user>/\<repo>`
* `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>` * `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>`
* `pkg-config:` / `pkg:` — one or more packages resolved by `pkg-config`
* `http://` / `https://` / `git@` — full URL * `http://` / `https://` / `git@` — full URL
Flags: Flags:
@@ -31,7 +34,12 @@ Flags:
* `--tag \<name>` — git tag * `--tag \<name>` — git tag
* `--rev \<hash>` — git commit * `--rev \<hash>` — git commit
If source is omitted — DCR searches connected registries. 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` ## `dcr tree`

View File

@@ -12,8 +12,13 @@ Only ASCII letters, digits, underscores `_` and hyphens `-` are allowed in the p
```bash ```bash
dcr new my-app 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: Generates:
* `dcr.toml` with basic fields * `dcr.toml` with basic fields
@@ -24,8 +29,12 @@ Generates:
Initializes a DCR project in the current (empty) directory. Initializes a DCR project in the current (empty) directory.
```bash ```bash
mkdir app && cd app
dcr init 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`. 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: If `~/.dcr/config.toml` is not found, DCR returns an error. Create it manually:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```
## `dcr --help` ## `dcr --help`

View File

@@ -8,6 +8,7 @@ sidebar_label: Contributing
```bash ```bash
git clone https://github.com/dexoron/dcr git clone https://github.com/dexoron/dcr
# or a source mirror: GitVerse / SourceCraft / SourceForge / GitLab (see README)
cd dcr cd dcr
cargo build cargo build
``` ```
@@ -42,10 +43,11 @@ cargo test --all-targets
## CI ## CI
CI runs: CI runs (see `.github/workflows/ci.yml`):
* `cargo fmt --check` * `cargo fmt --check`
* `cargo clippy --all-targets -- -D warnings` * `cargo clippy` (default + `--all-features`)
* `cargo test --all-targets` * `cargo check --all-targets --all-features`
* Build on Linux, macOS, Windows * Unit + integration tests on Linux, macOS, Windows
* Integration tests * 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: **Solution:** Make sure `~/.dcr/config.toml` exists:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```
And check `DCR_INDEX_PATH`: And check `DCR_INDEX_PATH`:
@@ -39,27 +39,6 @@ which clang
Or specify explicitly via `[toolchain]` in `dcr.toml`. Or specify explicitly via `[toolchain]` in `dcr.toml`.
## openssl-sys build failed
When building DCR from source:
```
error: failed to run custom build command for openssl-sys
```
**Solution:** Install OpenSSL development headers:
```bash
# Ubuntu/Debian
sudo apt install libssl-dev
# Fedora
sudo dnf install openssl-devel
# macOS
brew install openssl
```
## Ctrl+C during build ## Ctrl+C during build
DCR handles SIGINT: interrupts the current compilation and exits with non-zero code. DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
@@ -76,6 +55,21 @@ See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
See [Workspace Recipe](/docs/recipes/multi-package-workspace). See [Workspace Recipe](/docs/recipes/multi-package-workspace).
## Bootloader / pure NASM OS image
Use `kind = "flat-bin"` (NASM `-f bin`) and optional `[archive]` for a FAT disk image.
See [OS-dev recipe](/docs/recipes/os-flat-bin-archive).
## How do I choose a download mirror?
`dcrup install` uses `--mirror auto` by default and tries **cf → gh → sf → ya**.
```bash
dcrup install stable --mirror cf
export DCRUP_MIRROR=ya
```
## Lock file ## Lock file
`dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`. `dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`.

View File

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

View File

@@ -4,28 +4,75 @@ sidebar_label: Installation
# 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 ```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 ```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 ```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) ## Arch Linux (AUR)
```sh ```sh
@@ -45,11 +92,12 @@ brew install dcr
sudo snap install dcrup sudo snap install dcrup
``` ```
> If classic Snap Store publishing is unavailable, install the `.snap` from [GitHub Releases](https://github.com/dexoron/dcr/releases/latest) with `--dangerous`.
## Nix (flake) ## Nix (flake)
```sh ```sh
nix run github:dexoron/dcr nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr nix profile install github:dexoron/dcr
``` ```
@@ -59,51 +107,40 @@ nix profile install github:dexoron/dcr
cargo install 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 ```sh
curl -fsSL https://dcr.dexoron.su/install.sh | sh cargo install dcr --features archive
```
## BSD (script)
```sh
curl -fsSL https://dcr.dexoron.su/install_bsd.sh | sh
```
## Windows (PowerShell)
```powershell
irm https://dcr.dexoron.su/install.ps1 | iex
``` ```
## From source ## From source
```sh ```sh
git clone https://github.com/dexoron/dcr.git git clone https://github.com/dexoron/dcr.git
cd dcr && cargo build --release cd dcr
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
``` ```
## Post-install ## Post-install
Verify the installation:
```bash ```bash
dcr --version dcr --version
dcrup show # if installed via dcrup
``` ```
Man pages are available after installation: Man pages (package installs / release assets):
```bash ```bash
man dcr man dcr
man dcr-build man dcr-build
``` ```
To use the registry, create `~/.dcr/config.toml`: Registry (optional) — `~/.dcr/config.toml`:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```

View File

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

View File

@@ -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. > **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 ## Rust dependencies
DCR is written in Rust. The following notable Rust crates are statically linked: DCR is written in Rust. The following notable Rust crates are statically linked:
| Crate | License | | Crate | License |
| --------------------------------------------- | ------------------------ | | ------------------------------------------------------- | ----------------- |
| [`reqwest`](https://crates.io/crates/reqwest) | MIT OR Apache-2.0 | | [`ureq`](https://crates.io/crates/ureq) | MIT OR Apache-2.0 |
| [`rustls`](https://crates.io/crates/rustls) | Apache-2.0 OR ISC OR MIT | | [`serde`](https://crates.io/crates/serde) | 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`](https://crates.io/crates/toml) | MIT OR Apache-2.0 | | [`toml_edit`](https://crates.io/crates/toml_edit) | MIT OR Apache-2.0 |
| [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 | | [`serde_json`](https://crates.io/crates/serde_json) | MIT OR Apache-2.0 |
| [`git2`](https://crates.io/crates/git2) | MIT OR Apache-2.0 | | [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 |
| [`openssl`](https://crates.io/crates/openssl) | Apache-2.0 | | [`glob`](https://crates.io/crates/glob) | MIT OR Apache-2.0 |
| [`tokio`](https://crates.io/crates/tokio) | MIT | | [`self-replace`](https://crates.io/crates/self-replace) | MIT OR Apache-2.0 |
| [`hyper`](https://crates.io/crates/hyper) | MIT | | [`ctrlc`](https://crates.io/crates/ctrlc) | 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 ## Additional credits

View File

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

View File

@@ -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 ## Target Directory
On Linux with explicit target: By default, the compilation output directories are structured as follows:
``` * **Linux and BSD**: Always output to `target/\<triple>/\<profile>/` (using host triple if no target is specified).
target/<triple>/<profile>/ * **macOS and Windows (without target)**: Output to `target/\<profile>/`.
``` * **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`.
On macOS/Windows or without target:
```
target/<profile>/
```

View File

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

View File

@@ -6,7 +6,7 @@ sidebar_label: Dependencies
## Formats ## Formats
The `[dependencies]` section supports three formats: The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies:
### String (registry) ### String (registry)
@@ -23,10 +23,10 @@ The version string is used as-is for registry lookup.
```toml ```toml
[dependencies] [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) ### Table (path)
@@ -35,33 +35,73 @@ Fields: `git`, `branch`, `tag`, `rev`.
mylib = { path = "../mylib" } mylib = { path = "../mylib" }
``` ```
For a prebuilt external library, specify its layout explicitly. The three
arrays are paths relative to the dependency root (`include`, `lib`) and linker
names (`libs`):
```toml
[dependencies]
dcr-math = { path = "../deps/dcr-math", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
### Table (`pkg-config`)
Use an installed `.pc` package when the library is provided by the operating system
or another system package manager. DCR invokes `pkg-config --cflags` and
`pkg-config --libs`, preserving include, library, linker, and other flags:
```toml
[dependencies]
fmt = { pkg-config = "fmt" }
openssl = { pkg-config = ["openssl", "libcrypto"] }
```
The `pkg-config` executable must be available in `PATH`. The named `.pc` files must
be available through pkg-config's standard search paths or via `PKG_CONFIG_PATH`.
These dependencies are not downloaded or built by DCR; they are recorded in
`dcr.lock` with a `pkg-config+...` source.
## Registry ## Registry
DCR uses a package registry for dependency lookup by name. DCR uses a package registry for dependency lookup by name.
```toml ```toml
# ~/.dcr/config.toml # ~/.dcr/config.toml
[[registry]] [registry.default]
name = "default" url = "https://index.dcr.dexoron.tech"
url = "https://index.dcr.pm" priority = 1
``` ```
Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`. Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`.
## Git dependencies ## 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 * `branch` — switch to a branch
* `tag` — switch to a tag * `tag` — switch to a tag
* `rev` — switch to a specific commit * `rev` — switch to a specific commit
* `features` — feature flags (parsed, but does not affect build) * `features` — feature flags (parsed, but does not affect build)
Cache path: `~/.dcr/git/\<hash>/`.
## Path dependencies ## 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 ```toml
[dependencies] [dependencies]
@@ -69,16 +109,51 @@ mylib = { path = "/abs/path/to/lib" }
mylib = { path = "../relative/path" } mylib = { path = "../relative/path" }
``` ```
For DCR packages, the package name from `dcr.toml` is used for linking (so the dependency key may differ from the library name). Header resolution includes the packaged `target/include` directory and link search includes `target/lib`.
### Recommended library layouts
Buildable DCR library:
```text
dcr-math-lib/
├── dcr.toml
└── src/
├── dcr_math.c
└── dcr_math.h
```
Prebuilt library:
```text
dcr-math-lib/
├── include/
│ └── dcr_math.h
└── lib/
└── libdcr-math.a # or .so / .lib
```
`libs` contains linker names without the `lib` prefix and file extension: use
`["dcr-math"]` for `libdcr-math.a`.
If one repository contains both forms, keep the prebuilt files in `include/` and `lib/` and select the mode explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
For a local copy, replace `git` with `path = "../dcr-math-lib"`. In `prebuild` mode DCR does not run the dependency build, even when `dcr.toml` is present.
## dcr.lock ## dcr.lock
Dependency lock file. Contains package names and sources. Dependency lock file. Contains package names and sources.
Created during `dcr build` 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 ## Resolution process
1. Load all dependencies (registry → git → path) 1. Resolve dependency sources (registry → git → path)
2. For path deps: recursively read their `dcr.toml` 2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref
3. For registry deps: search `index.json` 3. Build DCR package dependencies recursively
4. For git deps: clone to cache 4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler
5. 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`. 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 ### 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). Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib).
### macOS ### macOS
``` ```
target/<profile>/ target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
``` ```
Architectures: `x86_64`, `aarch64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
@@ -31,10 +32,11 @@ Extensions: `.dylib` (sharedlib), `.a` (staticlib).
### Windows ### Windows
``` ```
target/<profile>/ target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
``` ```
Architectures: `x86_64`, `aarch64`. Architectures: `x86_64`, `aarch64`.
Environments: `msvc` (default), `gnu` (MinGW).
Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI). Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI).

View File

@@ -43,7 +43,10 @@ dcr build # build all packages in dependency order
dcr build --workspace app # build only app (dependencies built automatically) dcr build --workspace app # build only app (dependencies built automatically)
``` ```
When building a workspace, 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 ## Clean
@@ -65,3 +68,21 @@ standard = "c17"
# member inherits language and standard # 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> <summary>Quick reference</summary>
```bash ```bash
# Installation # Installation (dcrup)
curl -fsSL https://dcr.dexoron.su/install.sh | sh 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 # Create a project
dcr new my-app dcr new my-app
@@ -51,8 +54,9 @@ dcr gen vscode
* **Incremental builds** — mtime + `.d` headers + SHA256 fingerprint * **Incremental builds** — mtime + `.d` headers + SHA256 fingerprint
* **Parallel compilation** — thread::scope, atomic task queue * **Parallel compilation** — thread::scope, atomic task queue
* **4 backends** — gcc/clang, MSVC/clang-cl, GAS (ARM), NASM (x86) * **7 backends** — gcc/clang (unix_cc), MSVC/clang-cl (msvc), GAS, NASM, MASM, FASM, LLVM IR
* **7 project kinds** — bin, staticlib, sharedlib, efi, elf, none, custom * **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 * **Cross-compilation** — short names and full triples
* **Profiles** — debug / release with field overrides * **Profiles** — debug / release with field overrides
* **Workspaces** — multi-package projects with topological sort * **Workspaces** — multi-package projects with topological sort

View File

@@ -4,6 +4,209 @@ sidebar_label: Changelog
# Changelog # Changelog
## 0.9.5 (2026-10-21)
* **Structured CLI output** — shared helpers now provide Cargo-like human, plain, and JSON output modes.
* **Color and diagnostics policy** — `--color`, `NO_COLOR`, `--quiet`, and `--verbose` are applied consistently across commands.
* **Build reporting** — lifecycle events and compiler diagnostics are available as structured JSON events.
* **Output lab** — sandbox scenarios cover help, lifecycle commands, compiler warnings/errors, stream capture, and broken pipes.
## 0.9.1 (2026-09-13)
* **`pkg-config` dependencies** — declare `fmt = { pkg-config = "fmt" }` or multiple package names in `[dependencies]`; DCR applies `.pc` compiler/linker flags and records the resolved package in `dcr.lock`.
* **`dcr add` support for `pkg-config`** — easily add system package dependencies with `dcr add fmt pkg-config:fmt` or `dcr add openssl pkg:openssl,libcrypto`.
* **`dcr tree` & IDE integration** — `pkg-config` packages are marked in `dcr tree` and resolved into compiler flags in `dcr gen` (`compile_commands.json`).
* **Fixed `dcr new` in non-ASCII / spaced paths** — initializing projects from folders with non-ASCII characters or spaces no longer fails validation.
## 0.9.0 (2026-08-31)
* **Download mirrors in `dcrup`** — `--mirror auto|cf|gh|sf|ya` and `DCRUP_MIRROR`.
Default `auto` tries **cf → gh → sf → ya** (CloudFlare CDN, GitHub, SourceForge, Yandex CDN).
* **Complete Path/Git dependencies** — DCR packages from `path` and `git` are built before their consumer. Git sources are cached in `~/.dcr/git`, support `branch`/`tag`/`rev`, and record the exact commit in `dcr.lock`.
* **Build and prebuild modes** — `path` and `git` dependencies can build a DCR package from `dcr.toml` or link existing `include`/`lib`/`libs` artifacts; `mode = "build"` / `"prebuild"` selects explicitly when both forms are present.
* **Prebuilt dependency examples** — documentation now shows the `dcr-math-lib` Git repository and recommended build/prebuilt layouts for both `git` and `path`.
* **Transitive dependency builds and cycle reporting** — DCR recursively builds DCR packages and reports a clear dependency chain for cycles.
* **Bare path arguments for `dcr add`** — `dcr add mylib ../mylib` now works in addition to the explicit `path:` form.
* **Removed `install.sh` / `install.ps1` / `install_bsd.sh`** — superseded by `dcrup`.
## 0.8.5 (2026-08-08)
* **`package.dcr-version`** — optional CLI version pin in `dcr.toml`.
`dcr new` / `dcr init` write the current version. On config load:
* missing / empty pin → warn "add dcr-version";
* dcr older than pin → warn "update dcr";
* dcr newer than pin → warn "check changelog, update pin";
* equal → silent.
Commands do not fail, warning only (once per path per process).
## 0.8.4 (2026-08-04)
**Added:**
* **`.dcr/` directory** — shared machine-readable build facts for IDE integrations:
* `.dcr/compile_commands.json`
* `.dcr/build-info.json` (`schemaVersion`, `artifact_path`, `profile`, …)
* `.dcr/toolchain.json` (compiler/debugger paths, moc/uic/rcc)
* `.dcr/ide/` (placeholder for IDE lock files)
* **`dcr gen project-info`** — `target`, `target_dir`, `artifact_path`, `artifact_kind`, `source_roots`, `include_globs`, `exclude_globs`; absolute/canonical paths.
* **`dcr build --print-artifact-path`** — one absolute artifact path line on stdout after a successful build.
* **`dcr gen … --quiet` / `-q`** — suppress human success logs for gen subcommands.
* **`.clangd`** — created on first gen with `CompilationDatabase: .dcr` (`# managed by dcr gen`); custom `.clangd` is not overwritten.
* **Helpers** `canonicalize_path`, `atomic_write`, `ensure_dcr_dir`; pure `resolve_artifact_path` via `platform::*`.
* **`dcr new` / `dcr init`** — add `.dcr/` to `.gitignore`.
**Changed (breaking):**
* **`compile_commands.json` moved** from project root to **`.dcr/compile_commands.json`**.\
clangd discovers it via `.clangd` / `--compile-commands-dir=.dcr`.\
CLion and VSCode generators updated accordingly.
* **Atomic write** for compile_commands (tmp + rename).
* **`gen vscode` / `gen clion` launch/run** — use the same artifact path resolver as `project-info` / `build-info.json`.
**Fixed:**
* Launch configs no longer hardcode `target/\<profile>/\<name>` without the Linux triple segment.
* Symlink/mount roots: best-effort canonicalize for root and compile database paths.
## 0.8.3 (2026-08-03)
### Added
* **`dcr run -- \<args>...`** — cargo-style argument forwarding after a bare `--`\
(`dcr run --release -- --test_help`). Applies to direct binary runs and `[run].cmd`.
* **Tests** — host target section `ldflags` without CLI `--target`; run-arg forwarding; `split_double_dash` unit tests.
### Changed
* **Native builds resolve the host triple** — without `--target` / package `build.target`, host sections such as\
`[build.x86_64-unknown-linux-gnu]` apply again (`cflags` / `ldflags` / toolchain).\
Previously the target was empty and those sections were ignored while artifacts already used the host triple path.
* **Empty target** — no more `Unknown target ''` warning.
* **`dcr run --help` / man `dcr-run`** — document `--` forwarding.
### Fixed
* **Native artifact paths on Windows and macOS** — without an explicit `--target` / `build.target`, artifacts use `target/\<profile>`, so `dcr run` and flat-bin find the build output.
* Target-specific `ldflags` missing on native host builds (e.g. micro-lang + `libsct-elf`).
* Spurious empty-target warning.
## 0.8.2 (2026-07-22)
### Added
* **Compile progress `[N/M]`** — live TTY status line (`compile pkg v0.1.0 [12/41]`) so long mono-package builds do not look hung.
* **DCR status style** — fixed-width verbs: `project`, `compile`, `dep`, `ready`, `pack`, `done`, `run`.
* **Cargo feature `archive`** — optional FAT packing via `fatfs` (`cargo build --features archive`). Release CI builds with the feature; without it `[archive]` fails with a clear message.
* **Tests** — `flat_bin_nasm_build`, package `build.target` without CLI `--target`, stricter workspace `clean --all`.
* **CI expansion** — unit + integration on Linux/macOS/Windows, archive feature job, rust-cache, clippy default + all-features (see `.github/workflows/ci.yml`).
### Changed
* **No forced host triple from CLI** — without `--target`, package/member `build.target` is honored (bare-metal / ISO `post_steps` paths).
* **Relative include/lib flags** (`-I`, `-i`, `-isystem`, `-idirafter`, `-L`, `-T`) absolutized against the package root under workspace builds.
* **`dcr clean --all`** — no spam for members without a local `target/` (shared root `target/`).
* **`error` / `warn`** — red / yellow on stderr; CLI fully English (`Hint:`).
* **Help / man** — list `add`, `lint`, `setup`; unknown command exits with code 1.
* **Tool NotFound** — `linker not found: ld.lld …` / `{tool} not found …` instead of raw `os error 2`.
## 0.8.1 (2026-07-20)
### Added
* **`build.kind = "flat-bin"`** — raw binary (default `.bin`) for OS-dev payloads:
* **NASM** — `-f bin` → `\<stem>.bin`
* **FASM** — direct output (`format binary` in source)
* **GAS / MASM / LLC** — object → `objcopy -O binary` → `\<stem>.bin`
* **C/C++** — objects → freestanding link → `objcopy -O binary` → `\<name>.bin`
* Requires `llvm-objcopy` / `objcopy` / `gobjcopy` except for NASM/FASM direct emit
* **`[archive]` section** — FAT12/16/32 disk images after build (`output`, `format`, `size`, `offset`, `label`, `bootsector`, `layout`). From 0.8.2 requires feature `archive`.
* **Single-file `build.roots`** — a root may be a single source or header file, not only a directory.
### Changed
* **`--force`** also re-runs `build.steps` and `build.post_steps`.
* **`dcr run` on workspace-only root** — if `[run].cmd` is set, run that after build; otherwise delegate to a workspace member.
## 0.8.0 (2026-07-18)
### Added
* **Dedicated Build Engine (`src/core/build/engine.rs`)** — decoupled the build orchestration logic completely from the CLI front-end wrapper in `src/cli/build.rs` to a reusable, decoupled core build engine.
* **Polymorphic Language Model (`Language` trait)** — introduced the abstract `Language` trait (`src/core/build/language/mod.rs`). File scanning, compiler resolution, and flags handling are now encapsulated in dedicated language modules for C, C++ (including Qt code generation), LLVM IR, and ASM (GAS, NASM, FASM, MASM).
* **Polymorphic Compilation Dispatch (`Builder` trait)** — introduced the `Builder` trait to generalize builder invocations (`src/core/build/builder/mod.rs`). Consolidated GCC/Clang logic into `builder/cc_common.rs` and Microsoft Visual C++ logic into `builder/msvc/`.
* **Per-Language Configuration overrides (`[build.\<lang>]`)** — introduced support for configuring language-specific compiler, standard, and flags (e.g. `[build.c]`, `[build.cxx]`, `[build.asm]`) independently in `dcr.toml`.
* **Automatic Workspace Dependency Injection** — during workspace builds, include/lib paths of dependent workspace members (including their source headers, local `include/` folders, and build target `target/include` / `target/lib` folders) are automatically resolved and injected.
* **`BuildReporter` Event System** — decoupled build orchestration output into a structured event-driven reporter model (`src/core/build/report.rs`), making DCR suitable for library embedding and IDE integrations without stderr capturing.
* **Build Cancellation Support** — introduced thread-safe cancellation tokens (`Arc\<AtomicBool>`) allowing clients to safely abort compile runs mid-execution.
* **TOML Formatting & Custom Keys Preservation** — migrated the config editor to `toml_edit`, preserving all unknown/user-defined TOML keys, structures, and comments during file write operations (e.g., in `dcr add`).
* **Path Dependencies Target Include Resolution** — local path dependencies configured via tables now correctly expose headers built and packaged into their `target/include` folder to consumer packages.
* **Modular Integration Test Suite** — refactored the monolith `tests/cli_basic.rs` file into clean, specialized integration tests: `cli_build.rs`, `cli_deps.rs`, `cli_lint.rs`, `cli_new.rs`, `cli_qt.rs`, `cli_test.rs`, `cli_workspace.rs`.
### Changed
* **Consolidated Linking and Archiving** — artifact generation (linking executables/shared libraries and archiving static libraries) consolidated into a single `src/core/build/builder/artifact.rs` module.
* **Workspace-Aware member execution** — `dcr run` executed at the workspace root of a `workspace_only` project now triggers the member build inside the workspace context using the `--workspace` parameter, preventing standalone build issues.
* **Elimination of Global State** — removed global variables and states from the build core, encapsulating build logic inside isolated `BuildContext` structs for thread safety.
* **Build Cache Separation** — relocated mtime tracking, incremental caching, and header-dependency checking logic to `src/core/build/cache.rs`.
* **Modularized Pre-build Steps** — decoupled generator scripts and pre-build commands parsing into `src/core/build/steps.rs`.
## 0.7.4 (2026-06-17)
### Added
* **Native Qt support** — automatic meta-object handling (MOC, UIC, RCC) added when `build.qt = true` is set in `dcr.toml`.
* **`dcr lint` command** — C/C++ static analysis via `clang-tidy`. Supports `--fix` for automatic fixes. Respects `build.roots` and `build.src_disable` from config.
* **Three new assembler backends**:
* **MASM** (`compiler = "ml"` / `"ml64"`) — Microsoft Macro Assembler.
* **FASM** (`compiler = "fasm"`) — Flat Assembler.
* **LLVM IR** (`compiler = "llc"`) — compiles `.ll` files via `llc -filetype=obj`.
* **Shared ASM pipeline** — linking and archiving logic consolidated into `core/builder/asm.rs`. Adding a new assembler backend now takes ~30 lines.
* **Filesystem utilities** — `to_hex()` and `home_dir()` extracted to `utils/fs.rs`.
* **Build utilities** — `normalize_target()`, `normalize_kind()`, `normalize_platform()`, `default_profile_flags()` extracted to `utils/build.rs`.
* **Backend helpers** — `asm_lang_flag()`, `source_extensions()`, `elapsed_secs()` added to `core/builder/common.rs`.
* **Full Bare-Metal / Freestanding Automation** — introduced the `build.freestanding = true` configuration option. When enabled (or when a bare-metal target is detected), DCR automatically injects `-ffreestanding` during compilation and both `-nostdlib` and `-static` during linking.
* **Artifact Optimization (LTO & Strip)** — added `build.lto` (auto-injects `-flto` for compiler and linker) and `build.strip` (automatically strips debug symbols via linker `-s` flag) options to `dcr.toml`.
* **Compilation Thread Control** — added the `build.codegen-units` option to strictly limit the maximum number of parallel jobs utilized by the custom `parallel_build` worker pool.
* **Panic Behavior Management** — added `build.panic = "abort"` support. For C++ targets, it automatically strips exception handling and unwind tables via `-fno-exceptions`, `-fno-unwind-tables`, and `-fno-asynchronous-unwind-tables`.
### Changed
* **Intelligent Default Flags Generation** — automated injection of fallback optimization (`-O3`/`-O0`), debug (`-g`), and warning (`-Wall -Wextra`) flags is now suppressed for bare-metal and freestanding builds if `build.cflags` are overridden.
* **Centralized Bare-Metal Detection** — relocated the `is_bare_metal_target` helper to common build utilities (`src/utils/build.rs`) for unified access across the building core.
* **Architectural Refactoring**:
* Renamed `src/config.rs` to `src/templates.rs`.
* Started consolidation of configuration and build orchestration logic.
## 0.7.3 (2026-06-13)
### Added
* **`--vcs` option for `new` and `init` commands** — introduced explicit version control system selection via `--vcs \<git|none>`.
* **Git metadata integration in `--version`** — the CLI now appends the current short commit hash and a `-dirty` suffix if there are uncommitted changes in the DCR repository.
* **Automatic `.gitignore` generation** — Git repository initialization now automatically writes a `.gitignore` file excluding the `/target` directory.
* **Nested repository prevention** — automatic Git initialization is now skipped if `dcr new` or `dcr init` is executed inside an already existing Git repository.
* **VCS verification tests** — added `new_vcs_options_work` and `init_vcs_options_work` integration tests to ensure reliable repository behavior.
### Changed
* **Complete removal of `git2` dependency** — all Git actions (dependency fetching, VCS setup, status checks) are now delegated to the system `git` executable via `Command`. This simplifies compilation and drops the need for `vendored` and `openssl` features.
* **Migrated from `reqwest` to `ureq`** — replaced the heavy `reqwest` crate in `flag_update.rs` with the lightweight synchronous `ureq 2.10` client, reducing overhead and the final binary size.
## 0.7.2 (2026-06-07)
### Added
* `default_target_triple()` now respects `target_env` — Linux (gnu/musl) and Windows (msvc/gnu) use the correct environment instead of hardcoded values.
### Fixed
* **macOS Apple Silicon builds failed with `_main` undefined** — `--target=` is now passed to ldflags, not just cflags. `default_target_triple()` uses `std::env::consts::ARCH` on macOS instead of hardcoded `x86_64`.
* **GitHub Stars and GPL-3.0 badges not rendering in README** — badge block converted to pure HTML.
### Changed
* Default target resolution extracted into shared `default_target_triple()` — removed duplication across build, run, clean.
## 0.7.1 (2026-06-02) ## 0.7.1 (2026-06-02)
### Added ### Added

View File

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

View File

@@ -15,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 git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub shorthand dcr add mylib github:user/repo # GitHub shorthand
dcr add mylib gitlab:user/repo # GitLab shorthand dcr add mylib gitlab:user/repo # GitLab shorthand
dcr add fmt pkg-config:fmt # system package via pkg-config
dcr add openssl pkg:openssl,libcrypto # multiple pkg-config packages
``` ```
Source prefixes: Source prefixes:
@@ -23,6 +25,7 @@ Source prefixes:
* `git:` — generic git URL * `git:` — generic git URL
* `github:` — expands to `https://github.com/\<user>/\<repo>` * `github:` — expands to `https://github.com/\<user>/\<repo>`
* `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>` * `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>`
* `pkg-config:` / `pkg:` — one or more packages resolved by `pkg-config`
* `http://` / `https://` / `git@` — full URL * `http://` / `https://` / `git@` — full URL
Flags: Flags:
@@ -31,7 +34,12 @@ Flags:
* `--tag \<name>` — git tag * `--tag \<name>` — git tag
* `--rev \<hash>` — git commit * `--rev \<hash>` — git commit
If source is omitted — DCR searches connected registries. 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` ## `dcr tree`

View File

@@ -12,8 +12,13 @@ Only ASCII letters, digits, underscores `_` and hyphens `-` are allowed in the p
```bash ```bash
dcr new my-app 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: Generates:
* `dcr.toml` with basic fields * `dcr.toml` with basic fields
@@ -24,8 +29,12 @@ Generates:
Initializes a DCR project in the current (empty) directory. Initializes a DCR project in the current (empty) directory.
```bash ```bash
mkdir app && cd app
dcr init 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`. 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: If `~/.dcr/config.toml` is not found, DCR returns an error. Create it manually:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```
## `dcr --help` ## `dcr --help`

View File

@@ -8,6 +8,7 @@ sidebar_label: Contributing
```bash ```bash
git clone https://github.com/dexoron/dcr git clone https://github.com/dexoron/dcr
# or a source mirror: GitVerse / SourceCraft / SourceForge / GitLab (see README)
cd dcr cd dcr
cargo build cargo build
``` ```
@@ -42,10 +43,11 @@ cargo test --all-targets
## CI ## CI
CI runs: CI runs (see `.github/workflows/ci.yml`):
* `cargo fmt --check` * `cargo fmt --check`
* `cargo clippy --all-targets -- -D warnings` * `cargo clippy` (default + `--all-features`)
* `cargo test --all-targets` * `cargo check --all-targets --all-features`
* Build on Linux, macOS, Windows * Unit + integration tests on Linux, macOS, Windows
* Integration tests * 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: **Solution:** Make sure `~/.dcr/config.toml` exists:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```
And check `DCR_INDEX_PATH`: And check `DCR_INDEX_PATH`:
@@ -39,27 +39,6 @@ which clang
Or specify explicitly via `[toolchain]` in `dcr.toml`. Or specify explicitly via `[toolchain]` in `dcr.toml`.
## openssl-sys build failed
When building DCR from source:
```
error: failed to run custom build command for openssl-sys
```
**Solution:** Install OpenSSL development headers:
```bash
# Ubuntu/Debian
sudo apt install libssl-dev
# Fedora
sudo dnf install openssl-devel
# macOS
brew install openssl
```
## Ctrl+C during build ## Ctrl+C during build
DCR handles SIGINT: interrupts the current compilation and exits with non-zero code. DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
@@ -76,6 +55,21 @@ See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
See [Workspace Recipe](/docs/recipes/multi-package-workspace). See [Workspace Recipe](/docs/recipes/multi-package-workspace).
## Bootloader / pure NASM OS image
Use `kind = "flat-bin"` (NASM `-f bin`) and optional `[archive]` for a FAT disk image.
See [OS-dev recipe](/docs/recipes/os-flat-bin-archive).
## How do I choose a download mirror?
`dcrup install` uses `--mirror auto` by default and tries **cf → gh → sf → ya**.
```bash
dcrup install stable --mirror cf
export DCRUP_MIRROR=ya
```
## Lock file ## Lock file
`dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`. `dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`.

View File

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

View File

@@ -4,28 +4,75 @@ sidebar_label: Installation
# 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 ```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 ```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 ```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) ## Arch Linux (AUR)
```sh ```sh
@@ -45,11 +92,12 @@ brew install dcr
sudo snap install dcrup sudo snap install dcrup
``` ```
> If classic Snap Store publishing is unavailable, install the `.snap` from [GitHub Releases](https://github.com/dexoron/dcr/releases/latest) with `--dangerous`.
## Nix (flake) ## Nix (flake)
```sh ```sh
nix run github:dexoron/dcr nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr nix profile install github:dexoron/dcr
``` ```
@@ -59,51 +107,40 @@ nix profile install github:dexoron/dcr
cargo install 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 ```sh
curl -fsSL https://dcr.dexoron.su/install.sh | sh cargo install dcr --features archive
```
## BSD (script)
```sh
curl -fsSL https://dcr.dexoron.su/install_bsd.sh | sh
```
## Windows (PowerShell)
```powershell
irm https://dcr.dexoron.su/install.ps1 | iex
``` ```
## From source ## From source
```sh ```sh
git clone https://github.com/dexoron/dcr.git git clone https://github.com/dexoron/dcr.git
cd dcr && cargo build --release cd dcr
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
``` ```
## Post-install ## Post-install
Verify the installation:
```bash ```bash
dcr --version dcr --version
dcrup show # if installed via dcrup
``` ```
Man pages are available after installation: Man pages (package installs / release assets):
```bash ```bash
man dcr man dcr
man dcr-build man dcr-build
``` ```
To use the registry, create `~/.dcr/config.toml`: Registry (optional) — `~/.dcr/config.toml`:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```

View File

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

View File

@@ -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. > **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 ## Rust dependencies
DCR is written in Rust. The following notable Rust crates are statically linked: DCR is written in Rust. The following notable Rust crates are statically linked:
| Crate | License | | Crate | License |
| --------------------------------------------- | ------------------------ | | ------------------------------------------------------- | ----------------- |
| [`reqwest`](https://crates.io/crates/reqwest) | MIT OR Apache-2.0 | | [`ureq`](https://crates.io/crates/ureq) | MIT OR Apache-2.0 |
| [`rustls`](https://crates.io/crates/rustls) | Apache-2.0 OR ISC OR MIT | | [`serde`](https://crates.io/crates/serde) | 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`](https://crates.io/crates/toml) | MIT OR Apache-2.0 | | [`toml_edit`](https://crates.io/crates/toml_edit) | MIT OR Apache-2.0 |
| [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 | | [`serde_json`](https://crates.io/crates/serde_json) | MIT OR Apache-2.0 |
| [`git2`](https://crates.io/crates/git2) | MIT OR Apache-2.0 | | [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 |
| [`openssl`](https://crates.io/crates/openssl) | Apache-2.0 | | [`glob`](https://crates.io/crates/glob) | MIT OR Apache-2.0 |
| [`tokio`](https://crates.io/crates/tokio) | MIT | | [`self-replace`](https://crates.io/crates/self-replace) | MIT OR Apache-2.0 |
| [`hyper`](https://crates.io/crates/hyper) | MIT | | [`ctrlc`](https://crates.io/crates/ctrlc) | 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 ## Additional credits

View File

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

View File

@@ -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 ## Target Directory
On Linux with explicit target: By default, the compilation output directories are structured as follows:
``` * **Linux and BSD**: Always output to `target/\<triple>/\<profile>/` (using host triple if no target is specified).
target/<triple>/<profile>/ * **macOS and Windows (without target)**: Output to `target/\<profile>/`.
``` * **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`.
On macOS/Windows or without target:
```
target/<profile>/
```

View File

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

View File

@@ -6,7 +6,7 @@ sidebar_label: Dependencies
## Formats ## Formats
The `[dependencies]` section supports three formats: The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies:
### String (registry) ### String (registry)
@@ -23,10 +23,10 @@ The version string is used as-is for registry lookup.
```toml ```toml
[dependencies] [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) ### Table (path)
@@ -35,33 +35,73 @@ Fields: `git`, `branch`, `tag`, `rev`.
mylib = { path = "../mylib" } mylib = { path = "../mylib" }
``` ```
For a prebuilt external library, specify its layout explicitly. The three
arrays are paths relative to the dependency root (`include`, `lib`) and linker
names (`libs`):
```toml
[dependencies]
dcr-math = { path = "../deps/dcr-math", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
### Table (`pkg-config`)
Use an installed `.pc` package when the library is provided by the operating system
or another system package manager. DCR invokes `pkg-config --cflags` and
`pkg-config --libs`, preserving include, library, linker, and other flags:
```toml
[dependencies]
fmt = { pkg-config = "fmt" }
openssl = { pkg-config = ["openssl", "libcrypto"] }
```
The `pkg-config` executable must be available in `PATH`. The named `.pc` files must
be available through pkg-config's standard search paths or via `PKG_CONFIG_PATH`.
These dependencies are not downloaded or built by DCR; they are recorded in
`dcr.lock` with a `pkg-config+...` source.
## Registry ## Registry
DCR uses a package registry for dependency lookup by name. DCR uses a package registry for dependency lookup by name.
```toml ```toml
# ~/.dcr/config.toml # ~/.dcr/config.toml
[[registry]] [registry.default]
name = "default" url = "https://index.dcr.dexoron.tech"
url = "https://index.dcr.pm" priority = 1
``` ```
Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`. Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`.
## Git dependencies ## 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 * `branch` — switch to a branch
* `tag` — switch to a tag * `tag` — switch to a tag
* `rev` — switch to a specific commit * `rev` — switch to a specific commit
* `features` — feature flags (parsed, but does not affect build) * `features` — feature flags (parsed, but does not affect build)
Cache path: `~/.dcr/git/\<hash>/`.
## Path dependencies ## 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 ```toml
[dependencies] [dependencies]
@@ -69,16 +109,51 @@ mylib = { path = "/abs/path/to/lib" }
mylib = { path = "../relative/path" } mylib = { path = "../relative/path" }
``` ```
For DCR packages, the package name from `dcr.toml` is used for linking (so the dependency key may differ from the library name). Header resolution includes the packaged `target/include` directory and link search includes `target/lib`.
### Recommended library layouts
Buildable DCR library:
```text
dcr-math-lib/
├── dcr.toml
└── src/
├── dcr_math.c
└── dcr_math.h
```
Prebuilt library:
```text
dcr-math-lib/
├── include/
│ └── dcr_math.h
└── lib/
└── libdcr-math.a # or .so / .lib
```
`libs` contains linker names without the `lib` prefix and file extension: use
`["dcr-math"]` for `libdcr-math.a`.
If one repository contains both forms, keep the prebuilt files in `include/` and `lib/` and select the mode explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
For a local copy, replace `git` with `path = "../dcr-math-lib"`. In `prebuild` mode DCR does not run the dependency build, even when `dcr.toml` is present.
## dcr.lock ## dcr.lock
Dependency lock file. Contains package names and sources. Dependency lock file. Contains package names and sources.
Created during `dcr build` 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 ## Resolution process
1. Load all dependencies (registry → git → path) 1. Resolve dependency sources (registry → git → path)
2. For path deps: recursively read their `dcr.toml` 2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref
3. For registry deps: search `index.json` 3. Build DCR package dependencies recursively
4. For git deps: clone to cache 4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler
5. 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`. 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 ### 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). Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib).
### macOS ### macOS
``` ```
target/<profile>/ target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
``` ```
Architectures: `x86_64`, `aarch64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
@@ -31,10 +32,11 @@ Extensions: `.dylib` (sharedlib), `.a` (staticlib).
### Windows ### Windows
``` ```
target/<profile>/ target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
``` ```
Architectures: `x86_64`, `aarch64`. Architectures: `x86_64`, `aarch64`.
Environments: `msvc` (default), `gnu` (MinGW).
Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI). Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI).

View File

@@ -43,7 +43,10 @@ dcr build # build all packages in dependency order
dcr build --workspace app # build only app (dependencies built automatically) dcr build --workspace app # build only app (dependencies built automatically)
``` ```
When building a workspace, 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 ## Clean
@@ -65,3 +68,21 @@ standard = "c17"
# member inherits language and standard # 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,46 +8,60 @@ sidebar_label: Введение
<summary>Быстрая справка</summary> <summary>Быстрая справка</summary>
```bash ```bash
# Установка(Linux/MacOS скрипт) # Installation (dcrup)
curl -fsSL https://dcr.dexoron.su/install.sh | sh 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 dcr new my-app
cd my-app cd my-app
# Собрать и запустить # Build and run
dcr build
dcr run dcr run
# Run tests
dcr test
# Add a dependency
dcr add fmt
# Generate IDE files
dcr gen vscode
``` ```
</details> </details>
## Содержание ## Содержание
| Раздел | Описание | | Раздел | Описание |
| ----------------------------------------------------- | -------------------------------------------- | | --------------------------------------------------- | -------------------------------------------- |
| [Getting Started](/docs/getting-started/installation) | Установка и первые шаги | | [Начало работы](/docs/getting-started/installation) | Установка и первые шаги |
| [Commands](/docs/commands/project-commands) | Все CLI-команды DCR | | [Команды](/docs/commands/project-commands) | Все CLI-команды DCR |
| [Reference](/docs/reference/dcr-toml) | Конфигурация, сборка, зависимости, платформы | | [Ссылка](/docs/reference/dcr-toml) | Конфигурация, сборка, зависимости, платформы |
| [Testing](/docs/testing/test-framework) | Встроенный фреймворк тестирования | | [Тестирование](/docs/testing/test-framework) | Встроенный фреймворк тестирования |
| [Recipes](/docs/recipes/cross-to-windows) | Типовые сценарии | | [Рецепты](/docs/recipes/cross-to-windows) | Типовые сценарии |
| [IDE Integration](/docs/ide-integration) | VS Code, CLion, compile_commands.json | | [Интеграция с IDE](/docs/ide-integration) | VS Code, CLion, compile_commands.json |
| [Self Update](/docs/self-update) | Автообновление | | [Автоматическое обновление](/docs/self-update) | Автообновление |
| [FAQ](/docs/faq) | Частые вопросы | | [Часто задаваемые вопросы](/docs/faq) | Частые вопросы |
| [Changelog](/docs/changelog) | История версий | | [Журнал изменений](/docs/changelog) | История версий |
| [License](/docs/license) | Лицензии DCR и вендорных библиотек | | [Лицензия](/docs/license) | Лицензии DCR и вендорных библиотек |
| [Contributing](/docs/contributing) | Разработка DCR | | [Внести свой вклад](/docs/contributing) | Разработка DCR |
## Особенности ## Особенности
* **Инкрементальная сборка** — mtime + `.d` headers + SHA256 fingerprint * **Инкрементальная сборка** — mtime + `.d` headers + SHA256 fingerprint
* **Параллельная компиляция** — thread::scope, атомарная очередь задач * **Параллельная компиляция** — thread::scope, атомарная очередь задач
* **4 бэкенда** — gcc/clang, MSVC/clang-cl, GAS, NASM * **7 backends** — gcc/clang (unix_cc), MSVC/clang-cl (msvc), GAS, NASM, MASM, FASM, LLVM IR
* **7 типов проекта** — bin, staticlib, sharedlib, efi, elf, none, custom * **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 * **Cross-compilation** — short names (linux, windows, macos) и полные triples
* **Профили** — debug / release с переопределением любого поля * **Профили** — debug / release с переопределением любого поля
* **Workspaces** — мультипакетные проекты с топологической сортировкой * **Workspaces** — мультипакетные проекты с топологической сортировкой
* **Registry + Git + Path** — три механизма зависимостей * **Registry + Git + Path** — три механизма зависимостей
* **Генерация IDE** — VS Code, CLion, compile_commands.json, JSON metadata * **Генерация IDE** — VS Code, CLion, compile_commands.json, JSON metadata
* **pkg-config** — автоматический поиск системных библиотек * **pkg-config** — автоматический поиск системных библиотек
* **Per-command `--help`** — `dcr build --help`, `dcr new --help`, etc. * **Команда `--help` для каждой команды** — `dcr build --help`, `dcr new --help` и т. д.
* **Man pages** — `man dcr`, `man dcr-build`, `man dcr-new` * **Справочные страницы** — `man dcr`, `man dcr-build`, `man dcr-new`

View File

@@ -1,54 +1,257 @@
--- ---
sidebar_label: Changelog sidebar_label: Список изменений
--- ---
# Changelog # Список изменений
## 0.7.1 (2026-06-02) ## 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)
### Добавлено: ### Добавлено:
* **`--help` for all commands** — `dcr build --help`, `dcr run --help`, `dcr new --help`, * **`dcr run -- \<args>...`** — cargo-style argument forwarding after a bare `--`\
`dcr init --help`, `dcr clean --help`, `dcr add --help`, `dcr fmt --help`, (`dcr run --release -- --test_help`). Applies to direct binary runs and `[run].cmd`.
`dcr setup --help`, `dcr tree --help`, `dcr gen --help`, `dcr --update --help`, * **Tests** — host target section `ldflags` without CLI `--target`; run-arg forwarding; `split_double_dash` unit tests.
`dcr test --help`. All output uses styled headers (green) and usage lines (cyan).
* **Man pages** — 12 troff pages in `man/man1/`: `dcr.1`, `dcr-build.1`,
`dcr-run.1`, `dcr-new.1`, `dcr-init.1`, `dcr-clean.1`, `dcr-add.1`, `dcr-test.1`,
`dcr-gen.1`, `dcr-fmt.1`, `dcr-tree.1`, `dcr-setup.1`.
* **Man pages in all packaging** — install.sh, install_bsd.sh, AUR PKGBUILD,
Debian (cargo-deb), RPM (cargo-generate-rpm), Nix (postInstall), Homebrew
(resource), Snap, GitHub Release assets.
* **Project name validation** — `dcr init` and `dcr new` now validate names before
creating files. Only ASCII letters, digits, `_` and `-` are allowed.
* **`documentation` and `homepage` fields** — added to `Cargo.toml`.
* **Release profile optimizations** — `opt-level = "z"`, LTO, `codegen-units = 1`,
`panic = "abort"`, `strip = true` for smaller binaries.
* **Linux i686, armv7, riscv64 targets** — added to release workflow and install scripts.
* **Linux musl i686, armv7 targets** — cross-compiled via zigbuild in CI.
* **AUR packages** — `dcr-dev`, `dcr-dev-bin` publishing workflow.
* **Snap publishing** — automated Snapcraft publishing in CI.
* **Snap badge** — in README.
### Изменено: ### Изменено:
* **`validate_package_name` made public** — callable from CLI commands. * **Native builds resolve the host triple** — without `--target` / package `build.target`, host sections such as\
* **README platform table** — reorganized: libc variants as separate OS rows, `[build.x86_64-unknown-linux-gnu]` apply again (`cflags` / `ldflags` / toolchain).\
removed extra columns. Linux architecture list updated. Previously the target was empty and those sections were ignored while artifacts already used the host triple path.
* **`gen.rs` no-args output** — now uses styled output instead of raw `eprintln!`. * **Empty target** — no more `Unknown target ''` warning.
* **`tree.rs`, `fmt.rs`, and `setup.rs`** — now accept arguments for `--help`. * **`dcr run --help` / man `dcr-run`** — document `--` forwarding.
* **README install commands** — `| bash` → `| sh` for POSIX compatibility.
### Исправлено: ### Исправлено:
* **`dcr new \<invalid-name>` creates directory then fails** — validation now * **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.
happens before any file operations. * Target-specific `ldflags` missing on native host builds (e.g. micro-lang + `libsct-elf`).
* **`dcr init` on invalid directory name** — same fix. * Spurious empty-target warning.
* **Man pages missing in installed packages** — now shipped in all formats.
* **Windows drive letter false positive** — in dependency file parser.
* **CRLF (`\r\n`) breaks dependency parser** — now handles mixed line endings.
* **Newline after backslash not consumed** — in `parse_d_file` escape handling.
## 0.7.0 (2026-06-01) ## 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`,
`dcr test --help`. Во всех результатах вывода используются стилизованные заголовки (зелёного цвета) и строки с информацией об использовании (голубого цвета).
* **Справочные страницы** — 12 страниц в формате troff в каталоге `man/man1/`: `dcr.1`, `dcr-build.1`,
`dcr-run.1`, `dcr-new.1`, `dcr-init.1`, `dcr-clean.1`, `dcr-add.1`, `dcr-test.1`,
`dcr-gen.1`, `dcr-fmt.1`, `dcr-tree.1`, `dcr-setup.1`.
* **Справочные страницы во всех пакетах** — install.sh, install_bsd.sh, PKGBUILD из AUR,
Debian (cargo-deb), RPM (cargo-generate-rpm), Nix (postInstall), Homebrew
(ресурс), Snap, ресурсы релизов GitHub.
* **Проверка имени проекта** — команды `dcr init` и `dcr new` теперь проверяют имена перед созданием файлов
. Допускаются только буквы ASCII, цифры, символы `_` и `-`.
* **Поля `documentation` и `homepage`** — добавлены в файл `Cargo.toml`.
* **Оптимизации профиля релиза** — `opt-level = "z"`, LTO, `codegen-units = 1`,
`panic = "abort"`, `strip = true` для уменьшения размера бинарных файлов.
* **Платформы Linux i686, armv7, riscv64** — добавлены в рабочий процесс выпуска и скрипты установки.
* **Платформы Linux musl i686 и armv7** — скомпилированы с помощью zigbuild в системе непрерывной интеграции (CI).
* **Пакеты AUR** — рабочий процесс публикации `dcr-dev`, `dcr-dev-bin`.
* **Публикация Snap** — автоматическая публикация Snapcraft в рамках непрерывной интеграции (CI).
* **Значок Snap** — в файле README.
### Changed
* **`validate_package_name` стал общедоступным** — его можно вызывать из команд CLI.
* **Таблица платформы README** — реорганизована: варианты libc вынесены в отдельные строки по ОС,
удалены лишние столбцы. Обновлен список архитектур Linux.
* **Вывод `gen.rs` без аргументов** — теперь используется стилизованный вывод вместо необработанного `eprintln!`.
* **`tree.rs`, `fmt.rs` и `setup.rs`** — теперь поддерживают аргументы для опции `--help`.
* **Команды установки из файла README** — `| bash` → `| sh` для обеспечения совместимости с POSIX.
### Fixed
* **`dcr new \<invalid-name>` создает каталог, а затем завершается с ошибкой** — теперь проверка
выполняется до начала любых операций с файлами.
* **`dcr init` при указании недопустимого имени каталога** — то же исправление.
* **Отсутствующие справочные страницы в установленных пакетах** — теперь поставляются во всех форматах.
* **Ложное срабатывание по букве диска Windows** — в модуле анализа файлов зависимостей.
* **CRLF (`\r\n`) вызывает сбой в работе парсера зависимостей** — теперь поддерживается обработка смешанных символов окончания строк.
* **Новая строка после обратного слеша не обработана** — при обработке экранирующих символов в функции `parse_d_file`.
## 0.7.0 (01.06.2026)
### Added ### Added

View File

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

View File

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

View File

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

View File

@@ -25,11 +25,11 @@ dcr test --init
Что делает `dcr test`: Что делает `dcr test`:
1. Builds the project 1. Собирает проект
2. Collects `tests/*.c` files (`.c` only, not `.cpp`) 2. Собирает файлы `tests/*.c` (только `.c`, не `.cpp`)
3. Compiles and links each test file 3. Компилирует и линкует каждый файл теста
4. Runs each test binary 4. Запускает каждый бинарник тестов
5. Prints summary: TOTAL, PASS, SKIP, FAIL 5. Вывод сводки: TOTAL, PASS, SKIP, FAIL
6. Возвращает ненулевой код при наличии FAIL 6. Возвращает ненулевой код при наличии FAIL
## `dcr fmt` ## `dcr fmt`
@@ -40,21 +40,21 @@ dcr test --init
dcr fmt dcr fmt
``` ```
Processes: `src/**/*.{c,cpp,cxx,cc,h,hpp,hxx,hh}` and `tests/**/*.{c,cpp,cxx,cc,h,hpp,hxx,hh}`. Процессы: `src/**/*.{c,cpp,cxx,cc,h,hpp,hxx,hh}` и `tests/**/*.{c,cpp,cxx,cc,h,hpp,hxx,hh}`.
Используется файл `.clang-format` в корне проекта (если есть), иначе дефолтный стиль DCR. Использует `.clang-format` в корне проекта (если таковой имеется), иначе стиль clang-format по умолчанию.
## `dcr lint` ## `dcr lint`
Runs `clang-tidy` on C/C++ source files for static analysis. Выполняет `clang-tidy` на C/C++ исходных файлах для статического анализа.
```bash ```bash
dcr lint # show diagnostics dcr lint # отобразить диагностику
dcr lint --fix # apply fixes automatically dcr lint --fix # автоматически применить исправления
dcr lint --help # detailed help dcr lint --help # подробная справка
``` ```
Processes: `src/**/*.{c,cpp,cxx,cc}` and `tests/**/*.{c,cpp,cxx,cc}`. Процессы: `src/**/*.{c,cpp,cxx,cc}` и `tests/**/*.{c,cpp,cxx,cc}`.
Without `--fix`, clang-tidy reports warnings and errors without modifying files. Без параметра `--fix` clang-tidy выдает предупреждения и ошибки, не внося изменений в файлы.
With `--fix`, clang-tidy applies automatic suggestions in place. При параметре `--fix` clang-tidy автоматически вносит предложения по исправлениям на месте.

View File

@@ -12,41 +12,40 @@ sidebar_label: Системные команды (setup, --help, ...)
dcr setup dcr setup
``` ```
If `~/.dcr/config.toml` is not found, DCR returns an error. Create it manually: Если файл `~/.dcr/config.toml` не найден, DCR возвращает ошибку. Создайте его вручную:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```
## `dcr --help` ## `dcr --help`
Shows help for all commands. Отображает справку по всем командам.
```bash ```bash
dcr --help dcr --help
dcr build --help # справка по конкретной команде
``` ```
## `dcr --version` ## `dcr --version`
Shows version and target triple. Отображает версию и целевую платформу.
```bash ```bash
dcr --version # dcr 0.7.0 dcr --version # dcr 0.7.0 (x86_64-unknown-linux-gnu)
``` ```
## `dcr --update` ## `dcr --update`
Самообновление. Скачивает последний релиз с GitHub Releases и заменяет текущий бинарник. Автоматическое обновление. Загружает последнюю версию бинарного файла из раздела «Релизы» на GitHub и заменяет текущую версию.
```bash ```bash
dcr --update dcr --update
``` ```
Особенности: Возможности:
* Определяет платформу и архитектуру автоматически * Определяет платформу и архитектуру автоматически
* Warns if installed via AUR (use package manager instead) * Выдает предупреждение при установке через AUR (вместо этого используйте пакетный менеджер)
* Работает на Linux, macOS, Windows * Работает на Linux, macOS, Windows

View File

@@ -1,23 +1,24 @@
--- ---
sidebar_label: Contributing sidebar_label: Вклад
--- ---
# Contributing # Вклад
## Setup ## Настройка
```bash ```bash
git clone https://github.com/dexoron/dcr git clone https://github.com/dexoron/dcr
# or a source mirror: GitVerse / SourceCraft / SourceForge / GitLab (see README)
cd dcr cd dcr
cargo build cargo build
``` ```
## Code style ## Стиль написания кода
Весь код форматируется через `cargo fmt`: Весь код форматируется через `cargo fmt`:
```bash ```bash
cargo fmt формат груза
``` ```
## Линтер ## Линтер
@@ -29,10 +30,10 @@ cargo clippy --all-targets -- -D warnings
## Тесты ## Тесты
```bash ```bash
cargo test --all-targets тест cargo --all-targets
``` ```
## PR process ## Процесс связей с общественностью
1. Форкните репозиторий 1. Форкните репозиторий
2. Создайте ветку: `git checkout -b feature/description` 2. Создайте ветку: `git checkout -b feature/description`
@@ -42,10 +43,11 @@ cargo test --all-targets
## CI ## CI
В CI запускаются: CI runs (see `.github/workflows/ci.yml`):
* `cargo fmt --check` * `cargo fmt --check`
* `cargo clippy --all-targets -- -D warnings` * `cargo clippy` (default + `--all-features`)
* `cargo test --all-targets` * `cargo check --all-targets --all-features`
* Сборка под Linux, macOS, Windows, FreeBSD, OpenBSD, NetBSD * 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

@@ -4,18 +4,18 @@ sidebar_label: Часто задаваемые вопросы
# Часто задаваемые вопросы # Часто задаваемые вопросы
## Registry not found ## Реестр не найден
``` ```
error: registry not found Ошибка: реестр не найден
``` ```
**Solution:** Make sure `~/.dcr/config.toml` exists: **Решение:** Убедитесь, что файл `~/.dcr/config.toml` существует:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```
Если реестр кастомный, проверьте `DCR_INDEX_PATH`: Если реестр кастомный, проверьте `DCR_INDEX_PATH`:
@@ -24,42 +24,21 @@ url = "https://index.dcr.pm"
echo $DCR_INDEX_PATH echo $DCR_INDEX_PATH
``` ```
## Compiler not found ## Компилятор не найден
``` ```
error: compiler not found Ошибка: компилятор не найден
``` ```
**Решение:** Убедитесь, что компилятор установлен и доступен в PATH. **Решение:** Убедитесь, что компилятор установлен и доступен в PATH.
```bash ```bash
which gcc какой gcc
which clang какой clang
``` ```
Или укажите явно через `[toolchain]` или `DCR_COMPILER`. Или укажите явно через `[toolchain]` или `DCR_COMPILER`.
## openssl-sys build failed
При сборке DCR из исходников:
```
error: failed to run custom build command for 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 во время сборки ## Ctrl+C во время сборки
DCR корректно обрабатывает SIGINT: прерывает текущую компиляцию и завершает процесс с ненулевым кодом. DCR корректно обрабатывает SIGINT: прерывает текущую компиляцию и завершает процесс с ненулевым кодом.
@@ -68,7 +47,7 @@ DCR корректно обрабатывает SIGINT: прерывает те
[Library Recipe](/docs/recipes/library-project). [Library Recipe](/docs/recipes/library-project).
## How to cross-compile to Windows? ## Как выполнить кросс-компиляцию для Windows?
См. [Cross-Compile Recipe](/docs/recipes/cross-to-windows). См. [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
@@ -76,6 +55,21 @@ DCR корректно обрабатывает SIGINT: прерывает те
См. [Workspace Recipe](/docs/recipes/multi-package-workspace). См. [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-файл устарел ## Lock-файл устарел
При изменении зависимостей `dcr.lock` автоматически обновляется при следующем `dcr add`. Если нужно принудительно обновить — удалите `dcr.lock` и выполните `dcr build`. При изменении зависимостей `dcr.lock` автоматически обновляется при следующем `dcr add`. Если нужно принудительно обновить — удалите `dcr.lock` и выполните `dcr build`.

View File

@@ -27,32 +27,27 @@ my-app/
name = "my-app" name = "my-app"
version = "0.1.0" version = "0.1.0"
type = "none" type = "none"
description=""
author=""
license = "GPL-3.0-or-later"
[build] [build]
language = "c" language = "c"
standard = "c11" standard = "c11"
compiler = "clang" compiler = "clang"
kind = "bin" kind = "bin"
[dependencies]
``` ```
## Build ## Сборка
```bash ```bash
dcr build dcr build
``` ```
Output — `target/\<triple>/debug/my-app` (Linux) or `target/debug/my-app.exe` (Windows). Результат — `target/\<triple>/debug/my-app` (Linux) или `target/debug/my-app.exe` (Windows).
Профиль: Профиль сборки:
```bash ```bash
dcr build --release # релизная сборка dcr build --release # release сборка
dcr build --debug # дебажная (по умолчанию) dcr build --debug # debug (по умолчанию)
``` ```
## Запустить ## Запустить
@@ -63,11 +58,11 @@ dcr run
Собирает (если нужно) и запускает бинарник. Собирает (если нужно) и запускает бинарник.
## First test ## Первый тест
```bash ```bash
dcr test --init # create test template dcr test --init # создать шаблон теста
dcr test # run tests dcr test # запустить тесты
``` ```
## Форматирование ## Форматирование
@@ -75,3 +70,10 @@ dcr test # run tests
```bash ```bash
dcr fmt # clang-format по .clang-format dcr fmt # clang-format по .clang-format
``` ```
## Linting
```bash
dcr lint # clang-tidy checks
dcr lint --fix # apply fixes automatically
```

View File

@@ -4,32 +4,79 @@ 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 ```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 ```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 ```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) ## Arch Linux (AUR)
```sh ```sh
yay -S dcr ура -S dcr
``` ```
## macOS / Linux (Homebrew) ## macOS / Linux (Homebrew)
@@ -37,8 +84,6 @@ yay -S dcr
```sh ```sh
brew tap dexoron/dexoron brew tap dexoron/dexoron
brew install dcr brew install dcr
# or
brew install dexoron/dexoron/dcr
``` ```
## Snap (Linux) ## Snap (Linux)
@@ -47,11 +92,12 @@ brew install dexoron/dexoron/dcr
sudo snap install dcrup sudo snap install dcrup
``` ```
> If classic Snap Store publishing is unavailable, install the `.snap` from [GitHub Releases](https://github.com/dexoron/dcr/releases/latest) with `--dangerous`.
## Nix (flake) ## Nix (flake)
```sh ```sh
nix run github:dexoron/dcr nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr nix profile install github:dexoron/dcr
``` ```
@@ -61,51 +107,40 @@ nix profile install github:dexoron/dcr
cargo install 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 ```sh
curl -fsSL https://dcr.dexoron.su/install_bsd.sh | bash cargo install dcr --features archive
``` ```
## BSD (script) ## Из источника
```sh
curl -fsSL https://dcr.dexoron.su/install.sh | bash
```
## Windows (PowerShell)
```powershell
irm https://dcr.dexoron.su/install.ps1 | iex
```
## From source
```sh ```sh
git clone https://github.com/dexoron/dcr.git git clone https://github.com/dexoron/dcr.git
cd dcr && cargo build --release cd dcr
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
``` ```
## Post-install ## После установки
Verify the installation:
```bash ```bash
dcr setup dcr --version
dcrup show # if installed via dcrup
``` ```
Man pages are available after installation: Man pages (package installs / release assets):
```bash ```bash
man dcr man dcr
man dcr-build man dcr-build
``` ```
Команда создаёт `~/.dcr/` с дефолтным `config.toml` и скачивает публичный реестр. Registry (optional) — `~/.dcr/config.toml`:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```

View File

@@ -6,6 +6,13 @@ sidebar_label: Интеграция с IDE
## VS Code ## VS Code
Install the recommended [DCR extension by Dexoron-Labs](https://marketplace.visualstudio.com/items?itemName=Dexoron-Labs.dcr). Do not install Microsoft C/C++ extensions for DCR projects: DCR uses `clangd`. MS C/C++ is acceptable only when you need its debugger.
Recommended companion extensions:
* [Even Better TOML](https://marketplace.visualstudio.com/items?itemName=tamasfe.even-better-toml)
* [CodeLLDB](https://marketplace.visualstudio.com/items?itemName=vadimcn.vscode-lldb), or MS C/C++ for debugger support only
```bash ```bash
dcr gen vscode dcr gen vscode
``` ```
@@ -27,25 +34,25 @@ dcr gen clion
Генерирует в `.idea/`: Генерирует в `.idea/`:
| Файл | Назначение | | Файл | Назначение |
| ----------------------------------------- | ----------------------------------------------- | | ----------------------------------------- | ------------------------------------------------ |
| `externalTools.xml` | Build, Run, Clean, Test как внешние инструменты | | `externalTools.xml` | Build, Run, Clean, Test как внешние инструменты |
| `customTargets.xml` | Кастомные цели сборки | | `customTargets.xml` | Кастомные цели сборки |
| `misc.xml` | Настройки C/C++ проекта | | `misc.xml` | Настройки C/C++ проекта |
| `runConfigurations/dcr_build_and_run.xml` | Per-binary run configurations | | `runConfigurations/dcr_build_and_run.xml` | Конфигурации запуска для каждого бинарного файла |
## compile_commands.json ## compile_commands.json
```bash ```bash
dcr gen compile-commands dcr gen команды компиляции
``` ```
Генерирует `compile_commands.json` в корне проекта. Стандартный формат для: Генерирует `compile_commands.json` в корне проекта. Стандартный формат для:
## project-info ## информация о проекте
```bash ```bash
dcr gen project-info dcr gen info-проекта
``` ```
Выводит JSON с метаданными проекта (см. [gen-commands](/docs/commands/gen-commands)). Выводит JSON с метаданными проекта (см. [gen-commands](/docs/commands/gen-commands)).

View File

@@ -10,37 +10,24 @@ DCR распространяется под лицензией [GPL-3.0-or-later
> **Важно:** DCR — инструмент сборки, а не библиотека. GPL распространяется только на исходный код самого DCR. Проекты, собранные с помощью DCR, не подпадают под лицензию DCR — их лицензирование определяется исключительно их собственным кодом и зависимостями. > **Важно:** DCR — инструмент сборки, а не библиотека. GPL распространяется только на исходный код самого DCR. Проекты, собранные с помощью DCR, не подпадают под лицензию DCR — их лицензирование определяется исключительно их собственным кодом и зависимостями.
## Вендорные библиотеки
DCR статически связывает следующие C-библиотеки через вендорные Rust-зависимости:
| Библиотека | Лицензия | 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-зависимости ## Rust-зависимости
DCR написан на Rust. Ниже перечислены основные статически связываемые крейты: DCR написан на Rust. Ниже перечислены основные статически связываемые крейты:
| Крейт | Лицензия | | Крейт | Лицензия |
| --------------------------------------------- | ------------------------ | | ------------------------------------------------------- | ------------------ |
| [`reqwest`](https://crates.io/crates/reqwest) | MIT OR Apache-2.0 | | [`ureq`](https://crates.io/crates/ureq) | MIT ИЛИ Apache-2.0 |
| [`rustls`](https://crates.io/crates/rustls) | Apache-2.0 OR ISC OR MIT | | [`serde`](https://crates.io/crates/serde) | MIT ИЛИ Apache-2.0 |
| [`serde`](https://crates.io/crates/serde) | MIT OR Apache-2.0 | | [`toml`](https://crates.io/crates/toml) | MIT ИЛИ Apache-2.0 |
| [`toml`](https://crates.io/crates/toml) | MIT OR Apache-2.0 | | [`toml_edit`](https://crates.io/crates/toml_edit) | MIT OR Apache-2.0 |
| [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 | | [`serde_json`](https://crates.io/crates/serde_json) | MIT ИЛИ Apache-2.0 |
| [`git2`](https://crates.io/crates/git2) | MIT OR Apache-2.0 | | [`sha2`](https://crates.io/crates/sha2) | MIT ИЛИ Apache-2.0 |
| [`openssl`](https://crates.io/crates/openssl) | Apache-2.0 | | [`glob`](https://crates.io/crates/glob) | MIT ИЛИ Apache-2.0 |
| [`tokio`](https://crates.io/crates/tokio) | MIT | | [`self-replace`](https://crates.io/crates/self-replace) | MIT ИЛИ Apache-2.0 |
| [`hyper`](https://crates.io/crates/hyper) | MIT | | [`ctrlc`](https://crates.io/crates/ctrlc) | MIT ИЛИ Apache-2.0 |
| [`ctrlc`](https://crates.io/crates/ctrlc) | MIT OR 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.
## Additional credits ## Дополнительные благодарности
* Дизайн CLI и модель проектов DCR вдохновлены [Cargo](https://doc.rust-lang.org/cargo/). * Дизайн CLI и модель проектов DCR вдохновлены [Cargo](https://doc.rust-lang.org/cargo/).

View File

@@ -33,14 +33,20 @@ type = "none"
[build] [build]
inherit = true inherit = true
language = "c" language = "c"
standard = "c17" standard = "c11"
workspace_only = true
[workspace] [workspace.lib-core]
members = [ path = "lib-core"
{ path = "lib-core" },
{ path = "lib-utils", deps = ["lib-core"] }, [workspace.lib-utils]
{ path = "app", deps = ["lib-core", "lib-utils"], main = true }, 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

@@ -25,29 +25,29 @@ cflags = ["-O3", "-flto"]
Поля из `[build.\<profile>]` **мержатся поверх** `[build]` Поля из `[build.\<profile>]` **мержатся поверх** `[build]`
* **Scalar fields** (strings, numbers, bools) — replaced * **Скалярные поля** (строки, числа, логические значения) — заменены
* Массивы (`cflags`, `ldflags`, ...) **заменяются полностью**, а не дополняются * Массивы (`cflags`, `ldflags`, ...) **заменяются полностью**, а не дополняются
Set `inherit = false` to disable array inheritance (only profile's own arrays are used). Установите `inherit = false`, чтобы отключить наследование массивов (будут использоваться только собственные массивы профиля).
## Кастомные профили ## Кастомные профили
The default flags for each profile are composed from three config fields: Флаги по умолчанию для каждого профиля формируются из трёх полей конфигурации:
| Field | Default cflags | Профили сборки | | Поле | Default cflags | Профили сборки |
| ----------- | ------------------ | -------------- | | ---------------- | ------------------ | -------------- |
| `opt_level` | `-O0 -g` | `"3"` | | `opt_level` | `-O0 -g` | `"3"` |
| `debug` | `true` | `false` | | `debug` | `true` | `false` |
| `warnings` | `["all", "extra"]` | `[]` | | `предупреждения` | `["all", "extra"]` | `[]` |
Which produce the equivalent compiler flags: Которые генерируют соответствующие флаги компилятора:
| Профиль | Effective flags | | Профиль | Действующие флаги |
| --------- | ---------------------------------------------------------- | | ------- | ---------------------------------------------------------- |
| `debug` | `-O0 -g -Wall -Wextra -fno-omit-frame-pointer -DDCR_DEBUG` | | `debug` | `-O0 -g -Wall -Wextra -fno-omit-frame-pointer -DDCR_DEBUG` |
| `release` | `-O3 -DNDEBUG` | | `релиз` | `-O3 -DNDEBUG` |
Additional build options can be toggled per-profile: Дополнительные параметры сборки можно включать или отключать для каждого профиля:
```toml ```toml
[build.release] [build.release]
@@ -73,7 +73,7 @@ cflags = ["-DLINUX"]
cflags = ["-DWIN32", "-O0", "-g"] cflags = ["-DWIN32", "-O0", "-g"]
``` ```
Application order (highest priority first): Порядок применения (в порядке убывания приоритета):
1. `[build.\<target>.\<profile>]` 1. `[build.\<target>.\<profile>]`
2. `[build.\<profile>.\<target>]` 2. `[build.\<profile>.\<target>]`

View File

@@ -2,36 +2,36 @@
sidebar_label: Система сборки sidebar_label: Система сборки
--- ---
# Build System # Система сборки
## Compiler Backends ## Бэкенды компилятора
DCR поддерживает 4 бэкенда компиляции. Выбор происходит автоматически на основе расширения файла и target triple. DCR поддерживает 4 бэкенда компиляции. Выбор происходит автоматически на основе расширения файла и target triple.
| Backend | Файлы | Когда используется | | Бэкенд | Файлы | Когда используется |
| --------- | --------------------------------------- | ------------------------------- | | --------- | --------------------------------------- | ------------------------------------- |
| `unix_cc` | `.c`, `.cpp`, `.cxx`, `.cc`, `.s`, `.S` | gcc/clang на Linux/macOS/BSD | | `unix_cc` | `.c`, `.cpp`, `.cxx`, `.cc`, `.s`, `.S` | gcc/clang на Linux/macOS/BSD |
| `msvc` | `.c`, `.cpp`, `.cxx`, `.cc` | Windows (cl, clang-cl) | | `msvc` | `.c`, `.cpp`, `.cxx`, `.cc` | Windows (cl, clang-cl) |
| `gas` | `.s`, `.S` | ARM/ARM64 ассемблер | | `газ` | `.s`, `.S` | ARM/ARM64 ассемблер |
| `nasm` | `.asm`, `.s` | x86/x86_64 ассемблер | | `nasm` | `.asm`, `.s` | x86/x86_64 ассемблер |
| `masm` | `.asm` | MASM (ml/ml64) on Windows | | `masm` | `.asm` | MASM (ml/ml64) в Windows |
| `fasm` | `.asm`, `.fasm` | Flat Assembler | | `fasm` | `.asm`, `.fasm` | Сборщик плоских деталей |
| `llvm_ir` | `.ll` | LLVM IR via `llc -filetype=obj` | | `llvm_ir` | `.ll` | LLVM IR с помощью `llc -filetype=obj` |
## Qt Support ## Поддержка Qt
DCR provides native Qt support for automatic meta-object handling (MOC, UIC, RCC). DCR обеспечивает встроенную поддержку Qt для автоматической обработки метаобъектов (MOC, UIC, RCC).
Enable it by setting `build.qt = true` in `dcr.toml`. DCR will automatically detect Qt-related files (`.ui`, `.qrc`, `.h` with `Q_OBJECT`) and process them. Чтобы включить эту функцию, установите значение `build.qt = true` в файле `dcr.toml`. DCR автоматически обнаружит файлы, связанные с Qt (`.ui`, `.qrc`, `.h` с `Q_OBJECT`), и обработает их.
```toml ```toml
[build] [build]
qt = true qt = true
``` ```
*Note: Requires `qt6` modules (Core, Widgets, Gui, Svg) installed via `pkg-config`.* *Примечание: Требуется установка модулей `qt6` (Core, Widgets, Gui, Svg) с помощью `pkg-config`.*
Advanced customization is still possible via `build.steps` if special handling is needed: Если требуется специальная обработка, по-прежнему можно выполнить расширенную настройку с помощью файла `build.steps`:
```toml ```toml
[build.steps] [build.steps]
@@ -43,10 +43,10 @@ moc = "moc {in} -o {out}"
* Компилятор определяется через `resolve_compiler()`: CC/CXX из [toolchain], DCR_COMPILER/env, PATH * Компилятор определяется через `resolve_compiler()`: CC/CXX из [toolchain], DCR_COMPILER/env, PATH
* Поддерживает генерацию `.d` файлов для header dependency tracking * Поддерживает генерацию `.d` файлов для header dependency tracking
* Флаги: `-std=`, `-MMD -MF`, `-c -o`, `-I`, `-L`, `-l` * Флаги: `-std=`, `-MMD -MF`, `-c -o`, `-I`, `-L`, `-l`
* Conditional flags based on config: * Условные флаги, зависящие от настроек:
* `freestanding` or bare-metal target: `-ffreestanding` (compile), `-nostdlib -static` (link) * `freestanding` или целевая среда «bare-metal»: `-ffreestanding` (компиляция), `-nostdlib -static` (линковка)
* `lto`: `-flto` (compile + link) * `lto`: `-flto` (компиляция + линковка)
* `panic = "abort"`: `-fno-exceptions` (C++ only), `-fno-unwind-tables`, `-fno-asynchronous-unwind-tables` * `panic = "abort"`: `-fno-exceptions` (только для C++), `-fno-unwind-tables`, `-fno-asynchronous-unwind-tables`
### MSVC ### MSVC
@@ -56,12 +56,12 @@ moc = "moc {in} -o {out}"
### GAS / NASM ### GAS / NASM
* GAS: `-I`, `-c -o`, `--defsym` * 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>` * MASM: `/nologo /c /Fo\<obj> <source>`
* FASM: `<source> \<output>` (output path is the object file) * FASM: `<source> \<output>` (путь вывода — объектный файл)
* LLVM IR: `-filetype=obj <source> -o \<output>` * LLVM IR: `-filetype=obj <source> -o \<output>`
## Incremental Builds ## Инкрементные сборки
Три уровня инкрементальности: Три уровня инкрементальности:
@@ -69,31 +69,36 @@ moc = "moc {in} -o {out}"
2. **`.d` files** — отслеживание изменений в заголовочных файлах (включая транзитивные) 2. **`.d` files** — отслеживание изменений в заголовочных файлах (включая транзитивные)
3. **SHA256 fingerprint** — если флаги компиляции изменились, файл перекомпилируется (fingerprint хранится в `.dcr_fingerprint`) 3. **SHA256 fingerprint** — если флаги компиляции изменились, файл перекомпилируется (fingerprint хранится в `.dcr_fingerprint`)
## Parallel Compilation ## Параллельная компиляция
* Используется `thread::scope` для создания пула потоков * Используется `thread::scope` для создания пула потоков
* Атомарная очередь задач (`AtomicU64`) * Атомарная очередь задач (`AtomicU64`)
* Мьютекс на запись в stdout (`OUTPUT_MUTEX`) * Мьютекс на запись в stdout (`OUTPUT_MUTEX`)
* Thread count = `available_parallelism()`, capped by `build.codegen-units` if set * Количество потоков = `available_parallelism()`, ограниченное значением `build.codegen-units`, если оно задано
## Build Kinds ## Типы сборок
| Kind | Тип | Path (Linux example) | | Тип | Тип | Путь (пример для Linux) |
| ----------- | ------------------------------------ | ----------------------------------------------------------------------------------------------- | | ------------------ | ------------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------- |
| `bin` | Executable | `target/\<profile>/\<name>` (.exe) | | `bin` | Исполняемый файл | `target/\<profile>/\<name>` (.exe) |
| `staticlib` | Статическая библиотека | `target/\<profile>/lib\<name>.a` (.lib) | | `staticlib` | Статическая библиотека | `target/\<profile>/lib\<name>.a` (.lib) |
| `sharedlib` | Динамическая библиотека | `target/\<profile>/lib\<name>.so` (.dll/.dylib) | | `sharedlib` | Динамическая библиотека | `target/\<profile>/lib\<name>.so` (.dll/.dylib) |
| `efi` | UEFI приложение | `target/\<profile>/\<name>.efi` | | `efi` | UEFI приложение | `target/\<profile>/\<name>.efi` |
| `elf` | ELF без стандартной библиотеки | `target/\<profile>/\<name>` | | `эльф` | ELF без стандартной библиотеки | `target/\<profile>/\<name>` |
| `none` | Compile only, no link | — | | `нет` | Только компиляция, без линковки | — |
| `custom` | Полный контроль filename + extension | `target/\<profile>/\<filename>.\<extension>` | | `пользовательский` | Полный контроль 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) |
## Build Steps ## 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).
## Этапы сборки
DCR поддерживает pre-build и post-build шаги через Qt codegen: DCR поддерживает pre-build и post-build шаги через Qt codegen:
* `build.steps` — commands before compilation * `build.steps` — команды, выполняемые перед компиляцией
* `build.post_steps` — commands after compilation * `build.post_steps` — команды, выполняемые после компиляции
Подстановки: `{stem}`, `{in}`, `{out}`. Подстановки: `{stem}`, `{in}`, `{out}`.
@@ -106,7 +111,7 @@ moc = "moc {in} -o {out}"
## pkg-config ## pkg-config
Automatic lookup (read from raw config): Автоматический поиск (чтение из исходного файла конфигурации):
```toml ```toml
[build] [build]
@@ -115,17 +120,17 @@ pkg_config = ["sdl2", "gl"]
DCR вызывает `pkg-config --cflags sdl2 gl` и `pkg-config --libs sdl2 gl` и добавляет результат в флаги компиляции/линковки. DCR вызывает `pkg-config --cflags sdl2 gl` и `pkg-config --libs sdl2 gl` и добавляет результат в флаги компиляции/линковки.
## Variable Substitution ## Подстановка переменных
Supported variables: Поддерживаемые переменные:
| Variable | Описание | | Переменная | Описание |
| ----------------------- | ------------------------------- | | ----------------------- | ----------------------------------------- |
| `{version}` | Версия пакета | | `{version}` | Версия пакета |
| `{version_major}` | Major version part | | `{version_major}` | Часть, обозначающая основную версию |
| `{version_minor}` | Minor version part | | `{version_minor}` | Часть, обозначающая второстепенную версию |
| `{version_patch}` | Переменная | | `{version_patch}` | Переменная |
| `{version_suffix}` | Suffix (e.g., `-rc1`) | | `{version_suffix}` | Суффикс (например, `-rc1`) |
| `{version_suffix_dash}` | Suffix with dash | | `{version_suffix_dash}` | Суффикс с тире |
| `{profile}` | Имя профиля (debug/release/...) | | `{profile}` | Имя профиля (debug/release/...) |
| `{name}` | Имя пакета | | `{name}` | Имя пакета |

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

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

View File

@@ -10,95 +10,145 @@ sidebar_label: Обзор dcr.toml
```toml ```toml
[package] [package]
# обязательные поля # required fields
[build] [build]
# настройки сборки # build settings
[build.debug] # опционально: переопределение для debug [build.debug] # optional: debug override
[build.release] # опционально: переопределение для release [build.release] # optional: release override
[build.linux] # опционально: переопределение для Linux [build.linux] # optional: Linux override
[build.windows] # опционально: переопределение для Windows [build.windows] # optional: Windows override
[build.windows.debug] # комбинация target + profile [build.windows.debug] # target + profile combination
[toolchain] [toolchain]
# пути к компиляторам/линкеру # compiler/linker paths
[dependencies] [dependencies]
# зависимости проекта # project dependencies
[workspace] [workspace]
# мультипакетная конфигурация # multi-package configuration
[run] [run]
[run.release] # опционально: переопределение для release # run settings
# настройки запуска
[archive]
# optional: pack FAT disk image after build
``` ```
## [package] ## [пакет]
| Поле | Обязательное | Описание | | Поле | Обязательное | Описание |
| --------- | ------------ | --------------------------- | | ------------- | ------------ | --------------------------------------------------------------------------------------------------------------- |
| `name` | да | Имя проекта | | `имя` | да | Имя проекта |
| `version` | да | Семантическая версия | | `версия` | да | Semantic version of the **project** |
| `type` | да | `app`, `lib`, `none` | | `dcr-version` | no | Semver of the **dcr tool** this project targets. Written by `dcr new` / `dcr init` to the current tool version. |
| `license` | нет | SPDX-идентификатор лицензии | | `тип` | нет | `app`, `lib`, `none` (defaults to `"none"`) |
| `author` | нет | Автор | | `лицензия` | нет | SPDX-идентификатор лицензии |
| `автор` | no | Автор |
```toml ```toml
[package] [package]
name = "my-app" name = "my-app"
version = "0.1.0" version = "0.1.0"
dcr-version = "0.8.4"
type = "app" type = "app"
license = "MIT" license = "MIT"
author = "John Doe" author = "John Doe"
``` ```
## [build] ### `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.qt` — (bool) Enable automatic Qt meta-object handling (MOC, UIC, RCC). Requires `qt6` modules installed via `pkg-config`. * `build.qt` — (bool) Включить автоматическую обработку метаобъектов Qt (MOC, UIC, RCC). Требуется установка модулей `qt6` с помощью `pkg-config`.
| Поле | По умолчанию | Описание | | Поле | По умолчанию | Описание |
| ---------------- | ------------------------------------------- | --------------------------------------------------------------------- | | ------------------------ | ------------- | --------------------------------------------------------------------------------------------------------- |
| `language` | `"c"` | `"c"`, `"cxx"`, `"cpp"` | | `язык` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) |
| `standard` | `"c11"` | Стандарт C (`c11`, `c17`, `c23`) | | `стандартный` | `"c11"` | Стандарт C (`c11`, `c17`, `c23`) |
| `cxx_standard` | `"c++20"` | Стандарт C++ (`c++17`, `c++20`, `c++23`) | | `cxx_standard` | — | Стандарт C++ (`c++17`, `c++20`, `c++23`) |
| `compiler` | `cxxflags` | Предпочитаемый компилятор | | `компилятор` | `cxxflags` | Preferred compiler (optional, defaults to `"clang"`) |
| `kind` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom` | | `тип` | `"bin"` | `bin`, `staticlib`, `sharedlib`, `efi`, `elf`, `none`, `custom`, `flat-bin` |
| `target` | хост | Target triple для кросс-компиляции | | `target` | хост | Target triple для кросс-компиляции |
| `platform` | `"native"` | `native`, `efi`, `freestanding` | | `платформа` | `"нативный"` | `native`, `efi`, `freestanding` |
| `cflags` | `[]` | Дополнительные флаги C++ | | `cflags` | `[]` | Дополнительные флаги C++ |
| `ldflags` | `[]` | Дополнительные флаги линковки | | `ldflags` | `[]` | Дополнительные флаги линковки |
| `filename` | `""` | Кастомное имя выходного файла | | `имя файла` | `""` | Кастомное имя выходного файла |
| `extension` | `""` | Custom file extension | | `расширение` | `""` | Custom file extension (for `flat-bin`, default is `bin`) |
| `roots` | `["src"]` | Корневые директории с исходниками | | `корни` | `["src"]` | Source roots: directories and/or individual source/header files |
| `exclude` | `[]` | Паттерны исключений | | `exclude` | `[]` | Паттерны исключений |
| `include` | `[]` | Дополнительные include-директории | | `include` | `[]` | Дополнительные include-директории |
| `src_disable` | `false` | Disable auto source discovery | | `src_disable` | `false` | Отключить автоматический поиск источников |
| `inherit` | `false` | Наследовать build от корня workspace | | `наследовать` | `false` | Наследовать build от корня workspace |
| `clean` | `[]` | Glob patterns for custom clean paths | | `clean` | `[]` | Шаблоны Glob для настраиваемых чистых путей |
| `out_dir` | `""` | Custom output directory | | `out_dir` | `""` | Пользовательский каталог для вывода данных |
| `workspace_only` | `false` | Только для workspace, не собирать отдельно | | `только рабочая область` | `false` | Workspace-only, not built standalone (no `language`/`compiler` required) |
| `freestanding` | `false` | Compile in freestanding mode (`-ffreestanding` + `-nostdlib -static`) | | `отдельно стоящий` | `false` | Компилировать в автономном режиме (`-ffreestanding` + `-nostdlib -static`) |
| `opt_level` | `"0"` (debug) / `"3"` (release) | Optimization level: `0`-`3`, `"s"`, `"z"` | | `opt_level` | — | Optimization level: `0`-`3`, `"s"`, `"z"` (derived from profile if omitted) |
| `ldscript` | `true` (debug) / `false` (release) | Emit debug symbols (`-g`) | | `ldscript` | profile-based | Emit debug symbols (`-g`): `true` in debug, `false` in release |
| `lto` | `false` | Link-time optimization (`-flto` for both compiler and linker) | | `lto` | `false` | Оптимизация на этапе компоновки (`-flto` как для компилятора, так и для компоновщика) |
| `asflags` | `false` | Strip symbols from output (`-s` in ldflags) | | `asflags` | `false` | Удалить символы из вывода (опция `-s` в ldflags) |
| `true` | `["all", "extra"]` (debug) / `[]` (release) | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`) | | `true` | `[]` | Warning flags (e.g. `"all"`, `"extra"`, `"pedantic"`); engine adds `-Wall -Wextra` in debug if empty |
| `panic` | `""` | Panic strategy: `"abort"` disables exceptions and unwind tables | | `panic` | `""` | Стратегия «Паника»: `"abort"` отключает исключения и таблицы развертки |
| `codegen-units` | `""` | Max parallel compilation jobs (`"0"` = auto) | | `codegen-units` | `""` | Максимальное количество параллельных заданий компиляции (`"0"` = автоматически) |
| `qt` | `false` | Enable automatic Qt meta-object handling (MOC, UIC, RCC) | | `qt` | `false` | Включить автоматическую обработку метаобъектов Qt (MOC, UIC, RCC) |
Settings from raw config (not in typed struct): Параметры из исходного файла конфигурации (не в виде типизированной структуры):
* `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`.
* Пакеты для pkg-config
* Путь к linker script * Путь к linker script
* `build.steps` / `build.post_steps` — codegen steps * `build.steps` / `build.post_steps` — этапы генерации кода
Example: ## 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 ```toml
[build] [build]
@@ -112,7 +162,7 @@ cflags = ["-Wall", "-Wextra"]
pkg_config = ["sdl2", "gl"] pkg_config = ["sdl2", "gl"]
``` ```
## [toolchain] ## [набор инструментов]
```toml ```toml
[toolchain] [toolchain]
@@ -126,16 +176,16 @@ moc = "/usr/bin/moc" # Qt
rcc = "/usr/bin/rcc" # Qt rcc = "/usr/bin/rcc" # Qt
``` ```
Raw config also supports `uic`, `moc`, `rcc` for Qt codegen. Raw config также поддерживает `uic`, `moc` и `rcc` для генерации кода Qt.
## [dependencies] ## [зависимости]
См. [dependencies](/docs/reference/dependencies). См. [dependencies](/docs/reference/dependencies).
## [run] ## [запустить]
```toml ```toml
[run] [запустить]
cmd = "./target/{profile}/{name}" cmd = "./target/{profile}/{name}"
``` ```
@@ -143,11 +193,92 @@ cmd = "./target/{profile}/{name}"
* `{version}` — версия из [package] * `{version}` — версия из [package]
* `pkg_config` * `pkg_config`
* `{profile}` — debug / release * `{profile}` — отладочная / релизная версия
* `{name}` — имя из [package] * `{name}` — имя из [package]
По умолчанию `cmd` вычисляется как `./target/{profile}/{name}`. По умолчанию `cmd` вычисляется как `./target/{profile}/{name}`.
## [workspace] ## [рабочая область]
См. [workspaces](/docs/reference/workspaces). См. [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,9 +6,9 @@ sidebar_label: Зависимости
## Форматы ## Форматы
В секции `[dependencies]` поддерживаются три формата: The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies:
### String (registry) ### Строка (реестр)
```toml ```toml
[dependencies] [dependencies]
@@ -17,16 +17,16 @@ spdlog = "^1.12"
catch2 = ">=3.0,<4.0" catch2 = ">=3.0,<4.0"
``` ```
The version string is used as-is for registry lookup. Строка версии используется без изменений для поиска в реестре.
### Табличный (git) ### Табличный (git)
```toml ```toml
[dependencies] [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) ### Табличный (path)
@@ -35,7 +35,33 @@ fmt = { git = "https://github.com/fmtlib/fmt", tag = "10.1.1" }
mylib = { path = "../mylib" } mylib = { path = "../mylib" }
``` ```
## Registry 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 ## RegistryDCR использует реестр пакетов для поиска зависимостей по имени.```toml
# ~/.dcr/config.toml # ~/.dcr/config.toml
@@ -45,27 +71,41 @@ main = { url = "https://github.com/dcr-ports/dcr-index", priority = 1 }
```toml ```toml
# ~/.dcr/config.toml # ~/.dcr/config.toml
[[registry]] [registry.default]
name = "default" url = "https://index.dcr.dexoron.tech"
url = "https://index.dcr.pm" priority = 1
``` ```
Registry priority: order in `config.toml`. Переменная `DCR_INDEX_PATH` переопределяет путь к index.json. Приоритет реестра: порядок в файле `config.toml`. Переменная `DCR_INDEX_PATH` переопределяет путь к index.json.
## Git-зависимости ## 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` — переключиться на ветку * `branch` — переключиться на ветку
* `tag` — переключиться на тег * `tag` — переключиться на тег
* `rev` — переключиться на конкретный коммит * `rev` — переключиться на конкретный коммит
* `features` — feature flags (parsed, but does not affect build) * `features` — флаги функций (проанализированы, но не влияют на сборку)
Cache path: `~/.dcr/git/\<hash>/`. ## Path dependencies
## Path-зависимости 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.
Локальные пути. DCR автоматически находит include и lib директории.
```toml ```toml
[dependencies] [dependencies]
@@ -73,16 +113,51 @@ mylib = { path = "/abs/path/to/lib" }
mylib = { path = "../relative/path" } mylib = { path = "../relative/path" }
``` ```
For DCR packages, the package name from `dcr.toml` is used for linking (so the dependency key may differ from the library name). Header resolution includes the packaged `target/include` directory and link search includes `target/lib`.
### Recommended library layouts
Buildable DCR library:
```text
dcr-math-lib/
├── dcr.toml
└── src/
├── dcr_math.c
└── dcr_math.h
```
Prebuilt library:
```text
dcr-math-lib/
├── include/
│ └── dcr_math.h
└── lib/
└── libdcr-math.a # or .so / .lib
```
`libs` contains linker names without the `lib` prefix and file extension: use
`["dcr-math"]` for `libdcr-math.a`.
If one repository contains both forms, keep the prebuilt files in `include/` and `lib/` and select the mode explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
For a local copy, replace `git` with `path = "../dcr-math-lib"`. In `prebuild` mode DCR does not run the dependency build, even when `dcr.toml` is present.
## dcr.lock ## dcr.lock
Файл блокировки зависимостей. Содержит точные версии, хеши и источники. Dependency lock file. Contains package names and sources.
Created during `dcr build` when registry dependencies are present. Автоматически обновляется при `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) 1. Resolve dependency sources (registry → git → path)
2. For path deps: recursively read their `dcr.toml` 2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref
3. For registry deps: search `index.json` 3. Build DCR package dependencies recursively
4. For git deps: clone to cache 4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler
5. Собираются include_dirs, lib_dirs, libs для передачи компилятору

View File

@@ -6,17 +6,17 @@ sidebar_label: Переменные среды
## DCR_COMPILER ## DCR_COMPILER
Переопределяет компилятор для всех языков. **Highest priority.** Переопределяет компилятор для всех языков. **Наивысший приоритет.**
```bash ```bash
export DCR_COMPILER=clang export DCR_COMPILER=clang
dcr build dcr build
``` ```
Compiler resolution priority: Приоритет разрешения компилятора:
1. `DCR_COMPILER` (env) 1. `DCR_COMPILER` (переменная среды)
2. `DCR_CC` / `DCR_CXX` / `DCR_AS` (env) 2. `DCR_CC` / `DCR_CXX` / `DCR_AS` (переменная среды)
3. `[toolchain]` (dcr.toml) 3. `[toolchain]` (dcr.toml)
4. `build.compiler` (dcr.toml) 4. `build.compiler` (dcr.toml)
5. `PATH` 5. `PATH`
@@ -33,7 +33,7 @@ export DCR_AS=arm-linux-gnueabihf-as
## DCR_LD / DCR_AR ## DCR_LD / DCR_AR
Override linker and archiver. Переопределить линкер и архиватор.
```bash ```bash
export DCR_LD=ld.lld export DCR_LD=ld.lld
@@ -58,3 +58,27 @@ export DCR_INDEX_PATH=/custom/path/index.json
``` ```
По умолчанию: `~/.dcr/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

@@ -4,24 +4,25 @@ sidebar_label: Поддержка платформ
# Поддержка платформ # Поддержка платформ
## Target Triples ## Тройные цели
DCR нормализует target triple через `platform_triple::normalize_triple()`. Если задано имя платформы (short name), оно раскрывается в triple. DCR нормализует target triple через `platform_triple::normalize_triple()`. Если задано имя платформы (short name), оно раскрывается в triple.
### Linux ### 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`.
Artifact type: ELF. Расширения: `.so` для sharedlib, `.a` для staticlib Тип артефакта: ELF. Расширения: `.so` для sharedlib, `.a` для staticlib
### macOS ### macOS
``` ```
target/<profile>/ target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
``` ```
Поддержка архитектур: `x86_64`, `aarch64`. Поддержка архитектур: `x86_64`, `aarch64`.
@@ -31,12 +32,13 @@ target/<profile>/
### Windows ### Windows
``` ```
target/<profile>/ target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
``` ```
Поддержка архитектур: `x86_64`, `aarch64`. Поддержка архитектур: `x86_64`, `aarch64`.
Environments: `msvc` (default), `gnu` (MinGW).
Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI). Расширения: `.exe` (бинарный файл), `.lib` (статическая библиотека), `.dll` (общая библиотека), `.efi` (UEFI).
### BSD ### BSD

View File

@@ -38,7 +38,10 @@ dcr build # собрать все пакеты
dcr build --workspace pkg-a # собрать только pkg-a 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" language = "c"
standard = "c17" 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

@@ -6,7 +6,7 @@ sidebar_label: Автоматическое обновление
## dcr --update ## dcr --update
Автоматическое обновление до последней версии. Downloads a binary (not an archive) from GitHub Releases and replaces the current executable. Автоматическое обновление до последней версии. Загружает бинарный файл (не архив) из раздела «Релизы» на GitHub и заменяет им текущий исполняемый файл.
```bash ```bash
dcr --update dcr --update
@@ -15,16 +15,16 @@ dcr --update
## Как это работает ## Как это работает
1. DCR определяет текущую платформу и архитектуру 1. DCR определяет текущую платформу и архитектуру
2. Fetches the latest release from `api.github.com/repos/dexoron/dcr/releases/latest` 2. Загружает последнюю версию с `api.github.com/repos/dexoron/dcr/releases/latest`
3. Compares versions 3. Сравнивает версии
4. Downloads the matching asset (direct binary URL, not archive) 4. Загружает соответствующий ресурс (прямой URL-адрес двоичного файла, а не архива)
5. Заменяет текущий исполняемый файл 5. Заменяет текущий исполняемый файл
## Asset naming ## Названия активов
Шаблон: `dcr-\<triple>.\<ext> ` Шаблон: `dcr-\<triple>.\<ext> `
| Платформа | Asset name | | Платформа | Название актива |
| -------------- | ------------------------------------- | | -------------- | ------------------------------------- |
| Linux x86_64 | `dcr-x86_64-unknown-linux-gnu.tar.gz` | | Linux x86_64 | `dcr-x86_64-unknown-linux-gnu.tar.gz` |
| macOS x86_64 | `dcr-x86_64-apple-darwin.tar.gz` | | macOS x86_64 | `dcr-x86_64-apple-darwin.tar.gz` |
@@ -36,7 +36,7 @@ dcr --update
Если DCR установлен через AUR, `--update` выводит предупреждение: Если DCR установлен через AUR, `--update` выводит предупреждение:
``` ```
Update via package manager: yay/paru -Syu {package_name} or sudo pacman -Syu {package_name} Обновление через менеджер пакетов: yay/paru -Syu {package_name} или sudo pacman -Syu {package_name}
``` ```
## Ошибки ## Ошибки

View File

@@ -4,15 +4,15 @@ sidebar_label: Запуск тестов
# Запуск тестов # Запуск тестов
## Execution ## Выполнение
```bash ```bash
dcr test Тест DCR
``` ```
Builds the project, then compiles and runs test files from `tests/`. Выполняет сборку проекта, а затем компилирует и запускает тестовые файлы из каталога `tests/`.
## Profiles ## Профили
```bash ```bash
dcr test # debug (по умолчанию) dcr test # debug (по умолчанию)
@@ -24,12 +24,12 @@ dcr test --debug # явно debug
``` ```
===================== =====================
Testsuite summary Сводка результатов набора тестов
===================== =====================
TOTAL: 5 ИСПОЛЬЗОВАНО: 5
PASS: 3 ПРОЙДЕНО: 3
SKIP: 1 ПРОПУЩЕНО: 1
FAIL: 1 НЕ ПРОЙДЕНО: 1
===================== =====================
``` ```
@@ -38,7 +38,7 @@ FAIL: 1
* 0 — все тесты пройдены (FAIL = 0) * 0 — все тесты пройдены (FAIL = 0)
* 1 — есть упавшие тесты * 1 — есть упавшие тесты
## What gets built ## Что строится
* Все C/C++ файлы из `tests/` * Все C/C++ файлы из `tests/`
* Include path: `tests/` (для `dcr_test.h`) * Include path: `tests/` (для `dcr_test.h`)

View File

@@ -25,12 +25,12 @@ EXPECT(ptr != NULL, "ptr should not be NULL");
SKIP("not implemented on Windows yet"); SKIP("not implemented on Windows yet");
``` ```
### `TEST(name)` ### `TEST(имя)`
Определяет тест. Определяет тест.
```c ```c
TEST(addition) { TEST(сложение) {
EXPECT(1 + 1 == 2); EXPECT(1 + 1 == 2);
EXPECT(2 + 2 == 4); EXPECT(2 + 2 == 4);
} }
@@ -38,7 +38,7 @@ TEST(addition) {
### `TEST_CASE(name, ...)` ### `TEST_CASE(name, ...)`
Registers a test case. Регистрирует тестовый случай.
```c ```c
TEST_CASE(math, a, b) { TEST_CASE(math, a, b) {
@@ -66,4 +66,4 @@ tests/
└── ... # дополнительные .c файлы с тестами └── ... # дополнительные .c файлы с тестами
``` ```
Only `.c` files are compiled (`.cpp` is not supported). Компилируются только файлы с расширением `.c` (файлы с расширением `.cpp` не поддерживаются).

View File

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

View File

@@ -4,6 +4,209 @@ sidebar_label: Changelog
# Changelog # Changelog
## 0.9.5 (2026-10-21)
* **Structured CLI output** — shared helpers now provide Cargo-like human, plain, and JSON output modes.
* **Color and diagnostics policy** — `--color`, `NO_COLOR`, `--quiet`, and `--verbose` are applied consistently across commands.
* **Build reporting** — lifecycle events and compiler diagnostics are available as structured JSON events.
* **Output lab** — sandbox scenarios cover help, lifecycle commands, compiler warnings/errors, stream capture, and broken pipes.
## 0.9.1 (2026-09-13)
* **`pkg-config` dependencies** — declare `fmt = { pkg-config = "fmt" }` or multiple package names in `[dependencies]`; DCR applies `.pc` compiler/linker flags and records the resolved package in `dcr.lock`.
* **`dcr add` support for `pkg-config`** — easily add system package dependencies with `dcr add fmt pkg-config:fmt` or `dcr add openssl pkg:openssl,libcrypto`.
* **`dcr tree` & IDE integration** — `pkg-config` packages are marked in `dcr tree` and resolved into compiler flags in `dcr gen` (`compile_commands.json`).
* **Fixed `dcr new` in non-ASCII / spaced paths** — initializing projects from folders with non-ASCII characters or spaces no longer fails validation.
## 0.9.0 (2026-08-31)
* **Download mirrors in `dcrup`** — `--mirror auto|cf|gh|sf|ya` and `DCRUP_MIRROR`.
Default `auto` tries **cf → gh → sf → ya** (CloudFlare CDN, GitHub, SourceForge, Yandex CDN).
* **Complete Path/Git dependencies** — DCR packages from `path` and `git` are built before their consumer. Git sources are cached in `~/.dcr/git`, support `branch`/`tag`/`rev`, and record the exact commit in `dcr.lock`.
* **Build and prebuild modes** — `path` and `git` dependencies can build a DCR package from `dcr.toml` or link existing `include`/`lib`/`libs` artifacts; `mode = "build"` / `"prebuild"` selects explicitly when both forms are present.
* **Prebuilt dependency examples** — documentation now shows the `dcr-math-lib` Git repository and recommended build/prebuilt layouts for both `git` and `path`.
* **Transitive dependency builds and cycle reporting** — DCR recursively builds DCR packages and reports a clear dependency chain for cycles.
* **Bare path arguments for `dcr add`** — `dcr add mylib ../mylib` now works in addition to the explicit `path:` form.
* **Removed `install.sh` / `install.ps1` / `install_bsd.sh`** — superseded by `dcrup`.
## 0.8.5 (2026-08-08)
* **`package.dcr-version`** — optional CLI version pin in `dcr.toml`.
`dcr new` / `dcr init` write the current version. On config load:
* missing / empty pin → warn "add dcr-version";
* dcr older than pin → warn "update dcr";
* dcr newer than pin → warn "check changelog, update pin";
* equal → silent.
Commands do not fail, warning only (once per path per process).
## 0.8.4 (2026-08-04)
**Added:**
* **`.dcr/` directory** — shared machine-readable build facts for IDE integrations:
* `.dcr/compile_commands.json`
* `.dcr/build-info.json` (`schemaVersion`, `artifact_path`, `profile`, …)
* `.dcr/toolchain.json` (compiler/debugger paths, moc/uic/rcc)
* `.dcr/ide/` (placeholder for IDE lock files)
* **`dcr gen project-info`** — `target`, `target_dir`, `artifact_path`, `artifact_kind`, `source_roots`, `include_globs`, `exclude_globs`; absolute/canonical paths.
* **`dcr build --print-artifact-path`** — one absolute artifact path line on stdout after a successful build.
* **`dcr gen … --quiet` / `-q`** — suppress human success logs for gen subcommands.
* **`.clangd`** — created on first gen with `CompilationDatabase: .dcr` (`# managed by dcr gen`); custom `.clangd` is not overwritten.
* **Helpers** `canonicalize_path`, `atomic_write`, `ensure_dcr_dir`; pure `resolve_artifact_path` via `platform::*`.
* **`dcr new` / `dcr init`** — add `.dcr/` to `.gitignore`.
**Changed (breaking):**
* **`compile_commands.json` moved** from project root to **`.dcr/compile_commands.json`**.\
clangd discovers it via `.clangd` / `--compile-commands-dir=.dcr`.\
CLion and VSCode generators updated accordingly.
* **Atomic write** for compile_commands (tmp + rename).
* **`gen vscode` / `gen clion` launch/run** — use the same artifact path resolver as `project-info` / `build-info.json`.
**Fixed:**
* Launch configs no longer hardcode `target/\<profile>/\<name>` without the Linux triple segment.
* Symlink/mount roots: best-effort canonicalize for root and compile database paths.
## 0.8.3 (2026-08-03)
### Added
* **`dcr run -- \<args>...`** — cargo-style argument forwarding after a bare `--`\
(`dcr run --release -- --test_help`). Applies to direct binary runs and `[run].cmd`.
* **Tests** — host target section `ldflags` without CLI `--target`; run-arg forwarding; `split_double_dash` unit tests.
### Changed
* **Native builds resolve the host triple** — without `--target` / package `build.target`, host sections such as\
`[build.x86_64-unknown-linux-gnu]` apply again (`cflags` / `ldflags` / toolchain).\
Previously the target was empty and those sections were ignored while artifacts already used the host triple path.
* **Empty target** — no more `Unknown target ''` warning.
* **`dcr run --help` / man `dcr-run`** — document `--` forwarding.
### Fixed
* **Native artifact paths on Windows and macOS** — without an explicit `--target` / `build.target`, artifacts use `target/\<profile>`, so `dcr run` and flat-bin find the build output.
* Target-specific `ldflags` missing on native host builds (e.g. micro-lang + `libsct-elf`).
* Spurious empty-target warning.
## 0.8.2 (2026-07-22)
### Added
* **Compile progress `[N/M]`** — live TTY status line (`compile pkg v0.1.0 [12/41]`) so long mono-package builds do not look hung.
* **DCR status style** — fixed-width verbs: `project`, `compile`, `dep`, `ready`, `pack`, `done`, `run`.
* **Cargo feature `archive`** — optional FAT packing via `fatfs` (`cargo build --features archive`). Release CI builds with the feature; without it `[archive]` fails with a clear message.
* **Tests** — `flat_bin_nasm_build`, package `build.target` without CLI `--target`, stricter workspace `clean --all`.
* **CI expansion** — unit + integration on Linux/macOS/Windows, archive feature job, rust-cache, clippy default + all-features (see `.github/workflows/ci.yml`).
### Changed
* **No forced host triple from CLI** — without `--target`, package/member `build.target` is honored (bare-metal / ISO `post_steps` paths).
* **Relative include/lib flags** (`-I`, `-i`, `-isystem`, `-idirafter`, `-L`, `-T`) absolutized against the package root under workspace builds.
* **`dcr clean --all`** — no spam for members without a local `target/` (shared root `target/`).
* **`error` / `warn`** — red / yellow on stderr; CLI fully English (`Hint:`).
* **Help / man** — list `add`, `lint`, `setup`; unknown command exits with code 1.
* **Tool NotFound** — `linker not found: ld.lld …` / `{tool} not found …` instead of raw `os error 2`.
## 0.8.1 (2026-07-20)
### Added
* **`build.kind = "flat-bin"`** — raw binary (default `.bin`) for OS-dev payloads:
* **NASM** — `-f bin` → `\<stem>.bin`
* **FASM** — direct output (`format binary` in source)
* **GAS / MASM / LLC** — object → `objcopy -O binary` → `\<stem>.bin`
* **C/C++** — objects → freestanding link → `objcopy -O binary` → `\<name>.bin`
* Requires `llvm-objcopy` / `objcopy` / `gobjcopy` except for NASM/FASM direct emit
* **`[archive]` section** — FAT12/16/32 disk images after build (`output`, `format`, `size`, `offset`, `label`, `bootsector`, `layout`). From 0.8.2 requires feature `archive`.
* **Single-file `build.roots`** — a root may be a single source or header file, not only a directory.
### Changed
* **`--force`** also re-runs `build.steps` and `build.post_steps`.
* **`dcr run` on workspace-only root** — if `[run].cmd` is set, run that after build; otherwise delegate to a workspace member.
## 0.8.0 (2026-07-18)
### Added
* **Dedicated Build Engine (`src/core/build/engine.rs`)** — decoupled the build orchestration logic completely from the CLI front-end wrapper in `src/cli/build.rs` to a reusable, decoupled core build engine.
* **Polymorphic Language Model (`Language` trait)** — introduced the abstract `Language` trait (`src/core/build/language/mod.rs`). File scanning, compiler resolution, and flags handling are now encapsulated in dedicated language modules for C, C++ (including Qt code generation), LLVM IR, and ASM (GAS, NASM, FASM, MASM).
* **Polymorphic Compilation Dispatch (`Builder` trait)** — introduced the `Builder` trait to generalize builder invocations (`src/core/build/builder/mod.rs`). Consolidated GCC/Clang logic into `builder/cc_common.rs` and Microsoft Visual C++ logic into `builder/msvc/`.
* **Per-Language Configuration overrides (`[build.\<lang>]`)** — introduced support for configuring language-specific compiler, standard, and flags (e.g. `[build.c]`, `[build.cxx]`, `[build.asm]`) independently in `dcr.toml`.
* **Automatic Workspace Dependency Injection** — during workspace builds, include/lib paths of dependent workspace members (including their source headers, local `include/` folders, and build target `target/include` / `target/lib` folders) are automatically resolved and injected.
* **`BuildReporter` Event System** — decoupled build orchestration output into a structured event-driven reporter model (`src/core/build/report.rs`), making DCR suitable for library embedding and IDE integrations without stderr capturing.
* **Build Cancellation Support** — introduced thread-safe cancellation tokens (`Arc\<AtomicBool>`) allowing clients to safely abort compile runs mid-execution.
* **TOML Formatting & Custom Keys Preservation** — migrated the config editor to `toml_edit`, preserving all unknown/user-defined TOML keys, structures, and comments during file write operations (e.g., in `dcr add`).
* **Path Dependencies Target Include Resolution** — local path dependencies configured via tables now correctly expose headers built and packaged into their `target/include` folder to consumer packages.
* **Modular Integration Test Suite** — refactored the monolith `tests/cli_basic.rs` file into clean, specialized integration tests: `cli_build.rs`, `cli_deps.rs`, `cli_lint.rs`, `cli_new.rs`, `cli_qt.rs`, `cli_test.rs`, `cli_workspace.rs`.
### Changed
* **Consolidated Linking and Archiving** — artifact generation (linking executables/shared libraries and archiving static libraries) consolidated into a single `src/core/build/builder/artifact.rs` module.
* **Workspace-Aware member execution** — `dcr run` executed at the workspace root of a `workspace_only` project now triggers the member build inside the workspace context using the `--workspace` parameter, preventing standalone build issues.
* **Elimination of Global State** — removed global variables and states from the build core, encapsulating build logic inside isolated `BuildContext` structs for thread safety.
* **Build Cache Separation** — relocated mtime tracking, incremental caching, and header-dependency checking logic to `src/core/build/cache.rs`.
* **Modularized Pre-build Steps** — decoupled generator scripts and pre-build commands parsing into `src/core/build/steps.rs`.
## 0.7.4 (2026-06-17)
### Added
* **Native Qt support** — automatic meta-object handling (MOC, UIC, RCC) added when `build.qt = true` is set in `dcr.toml`.
* **`dcr lint` command** — C/C++ static analysis via `clang-tidy`. Supports `--fix` for automatic fixes. Respects `build.roots` and `build.src_disable` from config.
* **Three new assembler backends**:
* **MASM** (`compiler = "ml"` / `"ml64"`) — Microsoft Macro Assembler.
* **FASM** (`compiler = "fasm"`) — Flat Assembler.
* **LLVM IR** (`compiler = "llc"`) — compiles `.ll` files via `llc -filetype=obj`.
* **Shared ASM pipeline** — linking and archiving logic consolidated into `core/builder/asm.rs`. Adding a new assembler backend now takes ~30 lines.
* **Filesystem utilities** — `to_hex()` and `home_dir()` extracted to `utils/fs.rs`.
* **Build utilities** — `normalize_target()`, `normalize_kind()`, `normalize_platform()`, `default_profile_flags()` extracted to `utils/build.rs`.
* **Backend helpers** — `asm_lang_flag()`, `source_extensions()`, `elapsed_secs()` added to `core/builder/common.rs`.
* **Full Bare-Metal / Freestanding Automation** — introduced the `build.freestanding = true` configuration option. When enabled (or when a bare-metal target is detected), DCR automatically injects `-ffreestanding` during compilation and both `-nostdlib` and `-static` during linking.
* **Artifact Optimization (LTO & Strip)** — added `build.lto` (auto-injects `-flto` for compiler and linker) and `build.strip` (automatically strips debug symbols via linker `-s` flag) options to `dcr.toml`.
* **Compilation Thread Control** — added the `build.codegen-units` option to strictly limit the maximum number of parallel jobs utilized by the custom `parallel_build` worker pool.
* **Panic Behavior Management** — added `build.panic = "abort"` support. For C++ targets, it automatically strips exception handling and unwind tables via `-fno-exceptions`, `-fno-unwind-tables`, and `-fno-asynchronous-unwind-tables`.
### Changed
* **Intelligent Default Flags Generation** — automated injection of fallback optimization (`-O3`/`-O0`), debug (`-g`), and warning (`-Wall -Wextra`) flags is now suppressed for bare-metal and freestanding builds if `build.cflags` are overridden.
* **Centralized Bare-Metal Detection** — relocated the `is_bare_metal_target` helper to common build utilities (`src/utils/build.rs`) for unified access across the building core.
* **Architectural Refactoring**:
* Renamed `src/config.rs` to `src/templates.rs`.
* Started consolidation of configuration and build orchestration logic.
## 0.7.3 (2026-06-13)
### Added
* **`--vcs` option for `new` and `init` commands** — introduced explicit version control system selection via `--vcs \<git|none>`.
* **Git metadata integration in `--version`** — the CLI now appends the current short commit hash and a `-dirty` suffix if there are uncommitted changes in the DCR repository.
* **Automatic `.gitignore` generation** — Git repository initialization now automatically writes a `.gitignore` file excluding the `/target` directory.
* **Nested repository prevention** — automatic Git initialization is now skipped if `dcr new` or `dcr init` is executed inside an already existing Git repository.
* **VCS verification tests** — added `new_vcs_options_work` and `init_vcs_options_work` integration tests to ensure reliable repository behavior.
### Changed
* **Complete removal of `git2` dependency** — all Git actions (dependency fetching, VCS setup, status checks) are now delegated to the system `git` executable via `Command`. This simplifies compilation and drops the need for `vendored` and `openssl` features.
* **Migrated from `reqwest` to `ureq`** — replaced the heavy `reqwest` crate in `flag_update.rs` with the lightweight synchronous `ureq 2.10` client, reducing overhead and the final binary size.
## 0.7.2 (2026-06-07)
### Added
* `default_target_triple()` now respects `target_env` — Linux (gnu/musl) and Windows (msvc/gnu) use the correct environment instead of hardcoded values.
### Fixed
* **macOS Apple Silicon builds failed with `_main` undefined** — `--target=` is now passed to ldflags, not just cflags. `default_target_triple()` uses `std::env::consts::ARCH` on macOS instead of hardcoded `x86_64`.
* **GitHub Stars and GPL-3.0 badges not rendering in README** — badge block converted to pure HTML.
### Changed
* Default target resolution extracted into shared `default_target_triple()` — removed duplication across build, run, clean.
## 0.7.1 (2026-06-02) ## 0.7.1 (2026-06-02)
### Added ### Added

View File

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

View File

@@ -15,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 git:https://github.com/user/repo # explicit git prefix
dcr add mylib github:user/repo # GitHub shorthand dcr add mylib github:user/repo # GitHub shorthand
dcr add mylib gitlab:user/repo # GitLab shorthand dcr add mylib gitlab:user/repo # GitLab shorthand
dcr add fmt pkg-config:fmt # system package via pkg-config
dcr add openssl pkg:openssl,libcrypto # multiple pkg-config packages
``` ```
Source prefixes: Source prefixes:
@@ -23,6 +25,7 @@ Source prefixes:
* `git:` — generic git URL * `git:` — generic git URL
* `github:` — expands to `https://github.com/\<user>/\<repo>` * `github:` — expands to `https://github.com/\<user>/\<repo>`
* `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>` * `gitlab:` — expands to `https://gitlab.com/\<user>/\<repo>`
* `pkg-config:` / `pkg:` — one or more packages resolved by `pkg-config`
* `http://` / `https://` / `git@` — full URL * `http://` / `https://` / `git@` — full URL
Flags: Flags:
@@ -31,7 +34,12 @@ Flags:
* `--tag \<name>` — git tag * `--tag \<name>` — git tag
* `--rev \<hash>` — git commit * `--rev \<hash>` — git commit
If source is omitted — DCR searches connected registries. 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` ## `dcr tree`

View File

@@ -12,8 +12,13 @@ Only ASCII letters, digits, underscores `_` and hyphens `-` are allowed in the p
```bash ```bash
dcr new my-app 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: Generates:
* `dcr.toml` with basic fields * `dcr.toml` with basic fields
@@ -24,8 +29,12 @@ Generates:
Initializes a DCR project in the current (empty) directory. Initializes a DCR project in the current (empty) directory.
```bash ```bash
mkdir app && cd app
dcr init 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`. 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: If `~/.dcr/config.toml` is not found, DCR returns an error. Create it manually:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```
## `dcr --help` ## `dcr --help`

View File

@@ -8,6 +8,7 @@ sidebar_label: Contributing
```bash ```bash
git clone https://github.com/dexoron/dcr git clone https://github.com/dexoron/dcr
# or a source mirror: GitVerse / SourceCraft / SourceForge / GitLab (see README)
cd dcr cd dcr
cargo build cargo build
``` ```
@@ -42,10 +43,11 @@ cargo test --all-targets
## CI ## CI
CI runs: CI runs (see `.github/workflows/ci.yml`):
* `cargo fmt --check` * `cargo fmt --check`
* `cargo clippy --all-targets -- -D warnings` * `cargo clippy` (default + `--all-features`)
* `cargo test --all-targets` * `cargo check --all-targets --all-features`
* Build on Linux, macOS, Windows * Unit + integration tests on Linux, macOS, Windows
* Integration tests * 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: **Solution:** Make sure `~/.dcr/config.toml` exists:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```
And check `DCR_INDEX_PATH`: And check `DCR_INDEX_PATH`:
@@ -39,27 +39,6 @@ which clang
Or specify explicitly via `[toolchain]` in `dcr.toml`. Or specify explicitly via `[toolchain]` in `dcr.toml`.
## openssl-sys build failed
When building DCR from source:
```
error: failed to run custom build command for openssl-sys
```
**Solution:** Install OpenSSL development headers:
```bash
# Ubuntu/Debian
sudo apt install libssl-dev
# Fedora
sudo dnf install openssl-devel
# macOS
brew install openssl
```
## Ctrl+C during build ## Ctrl+C during build
DCR handles SIGINT: interrupts the current compilation and exits with non-zero code. DCR handles SIGINT: interrupts the current compilation and exits with non-zero code.
@@ -76,6 +55,21 @@ See [Cross-Compile Recipe](/docs/recipes/cross-to-windows).
See [Workspace Recipe](/docs/recipes/multi-package-workspace). See [Workspace Recipe](/docs/recipes/multi-package-workspace).
## Bootloader / pure NASM OS image
Use `kind = "flat-bin"` (NASM `-f bin`) and optional `[archive]` for a FAT disk image.
See [OS-dev recipe](/docs/recipes/os-flat-bin-archive).
## How do I choose a download mirror?
`dcrup install` uses `--mirror auto` by default and tries **cf → gh → sf → ya**.
```bash
dcrup install stable --mirror cf
export DCRUP_MIRROR=ya
```
## Lock file ## Lock file
`dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`. `dcr.lock` is created during builds (`dcr build`) when registry dependencies are present. To force an update — delete `dcr.lock` and run `dcr build`.

View File

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

View File

@@ -4,28 +4,75 @@ sidebar_label: Installation
# 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 ```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 ```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 ```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) ## Arch Linux (AUR)
```sh ```sh
@@ -45,11 +92,12 @@ brew install dcr
sudo snap install dcrup sudo snap install dcrup
``` ```
> If classic Snap Store publishing is unavailable, install the `.snap` from [GitHub Releases](https://github.com/dexoron/dcr/releases/latest) with `--dangerous`.
## Nix (flake) ## Nix (flake)
```sh ```sh
nix run github:dexoron/dcr nix run github:dexoron/dcr
# or install to profile:
nix profile install github:dexoron/dcr nix profile install github:dexoron/dcr
``` ```
@@ -59,51 +107,40 @@ nix profile install github:dexoron/dcr
cargo install 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 ```sh
curl -fsSL https://dcr.dexoron.su/install.sh | sh cargo install dcr --features archive
```
## BSD (script)
```sh
curl -fsSL https://dcr.dexoron.su/install_bsd.sh | sh
```
## Windows (PowerShell)
```powershell
irm https://dcr.dexoron.su/install.ps1 | iex
``` ```
## From source ## From source
```sh ```sh
git clone https://github.com/dexoron/dcr.git git clone https://github.com/dexoron/dcr.git
cd dcr && cargo build --release cd dcr
cargo build --release --features archive
ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr ln -sf "$PWD/target/release/dcr" ~/.local/bin/dcr
# or manage versions with dcrup install night / --build
``` ```
## Post-install ## Post-install
Verify the installation:
```bash ```bash
dcr --version dcr --version
dcrup show # if installed via dcrup
``` ```
Man pages are available after installation: Man pages (package installs / release assets):
```bash ```bash
man dcr man dcr
man dcr-build man dcr-build
``` ```
To use the registry, create `~/.dcr/config.toml`: Registry (optional) — `~/.dcr/config.toml`:
```toml ```toml
[[registry]] [registry.default]
name = "default"
url = "https://index.dcr.pm" url = "https://index.dcr.pm"
priority = 1
``` ```

View File

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

View File

@@ -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. > **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 ## Rust dependencies
DCR is written in Rust. The following notable Rust crates are statically linked: DCR is written in Rust. The following notable Rust crates are statically linked:
| Crate | License | | Crate | License |
| --------------------------------------------- | ------------------------ | | ------------------------------------------------------- | ----------------- |
| [`reqwest`](https://crates.io/crates/reqwest) | MIT OR Apache-2.0 | | [`ureq`](https://crates.io/crates/ureq) | MIT OR Apache-2.0 |
| [`rustls`](https://crates.io/crates/rustls) | Apache-2.0 OR ISC OR MIT | | [`serde`](https://crates.io/crates/serde) | 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`](https://crates.io/crates/toml) | MIT OR Apache-2.0 | | [`toml_edit`](https://crates.io/crates/toml_edit) | MIT OR Apache-2.0 |
| [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 | | [`serde_json`](https://crates.io/crates/serde_json) | MIT OR Apache-2.0 |
| [`git2`](https://crates.io/crates/git2) | MIT OR Apache-2.0 | | [`sha2`](https://crates.io/crates/sha2) | MIT OR Apache-2.0 |
| [`openssl`](https://crates.io/crates/openssl) | Apache-2.0 | | [`glob`](https://crates.io/crates/glob) | MIT OR Apache-2.0 |
| [`tokio`](https://crates.io/crates/tokio) | MIT | | [`self-replace`](https://crates.io/crates/self-replace) | MIT OR Apache-2.0 |
| [`hyper`](https://crates.io/crates/hyper) | MIT | | [`ctrlc`](https://crates.io/crates/ctrlc) | 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 ## Additional credits

View File

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

View File

@@ -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 ## Target Directory
On Linux with explicit target: By default, the compilation output directories are structured as follows:
``` * **Linux and BSD**: Always output to `target/\<triple>/\<profile>/` (using host triple if no target is specified).
target/<triple>/<profile>/ * **macOS and Windows (without target)**: Output to `target/\<profile>/`.
``` * **macOS and Windows (with explicit target)**: Output to `target/\<triple>/\<profile>/`.
On macOS/Windows or without target:
```
target/<profile>/
```

View File

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

View File

@@ -6,7 +6,7 @@ sidebar_label: Dependencies
## Formats ## Formats
The `[dependencies]` section supports three formats: The `[dependencies]` section supports registry, path, Git, and `pkg-config` dependencies:
### String (registry) ### String (registry)
@@ -23,10 +23,10 @@ The version string is used as-is for registry lookup.
```toml ```toml
[dependencies] [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) ### Table (path)
@@ -35,33 +35,73 @@ Fields: `git`, `branch`, `tag`, `rev`.
mylib = { path = "../mylib" } mylib = { path = "../mylib" }
``` ```
For a prebuilt external library, specify its layout explicitly. The three
arrays are paths relative to the dependency root (`include`, `lib`) and linker
names (`libs`):
```toml
[dependencies]
dcr-math = { path = "../deps/dcr-math", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
### Table (`pkg-config`)
Use an installed `.pc` package when the library is provided by the operating system
or another system package manager. DCR invokes `pkg-config --cflags` and
`pkg-config --libs`, preserving include, library, linker, and other flags:
```toml
[dependencies]
fmt = { pkg-config = "fmt" }
openssl = { pkg-config = ["openssl", "libcrypto"] }
```
The `pkg-config` executable must be available in `PATH`. The named `.pc` files must
be available through pkg-config's standard search paths or via `PKG_CONFIG_PATH`.
These dependencies are not downloaded or built by DCR; they are recorded in
`dcr.lock` with a `pkg-config+...` source.
## Registry ## Registry
DCR uses a package registry for dependency lookup by name. DCR uses a package registry for dependency lookup by name.
```toml ```toml
# ~/.dcr/config.toml # ~/.dcr/config.toml
[[registry]] [registry.default]
name = "default" url = "https://index.dcr.dexoron.tech"
url = "https://index.dcr.pm" priority = 1
``` ```
Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`. Registry priority: order in `config.toml`. The `DCR_INDEX_PATH` variable overrides the path to `index.json`.
## Git dependencies ## 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 * `branch` — switch to a branch
* `tag` — switch to a tag * `tag` — switch to a tag
* `rev` — switch to a specific commit * `rev` — switch to a specific commit
* `features` — feature flags (parsed, but does not affect build) * `features` — feature flags (parsed, but does not affect build)
Cache path: `~/.dcr/git/\<hash>/`.
## Path dependencies ## 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 ```toml
[dependencies] [dependencies]
@@ -69,16 +109,51 @@ mylib = { path = "/abs/path/to/lib" }
mylib = { path = "../relative/path" } mylib = { path = "../relative/path" }
``` ```
For DCR packages, the package name from `dcr.toml` is used for linking (so the dependency key may differ from the library name). Header resolution includes the packaged `target/include` directory and link search includes `target/lib`.
### Recommended library layouts
Buildable DCR library:
```text
dcr-math-lib/
├── dcr.toml
└── src/
├── dcr_math.c
└── dcr_math.h
```
Prebuilt library:
```text
dcr-math-lib/
├── include/
│ └── dcr_math.h
└── lib/
└── libdcr-math.a # or .so / .lib
```
`libs` contains linker names without the `lib` prefix and file extension: use
`["dcr-math"]` for `libdcr-math.a`.
If one repository contains both forms, keep the prebuilt files in `include/` and `lib/` and select the mode explicitly:
```toml
[dependencies]
dcr-math = { git = "https://github.com/dexoron/dcr-math-lib.git", tag = "v0.1.0", mode = "prebuild", include = ["include"], lib = ["lib"], libs = ["dcr-math"] }
```
For a local copy, replace `git` with `path = "../dcr-math-lib"`. In `prebuild` mode DCR does not run the dependency build, even when `dcr.toml` is present.
## dcr.lock ## dcr.lock
Dependency lock file. Contains package names and sources. Dependency lock file. Contains package names and sources.
Created during `dcr build` 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 ## Resolution process
1. Load all dependencies (registry → git → path) 1. Resolve dependency sources (registry → git → path)
2. For path deps: recursively read their `dcr.toml` 2. Fetch git dependencies into `~/.dcr/git/` and check out the requested ref
3. For registry deps: search `index.json` 3. Build DCR package dependencies recursively
4. For git deps: clone to cache 4. Collect `include_dirs`, `lib_dirs`, `libs` for the compiler
5. 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`. 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 ### 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). Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib).
### macOS ### macOS
``` ```
target/<profile>/ target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
``` ```
Architectures: `x86_64`, `aarch64` (host-detected). Architectures: `x86_64`, `aarch64` (host-detected).
@@ -31,10 +32,11 @@ Extensions: `.dylib` (sharedlib), `.a` (staticlib).
### Windows ### Windows
``` ```
target/<profile>/ target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
``` ```
Architectures: `x86_64`, `aarch64`. Architectures: `x86_64`, `aarch64`.
Environments: `msvc` (default), `gnu` (MinGW).
Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI). Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI).

View File

@@ -43,7 +43,10 @@ dcr build # build all packages in dependency order
dcr build --workspace app # build only app (dependencies built automatically) dcr build --workspace app # build only app (dependencies built automatically)
``` ```
When building a workspace, 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 ## Clean
@@ -65,3 +68,21 @@ standard = "c17"
# member inherits language and standard # 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"] }
```