mirror of
https://github.com/dexoron/dcr.git
synced 2026-10-21 14:38:30 +00:00
feat: update version to 0.6.7, enhance build configuration, and add dcr tree command
This commit is contained in:
2
.gitignore
vendored
2
.gitignore
vendored
@@ -3,3 +3,5 @@ sandbox/**
|
|||||||
.idea/
|
.idea/
|
||||||
.vscode/
|
.vscode/
|
||||||
.env
|
.env
|
||||||
|
|
||||||
|
personal/
|
||||||
24
CHANGELOG.md
24
CHANGELOG.md
@@ -1,5 +1,24 @@
|
|||||||
# Changelog
|
# Changelog
|
||||||
|
|
||||||
|
## [0.6.7] - 2026-05-21
|
||||||
|
|
||||||
|
Added:
|
||||||
|
|
||||||
|
- `build.filename` and `build.extension` in `dcr.toml` — complete control over the final artifact name without relying on `package.name`.
|
||||||
|
Example:
|
||||||
|
```toml
|
||||||
|
[build]
|
||||||
|
filename = "KERNEL"
|
||||||
|
extension = "EFI"
|
||||||
|
```
|
||||||
|
Produces `KERNEL.EFI` (works for `bin`, `staticlib`, and `sharedlib`).
|
||||||
|
- Automatic injection of `--target=<build.target>` into compiler flags when `build.target` is set in `dcr.toml`. This greatly simplifies clang-based cross-compilation (especially for bare-metal targets like `aarch64-none-elf`).
|
||||||
|
- Bare-metal targets (containing `none`, `-elf`, `eabi`, `baremetal`) no longer receive DCR's internal default flags (`-g`, `-Wall`, `-Wextra`, `-fno-omit-frame-pointer`, `-DDCR_DEBUG`, etc.). Prevents unwanted sections (`.comment`, debug info, etc.) that break custom linker scripts when `inherit = true`.
|
||||||
|
|
||||||
|
Fixed:
|
||||||
|
|
||||||
|
- `build.target` declared in `dcr.toml` is now correctly used as the default target even when `--target` is not passed on the command line (previously the host target was always forced for config resolution).
|
||||||
|
|
||||||
## [0.6.6] - 2026-05-18
|
## [0.6.6] - 2026-05-18
|
||||||
|
|
||||||
Fixed:
|
Fixed:
|
||||||
@@ -29,8 +48,9 @@ between `cli/build.rs`, `cli/run.rs`, `cli/clean.rs`, `cli/gen.rs`
|
|||||||
`package_root_from_registry_info`, `registry_include_dir`, `registry_lib_dir`,
|
`package_root_from_registry_info`, `registry_include_dir`, `registry_lib_dir`,
|
||||||
`path_from_string_dep`
|
`path_from_string_dep`
|
||||||
- Unit tests for `register.rs` (`is_registry_dep`, `package_root_from_registry_info`),
|
- Unit tests for `register.rs` (`is_registry_dep`, `package_root_from_registry_info`),
|
||||||
`deps/mod.rs` (`path_dep_path`, `push_default_lib_dirs`),
|
`deps/mod.rs` (`path_dep_path`, `push_default_lib_dirs`),
|
||||||
`utils/build.rs` (`normalize_target_os`, `parse_version_info`)
|
`utils/build.rs` (`normalize_target_os`, `parse_version_info`)
|
||||||
|
- `dcr tree` command — visual dependency tree viewer (similar to `cargo tree`)
|
||||||
|
|
||||||
Removed:
|
Removed:
|
||||||
|
|
||||||
|
|||||||
2
Cargo.lock
generated
2
Cargo.lock
generated
@@ -112,7 +112,7 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "dcr"
|
name = "dcr"
|
||||||
version = "0.6.6"
|
version = "0.6.7"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"ctrlc",
|
"ctrlc",
|
||||||
"git2",
|
"git2",
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
[package]
|
[package]
|
||||||
name = "dcr"
|
name = "dcr"
|
||||||
version = "0.6.6"
|
version = "0.6.7"
|
||||||
edition = "2024"
|
edition = "2024"
|
||||||
build = "build.rs"
|
build = "build.rs"
|
||||||
|
|
||||||
|
|||||||
@@ -27,6 +27,7 @@
|
|||||||
* [dcr clean](commands/dcr-clean.md)
|
* [dcr clean](commands/dcr-clean.md)
|
||||||
* [dcr gen](commands/dcr-gen.md)
|
* [dcr gen](commands/dcr-gen.md)
|
||||||
* [dcr test](commands/dcr-test.md)
|
* [dcr test](commands/dcr-test.md)
|
||||||
|
* [dcr tree](commands/dcr-tree.md)
|
||||||
|
|
||||||
## Dependencies & Build
|
## Dependencies & Build
|
||||||
|
|
||||||
|
|||||||
@@ -25,6 +25,8 @@ dcr build --debug --clean
|
|||||||
## Config values used
|
## Config values used
|
||||||
|
|
||||||
- `package.name`
|
- `package.name`
|
||||||
|
- `build.filename`
|
||||||
|
- `build.extension`
|
||||||
- `build.compiler`
|
- `build.compiler`
|
||||||
- `build.language`
|
- `build.language`
|
||||||
- `build.standard`
|
- `build.standard`
|
||||||
@@ -60,7 +62,9 @@ dcr build --debug --clean
|
|||||||
- Incremental rebuild checks source/object mtime and tracked header dependencies.
|
- Incremental rebuild checks source/object mtime and tracked header dependencies.
|
||||||
- `--force` skips build cache checks and recompiles.
|
- `--force` skips build cache checks and recompiles.
|
||||||
- `--clean` removes `target/<profile>` and `build.clean` paths before building.
|
- `--clean` removes `target/<profile>` and `build.clean` paths before building.
|
||||||
|
- `build.filename` + `build.extension` allow full control over the final artifact name (e.g. `KERNEL.BIN` instead of using `package.name`).
|
||||||
- Default GCC/Clang profile flags: `debug` -> `-O0 -g -Wall -Wextra -fno-omit-frame-pointer -DDCR_DEBUG`, `release` -> `-O3 -DNDEBUG`.
|
- Default GCC/Clang profile flags: `debug` -> `-O0 -g -Wall -Wextra -fno-omit-frame-pointer -DDCR_DEBUG`, `release` -> `-O3 -DNDEBUG`.
|
||||||
|
These defaults are **not applied** for bare-metal targets (e.g. `aarch64-none-elf`, targets containing `none` / `-elf` / `eabi`).
|
||||||
- For `language = "asm"` with `compiler = "as"`/`"gas"`, use `.s` files (no preprocessing). For `.S`, use `gcc` or `clang`.
|
- For `language = "asm"` with `compiler = "as"`/`"gas"`, use `.s` files (no preprocessing). For `.S`, use `gcc` or `clang`.
|
||||||
- In workspace root, `dcr build` builds all members in dependency order.
|
- In workspace root, `dcr build` builds all members in dependency order.
|
||||||
- `build.exclude` removes paths from source/header collection; `build.include` re-allows matching paths and has priority over `exclude`.
|
- `build.exclude` removes paths from source/header collection; `build.include` re-allows matching paths and has priority over `exclude`.
|
||||||
|
|||||||
22
docs/commands/dcr-tree.md
Normal file
22
docs/commands/dcr-tree.md
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# dcr tree
|
||||||
|
|
||||||
|
Displays a visual dependency tree for the current project (similar to `cargo tree`).
|
||||||
|
|
||||||
|
## Usage
|
||||||
|
|
||||||
|
```sh
|
||||||
|
dcr tree
|
||||||
|
dcr tree --invert
|
||||||
|
dcr tree -p some-package
|
||||||
|
```
|
||||||
|
|
||||||
|
## What it shows
|
||||||
|
|
||||||
|
- All direct and transitive dependencies
|
||||||
|
- Version of each dependency
|
||||||
|
- Whether a dependency is a registry, git, or path dependency
|
||||||
|
|
||||||
|
## Notes
|
||||||
|
|
||||||
|
- Useful for debugging dependency issues and understanding the build graph.
|
||||||
|
- Output format is inspired by `cargo tree`.
|
||||||
@@ -8,6 +8,8 @@ language = "c"
|
|||||||
standard = "c11"
|
standard = "c11"
|
||||||
compiler = "clang"
|
compiler = "clang"
|
||||||
kind = "bin"
|
kind = "bin"
|
||||||
|
# filename = "KERNEL"
|
||||||
|
# extension = "BIN"
|
||||||
# optional:
|
# optional:
|
||||||
# inherit = true # Inherit from base (default true)
|
# inherit = true # Inherit from base (default true)
|
||||||
# targets = ["linux", "macos"] # Multiple targets to build
|
# targets = ["linux", "macos"] # Multiple targets to build
|
||||||
@@ -32,9 +34,12 @@ kind = "bin"
|
|||||||
- `standard` (string, required): language standard passed to compiler.
|
- `standard` (string, required): language standard passed to compiler.
|
||||||
- `compiler` (string, required): compiler command (for example `clang`, `gcc`, `cl`).
|
- `compiler` (string, required): compiler command (for example `clang`, `gcc`, `cl`).
|
||||||
- `kind` (string, required): `bin`, `staticlib`, or `sharedlib`.
|
- `kind` (string, required): `bin`, `staticlib`, or `sharedlib`.
|
||||||
|
- `filename` (string, optional): custom output filename (without extension). Overrides `package.name` for the final artifact.
|
||||||
|
- `extension` (string, optional): custom file extension without the leading dot (e.g. `BIN`, `efi`, `EFI`). Combined with `filename`.
|
||||||
- `inherit` (bool, optional): inherit settings from base `[build]` (default `true`). If `false`, only use target/profile specific settings.
|
- `inherit` (bool, optional): inherit settings from base `[build]` (default `true`). If `false`, only use target/profile specific settings.
|
||||||
- `targets` (string array, optional): list of targets to build simultaneously. Supports short names (`linux`, `macos`, `windows`).
|
- `targets` (string array, optional): list of targets to build simultaneously. Supports short names (`linux`, `macos`, `windows`).
|
||||||
- `target` (string, optional): custom output directory for final artifact.
|
- `target` (string, optional): custom output directory for final artifact.
|
||||||
|
When set, DCR automatically injects `--target=<value>` into `cflags` (useful for clang cross-compilation).
|
||||||
- `platform` (string, optional): architecture hint for compiler (used for `-march` or `/arch`).
|
- `platform` (string, optional): architecture hint for compiler (used for `-march` or `/arch`).
|
||||||
- `cflags` (string array, optional): extra compile flags.
|
- `cflags` (string array, optional): extra compile flags.
|
||||||
- `ldflags` (string array, optional): extra link flags.
|
- `ldflags` (string array, optional): extra link flags.
|
||||||
|
|||||||
@@ -178,6 +178,8 @@ compiler = "aarch64-linux-gnu-gcc"' >> dcr.toml
|
|||||||
dcr build --target aarch64-linux-gnu --release
|
dcr build --target aarch64-linux-gnu --release
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Note:** If you set `target = "aarch64-linux-gnu"` (or any value) directly under `[build]`, DCR will automatically add `--target=...` to cflags when using clang. You usually don't need to repeat it manually.
|
||||||
|
|
||||||
### Windows Build on Linux
|
### Windows Build on Linux
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
|
|||||||
@@ -7,9 +7,11 @@ dcr new <name>
|
|||||||
dcr init
|
dcr init
|
||||||
dcr setup
|
dcr setup
|
||||||
dcr add <name> <source>(optional)
|
dcr add <name> <source>(optional)
|
||||||
dcr build [--debug|--release]
|
dcr build [--debug|--release] [--target <triple>]
|
||||||
dcr run [--debug|--release]
|
dcr run [--debug|--release]
|
||||||
dcr clean [--debug|--release] [--all]
|
dcr clean [--debug|--release] [--all]
|
||||||
|
dcr tree
|
||||||
|
dcr test
|
||||||
dcr gen <subcommand>
|
dcr gen <subcommand>
|
||||||
dcr --help
|
dcr --help
|
||||||
dcr --version
|
dcr --version
|
||||||
@@ -23,6 +25,8 @@ dcr --update
|
|||||||
- `init` and `--update` do not accept extra arguments.
|
- `init` and `--update` do not accept extra arguments.
|
||||||
- `clean` accepts `--debug|--release` and optional `--all`.
|
- `clean` accepts `--debug|--release` and optional `--all`.
|
||||||
- `gen` supports `project-info`, `compile-commands`, `vscode`, `clion`.
|
- `gen` supports `project-info`, `compile-commands`, `vscode`, `clion`.
|
||||||
|
- `tree` shows a dependency tree (similar to `cargo tree`).
|
||||||
|
- `test` / `tests` runs the project's tests.
|
||||||
|
|
||||||
## Exit behavior overview
|
## Exit behavior overview
|
||||||
|
|
||||||
|
|||||||
@@ -12,6 +12,8 @@ language = "c|c++|cpp|cxx|asm" # required (string or array)
|
|||||||
standard = "string" # required
|
standard = "string" # required
|
||||||
compiler = "string" # required
|
compiler = "string" # required
|
||||||
kind = "bin|staticlib|sharedlib" # required
|
kind = "bin|staticlib|sharedlib" # required
|
||||||
|
filename = "string" # optional (custom output name without extension)
|
||||||
|
extension = "string" # optional (custom extension without dot, e.g. "BIN")
|
||||||
target = "string" # optional
|
target = "string" # optional
|
||||||
platform = "string" # optional
|
platform = "string" # optional
|
||||||
cflags = ["string", "..."] # optional
|
cflags = ["string", "..."] # optional
|
||||||
|
|||||||
@@ -129,6 +129,19 @@ fn default_flags(profile: &str) -> &'static [&'static str] {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn is_bare_metal_target(target: Option<&str>) -> bool {
|
||||||
|
if let Some(t) = target {
|
||||||
|
let lower = t.to_lowercase();
|
||||||
|
lower.contains("none")
|
||||||
|
|| lower.contains("-elf")
|
||||||
|
|| lower.contains("eabi")
|
||||||
|
|| lower.contains("baremetal")
|
||||||
|
|| lower.contains("bare-metal")
|
||||||
|
} else {
|
||||||
|
false
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn build_objects(
|
fn build_objects(
|
||||||
compiler: &str,
|
compiler: &str,
|
||||||
sources: &[String],
|
sources: &[String],
|
||||||
@@ -183,7 +196,8 @@ fn build_object(
|
|||||||
cmd.arg(format!("-std={}", ctx.standard));
|
cmd.arg(format!("-std={}", ctx.standard));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ctx.cflags.is_empty() {
|
let use_dcr_defaults = ctx.cflags.is_empty() && !is_bare_metal_target(ctx.target);
|
||||||
|
if use_dcr_defaults {
|
||||||
for flag in default_flags(ctx.profile) {
|
for flag in default_flags(ctx.profile) {
|
||||||
cmd.arg(flag);
|
cmd.arg(flag);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user