docs: add cross-compilation design document

This commit is contained in:
2026-06-10 20:19:17 +03:00
parent c6bae8b9ee
commit 18aa232b1c
@@ -0,0 +1,97 @@
# Bux Cross-Compilation Support — Design Document
> **Date:** 2026-06-10
> **Status:** Approved
> **Scope:** MVP cross-compilation via `--target` CLI flag
---
## 1. Overview
Bux compiles to C, which means cross-compilation is nearly free — we only need to pass the correct target triple to the C compiler (`cc`). This feature adds `--target <triple>` support to the Bux CLI.
### Goals
- `bux build --target aarch64-linux-gnu` produces an ARM64 binary
- `bux build --target x86_64-windows-gnu` produces a Windows binary
- No changes to the compiler pipeline — only the final `cc` invocation changes
### Non-Goals
- Automatic cross-compiler toolchain detection
- Custom linker scripts or startup code
- Multiple target builds in one invocation
---
## 2. How Cross-Compilation Works
Bux compilation pipeline:
```
.bux source → lexer → parser → sema → HIR → C code → cc → binary
```
The entire pipeline is target-independent until the final `cc` step. For cross-compilation:
1. Bux generates the same C code
2. Instead of `cc -O2 -pthread -o output ...`
3. We run `cc -O2 -pthread -target aarch64-linux-gnu -o output ...`
Or, if a cross-compiler prefix is needed:
```
aarch64-linux-gnu-gcc -O2 -pthread -o output ...
```
---
## 3. CLI Interface
```bash
# Native build (default)
bux build
# Cross-compile to ARM64 Linux
bux build --target aarch64-linux-gnu
# Cross-compile to Windows
bux build --target x86_64-pc-windows-gnu
# Also works with buxc project
buxc project . --target aarch64-linux-gnu
```
---
## 4. Implementation
### Changes to `src/cli.bux`
1. **Parse `--target` flag:** In `Cli_Run`, scan `args` for `--target` before processing the command. Extract the target triple.
2. **Store target:** Add a global variable `g_targetTriple: String` (default `""`).
3. **Pass to `cc`:** In both `Cli_Compile` (line ~251) and `Cli_BuildProject` (line ~1143), append `-target <triple>` to the `cc` command if `g_targetTriple` is set.
### Target Triple Format
We pass the triple directly to `cc` without validation. Examples:
- `aarch64-linux-gnu``cc -target aarch64-linux-gnu ...`
- `x86_64-pc-windows-gnu``cc -target x86_64-pc-windows-gnu ...`
- `wasm32-wasi``cc -target wasm32-wasi ...`
### Error Handling
If `cc` fails with an invalid target, the user sees the standard `cc` error message. Bux does not need custom error handling for this.
---
## 5. Files to Modify
| File | Change |
|------|--------|
| `src/cli.bux` | Parse `--target` flag, store in global, append to `cc` command |
---
## 6. Testing
1. **Native build:** `bux build` — should work as before (no `-target` flag)
2. **Invalid target:** `bux build --target invalid-target``cc` should fail with appropriate error
3. **Valid target (if cross-compiler available):** `bux build --target aarch64-linux-gnu` — should produce ARM64 binary