Cross-Compilation
BERK, LLVM backend sayesinde birçok farklı platform için derleme yapabilir. Bir platformda geliştirip başka bir platform için binary üretebilirsiniz.
Cross-Compilation Nedir?
Cross-compilation, bir platformda (host) başka bir platform (target) için kod derlemektir:
- Host: Derlemenin yapıldığı platform (örn: Windows x64)
- Target: Binary'nin çalışacağı platform (örn: Linux ARM)
Örnek: Windows PC'nizde Raspberry Pi için program derlemek
Temel Kullanım
# Target platform belirt
berk-lang build --target=<target-triple> program.berk
# Örnek: Windows'ta Linux için derle
berk-lang build --target=x86_64-unknown-linux-gnu program.berk
Target Triple Formatı
Target specification formatı: <arch>-<vendor>-<os>-<abi>
- arch: Mimari (x86_64, aarch64, arm, wasm32...)
- vendor: Üretici (pc, apple, unknown...)
- os: İşletim sistemi (windows, linux, darwin, none...)
- abi: ABI (gnu, msvc, musl, eabi...)
Desteklenen Platformlar
Desktop Platformları
| Platform | Target Triple | Binary Format |
|---|---|---|
| Windows x64 | x86_64-pc-windows-msvc | .exe |
| Windows x86 | i686-pc-windows-msvc | .exe |
| Linux x64 | x86_64-unknown-linux-gnu | ELF |
| Linux ARM64 | aarch64-unknown-linux-gnu | ELF |
| macOS x64 | x86_64-apple-darwin | Mach-O |
| macOS ARM | aarch64-apple-darwin | Mach-O |
Örnekler
# Windows x64
berk-lang build --target=x86_64-pc-windows-msvc program.berk -o program.exe
# Linux x64
berk-lang build --target=x86_64-unknown-linux-gnu program.berk -o program
# macOS ARM (M1/M2)
berk-lang build --target=aarch64-apple-darwin program.berk -o program
WebAssembly (WASM)
| Platform | Target Triple | Kullanım |
|---|---|---|
| WASM (Browser) | wasm32-unknown-unknown | Web uygulamaları |
| WASI | wasm32-wasi | Standalone WASM |
Browser WASM
# WebAssembly derle
berk-lang build --target=wasm32-unknown-unknown program.berk -o program.wasm
# Optimize edilmiş (küçük boyut)
berk-lang build --target=wasm32-unknown-unknown --opt-size program.berk -o program.wasm
WASI (Standalone)
# WASI ile derle
berk-lang build --target=wasm32-wasi program.berk -o program.wasm
# Wasmtime ile çalıştır
wasmtime program.wasm
Embedded Systems (Gömülü Sistemler)
ARM Cortex-M (STM32)
| MCU Family | Target Triple |
|---|---|
| Cortex-M0/M0+ | thumbv6m-none-eabi |
| Cortex-M3 | thumbv7m-none-eabi |
| Cortex-M4/M7 | thumbv7em-none-eabi |
| Cortex-M4F/M7F | thumbv7em-none-eabihf |
# STM32F4 için derle (Cortex-M4 with FPU)
berk-lang build --target=thumbv7em-none-eabihf program.berk -o firmware.elf
ESP32 (Xtensa)
# ESP32 için derle
berk-lang build --target=xtensa-esp32-none-elf program.berk -o firmware.bin
# ESP32-S3 için
berk-lang build --target=xtensa-esp32s3-none-elf program.berk
Raspberry Pi Pico (RP2040)
# RP2040 için derle
berk-lang build --target=thumbv6m-none-eabi program.berk -o firmware.uf2
Arduino (AVR)
# Arduino Uno (ATmega328P) için
berk-lang build --target=avr-unknown-gnu-atmega328 program.berk -o firmware.hex
# Arduino Mega (ATmega2560) için
berk-lang build --target=avr-unknown-gnu-atmega2560 program.berk
Mobil Platformlar
| Platform | Target Triple |
|---|---|
| Android ARM64 | aarch64-linux-android |
| Android ARMv7 | armv7-linux-androideabi |
| Android x86_64 | x86_64-linux-android |
| iOS ARM64 | aarch64-apple-ios |
| iOS Simulator | x86_64-apple-ios |
# Android ARM64
berk-lang build --target=aarch64-linux-android program.berk -o libprogram.so
# iOS
berk-lang build --target=aarch64-apple-ios program.berk -o libprogram.a
Çapraz Derleme Kurulumu
Windows → Linux
# 1. Linux toolchain kur
berk-lang target add x86_64-unknown-linux-gnu
# 2. Derle
berk-lang build --target=x86_64-unknown-linux-gnu program.berk
Linux → Windows
# MinGW-w64 kur
sudo apt install mingw-w64
# Target ekle
berk-lang target add x86_64-pc-windows-gnu
# Derle
berk-lang build --target=x86_64-pc-windows-gnu program.berk -o program.exe
macOS → Linux
# Cross-compiler kur
brew install FiloSottile/musl-cross/musl-cross
# Derle
berk-lang build --target=x86_64-unknown-linux-musl program.berk
Target Yönetimi
# Mevcut target'ları listele
berk-lang target list
# Yeni target ekle
berk-lang target add aarch64-unknown-linux-gnu
# Target kaldır
berk-lang target remove aarch64-unknown-linux-gnu
# Varsayılan target ayarla
berk-lang target default x86_64-pc-windows-msvc
berk.toml ile Multi-Target
[package]
name = "my_app"
version = "1.0.0"
# Varsayılan target
[build]
default-target = "x86_64-pc-windows-msvc"
# Her platform için özel ayarlar
[target.x86_64-pc-windows-msvc]
linker = "link.exe"
[target.x86_64-unknown-linux-gnu]
linker = "gcc"
strip = true
[target.wasm32-unknown-unknown]
optimization = "size"
lto = true
Universal Binary (macOS)
Intel ve ARM Mac'ler için tek binary:
# Intel derle
berk-lang build --target=x86_64-apple-darwin program.berk -o program_intel
# ARM derle
berk-lang build --target=aarch64-apple-darwin program.berk -o program_arm
# Universal binary oluştur
lipo -create program_intel program_arm -output program
Sysroot ve Linker Ayarları
# Custom sysroot
berk-lang build --target=aarch64-unknown-linux-gnu \
--sysroot=/opt/cross/aarch64-linux-gnu \
program.berk
# Custom linker
berk-lang build --target=x86_64-unknown-linux-gnu \
--linker=clang \
program.berk
Platform Özel Kod
Conditional Compilation
#[eğer(hedef_os = "windows")]
fonksiyon platform_özel() yap
yazdir("Windows üzerinde çalışıyorum")
son
#[eğer(hedef_os = "linux")]
fonksiyon platform_özel() yap
yazdir("Linux üzerinde çalışıyorum")
son
#[eğer(hedef_arch = "wasm32")]
fonksiyon platform_özel() yap
yazdir("WebAssembly'de çalışıyorum")
son
Platform Sabitleri
sabit PLATFORM = #hedef_os
sabit ARCH = #hedef_arch
fonksiyon ana() yap
yazdir("Platform: {}", PLATFORM)
yazdir("Mimari: {}", ARCH)
son
En İyi Uygulamalar
-
✅ CI/CD ile test edin:
# GitHub Actions jobs: build: strategy: matrix: target: - x86_64-pc-windows-msvc - x86_64-unknown-linux-gnu - aarch64-apple-darwin -
✅ Platform feature'ları kullanın:
[features] windows = [] linux = [] embedded = [] -
✅ Binary boyutuna dikkat (embedded için):
berk-lang build --target=thumbv7em-none-eabihf --opt-size program.berk -
⚠️ Endianness farkına dikkat:
- x86/ARM: Little-endian
- Bazı embedded: Big-endian
Debugging Cross-Compiled Binaries
QEMU ile Test
# ARM binary'yi x86 PC'de çalıştır
qemu-arm program_arm
# Debug mode
qemu-arm -g 1234 program_arm
gdb-multiarch program_arm
(gdb) target remote :1234
Remote Debugging
# Hedef cihazda gdbserver çalıştır
gdbserver :1234 program
# Host'ta bağlan
gdb program
(gdb) target remote 192.168.1.100:1234
Performans İpuçları
| Platform | Öneri |
|---|---|
| Desktop | -O2 veya -O3 |
| WASM | --opt-size --lto |
| Embedded | --opt-size (memory sınırlı) |
| Mobile | -O2 --lto |
Özet
- ✅ LLVM backend: Çok platform desteği
- ✅ Desktop: Windows, Linux, macOS
- ✅ Web: WebAssembly (WASM)
- ✅ Embedded: ARM, ESP32, Arduino
- ✅ Mobile: Android, iOS
- ✅ Target yönetimi:
berk-lang targetkomutu - ✅ Conditional compilation: Platform özel kod
- ✅ QEMU: Cross-compiled binary testi