Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

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ı

PlatformTarget TripleBinary Format
Windows x64x86_64-pc-windows-msvc.exe
Windows x86i686-pc-windows-msvc.exe
Linux x64x86_64-unknown-linux-gnuELF
Linux ARM64aarch64-unknown-linux-gnuELF
macOS x64x86_64-apple-darwinMach-O
macOS ARMaarch64-apple-darwinMach-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)

PlatformTarget TripleKullanım
WASM (Browser)wasm32-unknown-unknownWeb uygulamaları
WASIwasm32-wasiStandalone 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 FamilyTarget Triple
Cortex-M0/M0+thumbv6m-none-eabi
Cortex-M3thumbv7m-none-eabi
Cortex-M4/M7thumbv7em-none-eabi
Cortex-M4F/M7Fthumbv7em-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

PlatformTarget Triple
Android ARM64aarch64-linux-android
Android ARMv7armv7-linux-androideabi
Android x86_64x86_64-linux-android
iOS ARM64aarch64-apple-ios
iOS Simulatorx86_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

  1. 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
    
  2. Platform feature'ları kullanın:

    [features]
    windows = []
    linux = []
    embedded = []
    
  3. Binary boyutuna dikkat (embedded için):

    berk-lang build --target=thumbv7em-none-eabihf --opt-size program.berk
    
  4. ⚠️ 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 target komutu
  • Conditional compilation: Platform özel kod
  • QEMU: Cross-compiled binary testi