mirror of
https://github.com/dexoron/dcr.git
synced 2026-10-21 08:58:35 +00:00
Added:
- `build.kind = "efi"` — UEFI PE32+ executable support. Links with `-shared -nostdlib -Wl,-dll -Wl,--subsystem,10`, output via `efi_path()` with `.efi` extension, rejected by `dcr run`.
- `build.kind = "elf"` — bare-metal ELF executable support. Uses `elf_path()` output path, rejected by `dcr run`, no extra linker flags.
Fixed:
- `dcr run` with `--target` or `build.target` now correctly finds the binary in the arch-specific target directory.
- `dcr run` checks profile-specific `build.{profile}.kind` before rejecting library builds (previously only checked `build.kind`).
- `dcr clean` now reads `build.target` from `dcr.toml` when no `--target` flag is given.
- Linux: target directory is now consistent — `target/<arch>-unknown-linux-gnu/<profile>/` (no stale `target/<profile>/`).
- `dcr.lock` is now populated with all resolved dependencies (registry, path, git) instead of being always empty.
- Git dependencies are now properly recognized and recorded in `dcr.lock`.
- `is_registry_dep` correctly identifies version-based registry dependency tables (`{ version = "..." }`) and rejects tables with unknown keys.
- `dcr test` accepts `--debug`/`--release` flags (defaults to `debug` profile instead of always `release`).
- Build fingerprint cache (`build_cache_path`) now includes `target_dir` — different targets no longer share a single cache entry.
- `object_path` no longer hardcodes the `src/` prefix — works correctly with custom `build.roots` (e.g. `roots = ["lib"]`).
- `dcr update` now generates `.exe` candidates for all Windows targets, not just `x86_64-pc-windows-msvc`.
- Compiler existence is verified before starting the build (clear error if compiler is not found in PATH).
- Consolidated duplicate `OUTPUT_MUTEX` definitions — MSVC backend now uses the shared mutex from `common.rs`.
- Registry cache root directory is created if missing (prevents cryptic errors when `~/.dcr/` does not exist).
This commit is contained in:
@@ -64,7 +64,9 @@ dcr build --debug --clean
|
||||
- Incremental rebuild checks source/object mtime and tracked header dependencies.
|
||||
- `--force` skips build cache checks and recompiles.
|
||||
- `--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`).
|
||||
- `build.filename` + `build.extension` allow full control over the final artifact name (e.g. `KERNEL.BIN` instead of using `package.name`). When `build.kind = "efi"`, the output is a PE32+ executable with `.efi` extension.
|
||||
- `build.kind = "efi"` links with `-shared -nostdlib -Wl,-dll -Wl,--subsystem,10` for UEFI PE32+ format. Use `build.filename` and `build.extension` for full control over the artifact name.
|
||||
- `build.kind = "elf"` produces a bare-metal ELF executable. Linking flags are user-controlled via `build.ldflags` (no PIE/CRT defaults are added).
|
||||
- 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`.
|
||||
|
||||
@@ -15,7 +15,7 @@ dcr clean --release --all
|
||||
## Behavior
|
||||
|
||||
- Without arguments: removes entire `target/`.
|
||||
- With profile: removes only `target/<profile>/`.
|
||||
- With profile: removes only the profile-specific directory. Respects `build.target` from config: if `build.target = "aarch64-unknown-linux-gnu"`, cleans `target/aarch64-unknown-linux-gnu/<profile>/`.
|
||||
- With `--all`: also cleans all workspace members.
|
||||
- Additionally removes paths from `build.clean` if configured.
|
||||
- `build.clean` supports `{profile}` and version placeholders.
|
||||
|
||||
@@ -23,7 +23,7 @@ dcr run --debug --clean
|
||||
|
||||
## Restrictions
|
||||
|
||||
- If `build.kind = "staticlib"` or `build.kind = "sharedlib"`, `run` exits with error.
|
||||
- If `build.kind` (or `build.{profile}.kind`) is `"staticlib"` or `"sharedlib"`, `run` exits with error.
|
||||
- The profile is selected from the first argument.
|
||||
- `--target <triple>` runs the binary for specified target (short names: `linux`, `macos`, `windows`).
|
||||
- `--force` skips build cache checks and recompiles.
|
||||
|
||||
@@ -6,6 +6,7 @@ Runs the project's test suite.
|
||||
|
||||
```sh
|
||||
dcr test
|
||||
dcr test --debug
|
||||
dcr test --release
|
||||
dcr test --target linux
|
||||
dcr test --init
|
||||
@@ -39,6 +40,6 @@ DCR uses a simple test framework:
|
||||
|
||||
- Test binary is linked with the main project (for lib projects) or standalone.
|
||||
- `--init` creates `tests/dcr_test.h` and `tests/test.c` if missing.
|
||||
- Tests run in release mode by default for performance.
|
||||
- Tests run in debug mode by default. Use `--release` for release mode.
|
||||
- Custom test logic can be added by editing `tests/test.c`.
|
||||
- Fails if no `tests/test.c` exists (run `dcr test --init` first).
|
||||
@@ -33,7 +33,7 @@ kind = "bin"
|
||||
Mixed languages can be specified as an array, for example `["c", "c++", "asm"]`.
|
||||
- `standard` (string, required): language standard passed to compiler.
|
||||
- `compiler` (string, required): compiler command (for example `clang`, `gcc`, `cl`).
|
||||
- `kind` (string, required): `bin`, `staticlib`, or `sharedlib`.
|
||||
- `kind` (string, required): `bin`, `staticlib`, `sharedlib`, `efi`, or `elf`.
|
||||
- `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.
|
||||
@@ -151,4 +151,4 @@ rcc = "rcc"
|
||||
|
||||
- Compiler backend is selected by compiler string (`gcc`, `clang`, `cl`, `clang-cl`).
|
||||
- Empty or unknown compiler value falls back to clang-like build path.
|
||||
- `run` is not allowed for library kinds (`staticlib`, `sharedlib`).
|
||||
- `run` is not allowed for library kinds (`staticlib`, `sharedlib`), `efi`, or `elf`.
|
||||
|
||||
@@ -49,7 +49,7 @@ dcr clean --release --all
|
||||
|
||||
## Notes
|
||||
|
||||
- `run` is unavailable for `build.kind = "staticlib"` and `build.kind = "sharedlib"`.
|
||||
- `run` is unavailable for `build.kind = "staticlib"`, `build.kind = "sharedlib"`, `build.kind = "efi"`, and `build.kind = "elf"`.
|
||||
- Build profile flag (`--debug` / `--release`) can be passed in any argument position.
|
||||
- Unknown profile flags produce an error.
|
||||
- In workspace root, `clean --all` cleans all member projects.
|
||||
|
||||
Reference in New Issue
Block a user