====== Cross-Compilation mit Lyx ======
''lyxc'' ist ein self-contained Cross-Compiler: kein externer Linker, keine separate Toolchain-Konfiguration. Eine einzige Binary erzeugt nativen Code für alle unterstützten Zielplattformen.
→ [[lyx_-_programmiersprache:guides|Guides]] · [[lyx_-_programmiersprache:tools:compiler-parameter|Compiler-Parameter]]
----
===== Alle Zielplattformen =====
^ Target-String ^ Alias ^ Architektur ^ Format ^ ABI ^ Status ^
| ''linux'' | ''x86_64'' | x86_64 | ELF64 | SysV AMD64 | Stabil |
| ''arm64'' | ''linux-arm64'' | ARM64 | ELF64 | AAPCS64 | Stabil |
| ''linux-riscv64'' | – | RV64GC | ELF64 | LP64D | Stabil |
| ''riscv'' | ''riscv64'' | RV64GC | ELF64 | LP64D | Stabil |
| ''arm-cm4'' | ''arm-cm33'' | ARM Cortex-M4/M33 | ELF32 | ARM EABI5 | Stabil |
| ''arm_cm'' | – | ARM Cortex-M (generisch) | ELF32 | ARM EABI5 | Stabil |
| ''win64'' | ''windows-x86_64'' | x86_64 | PE32+ | Windows x64 | Stabil |
| ''windows-arm64'' | – | ARM64 | PE32+ | Windows ARM64 | Stabil |
| ''macosx64'' | ''macos-x86_64'' | x86_64 | Mach-O | SysV AMD64 | Stabil |
| ''macos-arm64'' | – | ARM64 (Apple Silicon) | Mach-O | AAPCS64 | Stabil |
| ''android'' | ''android-arm64'' | ARM64 | ELF64 (.so) | Android Bionic | Stabil |
| ''android-x86_64'' | – | x86_64 | ELF64 (.so) | Android Bionic | Stabil |
| ''esp32'' | ''esp32s3'' | Xtensa LX6 | ELF32 | Vereinfacht SysV | Experimentell |
**Standard:** Kein ''--target'' → Host-Plattform (in der Regel ''linux''/x86_64).
----
===== Typische Workflows =====
==== ARM64 Linux (Raspberry Pi, Embedded-Server) ====
lyxc main.lyx --target=arm64 -o firmware.elf
# Mit Energy-Optimierung für Batteriebetrieb:
lyxc main.lyx --target=arm64 --target-energy=1 -o sensor.elf
# Safety-Build (DO-178C):
lyxc flight.lyx --target=arm64 --no-fp-fold --stack-check --lint -o flight.elf
Die erzeugte ELF verwendet ''/lib/ld-linux-aarch64.so.1'' als Dynamic Linker — das muss auf dem Zielsystem vorhanden sein. Für Systeme ohne Standard-Loader:
lyxc main.lyx --target=arm64 --static --no-libc-init -o firmware.elf
''--static'' entfernt den Dynamic-Linker-Eintrag. ''--no-libc-init'' erzeugt einen 12-Byte Bare-Metal-Stub statt des normalen 56-Byte ''_start'' (kein ''//__libc_start_main//'').
----
==== Windows x64 (Cross von Linux) ====
lyxc main.lyx --target=win64 -o app.exe
lyxc main.lyx --target=windows-arm64 -o app_arm64.exe
Erzeugt eine vollständige PE32+-Datei. Keine Wine- oder MSVC-Installation nötig.
----
==== RISC-V (Embedded-Controller, HiFive, VisionFive) ====
# Generisches RISC-V RV64GC:
lyxc main.lyx --target=riscv -o controller.elf
# Linux-spezifisch (mit Linux ABI-Optimierungen):
lyxc main.lyx --target=linux-riscv64 -o app.elf
**Einschränkung:** Kein Dynamic Linking für RISC-V — immer statisch linken (''--static'') oder ''-l''-Flags vermeiden.
----
==== ARM Cortex-M (Bare-Metal Microcontroller) ====
Für STM32, nRF52, RP2040 und kompatible Cortex-M4/M33-Systeme:
# Cortex-M4 / Cortex-M33:
lyxc main.lyx --target=arm-cm4 --no-libc-init -o firmware.elf
# Generisch Cortex-M (M0/M3):
lyxc main.lyx --target=arm_cm --no-libc-init -o firmware.elf
**Wichtig:** Kein Hardware-FPU-Support — Fließkomma läuft als Software-Emulation. Für DO-178C mit FPU: ''--no-fp-fold'' setzen.
Das ELF32-Format enthält ''e_flags = EABI5 | Thumb-interwork'' — direkt flashbar mit ''objcopy'' oder ''openocd''.
----
==== ESP32 / ESP32-S3 (Xtensa LX6 — experimentell) ====
lyxc main.lyx --target=esp32 --no-libc-init -o app.elf
lyxc main.lyx --target=esp32s3 --no-libc-init -o app_s3.elf
**Status: Experimentell.** Bekannte Einschränkungen:
* Segfault bei komplexen Programmen möglich
* Kein Dynamic Linking
* Eingeschränkte Stdlib-Unterstützung — nur Builtins verwenden
----
==== Android (.so + JNI) ====
Android-Bibliotheken werden als ''.so'' erzeugt:
lyxc mylib.lyx --target=android --output-type=shared-lib -o libmylib.so
# Android API-Level explizit setzen (Default: 26 = Android 8.0, Minimum: 21):
lyxc mylib.lyx --target=android --android-api=29 --output-type=shared-lib -o libmylib.so
# Android x86_64 (Emulator):
lyxc mylib.lyx --target=android-x86_64 --output-type=shared-lib -o libmylib_x86.so
**JNI-Funktionen** werden mit ''@jni'' annotiert — der Compiler mangelt den Namen automatisch in das Java-Format ''Java__'':
import std.io;
@jni(class="com/example/MyApp", method="hello")
pub fn hello(): void {
PrintLn("Hello from Lyx via JNI!");
}
@jni(class="com/example/MyApp", method="add")
pub fn add(a: int64, b: int64): int64 {
return a + b;
}
Das erzeugte ''.so'' enthält ein ''.note.android.ident''-Section mit dem API-Level — erforderlich für den Android-Loader.
----
===== Bare-Metal: kein Betriebssystem =====
Für Microcontroller und Custom-Bootloader ohne OS-Unterstützung:
lyxc main.lyx --target=arm-cm4 --no-libc-init --static -o bare.elf
Was ''--no-libc-init'' bewirkt:
* Kein ''__libc_start_main''-Aufruf
* Kein ''DT_NEEDED libc.so.6'' im ELF
* 12-Byte ''BL main + exit''-Stub statt 56-Byte Standard-''_start''
* ''main()'' wird direkt als Einstiegspunkt verwendet
----
===== Compiler ist vollständig self-contained =====
''lyxc'' benötigt **keinen externen Linker** (kein ''ld'', ''lld'', ''arm-none-eabi-ld''). Der Compiler schreibt das fertige Binary (ELF64/ELF32/PE32+/Mach-O) direkt — Parsing, Codegen und Linking in einem Schritt.
Externe ''C''-Bibliotheken werden trotzdem unterstützt:
# C-Bibliothek linken (lyxc löst Symbole selbst auf):
lyxc main.lyx -lm -lpthread -o app
# Eigene Shared Library einbinden:
lyxc main.lyx -L/opt/mylibs -lmylib -o app
----
===== Bekannte Einschränkungen =====
^ Plattform ^ Einschränkung ^ Workaround ^
| ESP32 | Segfault bei komplexen Programmen | Einfachere Programme, keine tiefe Rekursion |
| ESP32 | Kein Dynamic Linking | Immer statisch kompilieren |
| RISC-V | Kein Dynamic Linking | ''--static'' verwenden |
| ARM Cortex-M | Kein Hardware-FPU | Software-Float; für DO-178C: ''--no-fp-fold'' |
| ARM Cortex-M | TrustZone nur Stub | Nur M-Mode nutzen |
| Alle | Einige IR-Operationen Stubs in Nicht-x86-Backends | x86_64 Linux als primäres Build-Target nutzen |
Letzte Aktualisierung: 2026-06-08