mirror of
https://github.com/dexoron/dcr.git
synced 2026-10-21 13:08:29 +00:00
feat(build): add flat-bin kind and FAT [archive] packing for OS-dev
This commit is contained in:
@@ -56,7 +56,7 @@ moc = "moc {in} -o {out}"
|
||||
### GAS / NASM / MASM / FASM / LLVM-IR
|
||||
|
||||
- GAS: `-I`, `-c -o`, `--defsym`
|
||||
- NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32)
|
||||
- NASM: `-I`, `-o`, `-D`, `-f` (format: win64/elf64/macho64/macho32/elf32; **`bin` when `kind = "flat-bin"`**)
|
||||
- MASM: `/nologo /c /Fo<obj> <source>`
|
||||
- FASM: `<source> <output>` (output path is the object file)
|
||||
- LLVM IR: `-filetype=obj <source> -o <output>`
|
||||
@@ -87,6 +87,11 @@ Three levels of incrementality:
|
||||
| `elf` | ELF without stdlib | `target/<triple>/<profile>/<name>` |
|
||||
| `none` | Compile only, no link | — |
|
||||
| `custom` | Full filename+extension control | `target/<triple>/<profile>/<filename>.<extension>` |
|
||||
| `flat-bin` | Raw binary | ASM: `<stem>.bin` (NASM `-f bin` / FASM / GAS·MASM·LLC via objcopy); C/C++: `<name>.bin` (link + objcopy) |
|
||||
|
||||
## Disk images (`[archive]`)
|
||||
|
||||
After a successful build, if `[archive]` is present in `dcr.toml`, DCR formats a FAT volume and copies files from `layout` into the image. See [dcr.toml → archive](/docs/reference/dcr-toml#archive).
|
||||
|
||||
## Build Steps
|
||||
|
||||
|
||||
@@ -57,14 +57,8 @@ dcr build --target aarch64-none-elf
|
||||
|
||||
## Target Directory
|
||||
|
||||
On Linux with explicit target:
|
||||
By default, the compilation output directories are structured as follows:
|
||||
|
||||
```
|
||||
target/<triple>/<profile>/
|
||||
```
|
||||
|
||||
On macOS/Windows or without target:
|
||||
|
||||
```
|
||||
target/<profile>/
|
||||
```
|
||||
- **Linux and BSD**: Always output to `target/<triple>/<profile>/` (using host triple if no target is specified).
|
||||
- **macOS and Windows (without target)**: Output to `target/<profile>/`.
|
||||
- **macOS and Windows (with explicit target)**: Output to `target/<triple>/<profile>/`.
|
||||
|
||||
@@ -33,6 +33,9 @@ Main project configuration file. Located at the project root.
|
||||
|
||||
[run]
|
||||
# run settings
|
||||
|
||||
[archive]
|
||||
# optional: pack FAT disk image after build
|
||||
```
|
||||
|
||||
## [package]
|
||||
@@ -62,18 +65,18 @@ author = "John Doe"
|
||||
|
||||
| Field | Default | Description |
|
||||
|-------|---------|-------------|
|
||||
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"` (optional, defaults to `"c"`) |
|
||||
| `language` | `"c"` | `"c"`, `"c++"`, `"cpp"`, `"cxx"`, `"asm"`, `"llvm_ir"`, `"llvm-ir"`, `"ll"` (optional, defaults to `"c"`) |
|
||||
| `standard` | `"c11"` | C standard (`c11`, `c17`, `c23`) |
|
||||
| `cxx_standard` | — | C++ standard (`c++17`, `c++20`, `c++23`) |
|
||||
| `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 |
|
||||
| `platform` | `"native"` | `native`, `efi` |
|
||||
| `cflags` | `[]` | Additional C/C++/ASM flags |
|
||||
| `ldflags` | `[]` | Additional linker flags |
|
||||
| `filename` | `""` | Custom output file name |
|
||||
| `extension` | `""` | Custom file extension |
|
||||
| `roots` | `["src"]` | Source root directories |
|
||||
| `extension` | `""` | Custom file extension (for `flat-bin`, default is `bin`) |
|
||||
| `roots` | `["src"]` | Source roots: directories and/or individual source/header files |
|
||||
| `exclude` | `[]` | Exclude patterns |
|
||||
| `include` | `[]` | Additional include directories |
|
||||
| `src_disable` | `false` | Disable auto source discovery |
|
||||
@@ -96,7 +99,7 @@ Settings from raw config (not in typed struct):
|
||||
- `ldscript` — linker script path
|
||||
- `build.steps` / `build.post_steps` — codegen steps
|
||||
|
||||
## Per-language overrides: `[build.c]`, `[build.cxx]`, `[build.asm]`
|
||||
## 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:
|
||||
|
||||
@@ -116,6 +119,9 @@ 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.
|
||||
@@ -172,3 +178,82 @@ Default `cmd` = `./target/{profile}/{name}` (macOS/Windows) or `./target/<triple
|
||||
## [workspace]
|
||||
|
||||
See [workspaces](/docs/reference/workspaces).
|
||||
|
||||
## [archive]
|
||||
|
||||
Optional post-build step: format a FAT volume and copy built artifacts into a disk image. Runs after a successful package build (and after workspace member builds that define `[archive]`).
|
||||
|
||||
| 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).
|
||||
|
||||
@@ -67,6 +67,8 @@ mylib = { path = "/abs/path/to/lib" }
|
||||
mylib = { path = "../relative/path" }
|
||||
```
|
||||
|
||||
*Note: Header resolution automatically checks the packaged `target/include` directory of path dependencies, ensuring consumer packages can find headers from compiled static or dynamic libraries.*
|
||||
|
||||
## dcr.lock
|
||||
|
||||
Dependency lock file. Contains package names and sources.
|
||||
|
||||
@@ -11,17 +11,18 @@ DCR normalizes target triples. Short platform names are expanded to full triples
|
||||
### Linux
|
||||
|
||||
```
|
||||
target/<arch>-unknown-linux-gnu/<profile>/
|
||||
target/<arch>-unknown-linux-<env>/<profile>/
|
||||
```
|
||||
|
||||
Architectures: `x86_64`, `aarch64` (host-detected).
|
||||
Architectures: `x86_64`, `aarch64`, `i686`, `armv7`, `riscv64` (host-detected).
|
||||
Environments: `gnu` (default), `musl`.
|
||||
|
||||
Artifact type: ELF. Extensions: `.so` (sharedlib), `.a` (staticlib).
|
||||
|
||||
### macOS
|
||||
|
||||
```
|
||||
target/<profile>/
|
||||
target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
|
||||
```
|
||||
|
||||
Architectures: `x86_64`, `aarch64` (host-detected).
|
||||
@@ -31,10 +32,11 @@ Extensions: `.dylib` (sharedlib), `.a` (staticlib).
|
||||
### Windows
|
||||
|
||||
```
|
||||
target/<profile>/
|
||||
target/<profile>/ (default) or target/<triple>/<profile>/ (with target)
|
||||
```
|
||||
|
||||
Architectures: `x86_64`, `aarch64`.
|
||||
Environments: `msvc` (default), `gnu` (MinGW).
|
||||
|
||||
Extensions: `.exe` (bin), `.lib` (staticlib), `.dll` (sharedlib), `.efi` (UEFI).
|
||||
|
||||
|
||||
@@ -43,7 +43,9 @@ dcr build # build all packages in dependency order
|
||||
dcr build --workspace app # build only app (dependencies built automatically)
|
||||
```
|
||||
|
||||
When building a workspace, member outputs (libraries) are automatically added to include/lib paths of dependent packages.
|
||||
When building a workspace, DCR automatically injects include and library paths of dependent workspace members:
|
||||
- **Include Paths**: Automatically resolves and injects header directories of dependencies, including the member's `src/` directory, local `include/` directory, and the packaged `target/include` directory.
|
||||
- **Library Paths**: Injects compiled library search paths (`target/lib` as well as target-specific build folders) to allow automatic linking with member libraries.
|
||||
|
||||
## Clean
|
||||
|
||||
|
||||
Reference in New Issue
Block a user