# MesoClaw Cross-Compilation Dockerfile
# Multi-stage build for cross-compiling to multiple targets.
#
# Usage:
#   docker build -f Dockerfile.cross-compile --target universal -t mesoclaw-cross .
#   docker run --rm -v $(pwd):/workspace mesoclaw-cross \
#     cargo build --release --target aarch64-unknown-linux-gnu -p mesoclaw-daemon
#
# Stages:
#   base         — Rust stable + common build deps
#   linux-cross  — aarch64-unknown-linux-gnu + armv7-unknown-linux-gnueabihf
#   windows-cross — x86_64-pc-windows-gnu via mingw-w64
#   universal    — all targets combined

# ── Stage 1: Base ─────────────────────────────────────────────────────
FROM rust:slim-bookworm AS base

RUN apt-get update && apt-get install -y --no-install-recommends \
    pkg-config \
    libssl-dev \
    build-essential \
    curl \
    ca-certificates \
    && rm -rf /var/lib/apt/lists/*

# Install common Rust components
RUN rustup component add clippy rustfmt

WORKDIR /workspace

# ── Stage 2: Linux Cross ─────────────────────────────────────────────
FROM base AS linux-cross

RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc-aarch64-linux-gnu \
    g++-aarch64-linux-gnu \
    libc6-dev-arm64-cross \
    gcc-arm-linux-gnueabihf \
    g++-arm-linux-gnueabihf \
    libc6-dev-armhf-cross \
    && rm -rf /var/lib/apt/lists/*

# Add Rust targets for Linux ARM
RUN rustup target add aarch64-unknown-linux-gnu \
    && rustup target add armv7-unknown-linux-gnueabihf

# Configure cross-compilation linkers
RUN mkdir -p /root/.cargo && printf '\
[target.aarch64-unknown-linux-gnu]\n\
linker = "aarch64-linux-gnu-gcc"\n\
\n\
[target.armv7-unknown-linux-gnueabihf]\n\
linker = "arm-linux-gnueabihf-gcc"\n' >> /root/.cargo/config.toml

ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc

# ── Stage 3: Windows Cross ───────────────────────────────────────────
FROM base AS windows-cross

RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc-mingw-w64-x86-64 \
    g++-mingw-w64-x86-64 \
    && rm -rf /var/lib/apt/lists/*

# Add Rust target for Windows
RUN rustup target add x86_64-pc-windows-gnu

# Configure cross-compilation linker
RUN mkdir -p /root/.cargo && printf '\
[target.x86_64-pc-windows-gnu]\n\
linker = "x86_64-w64-mingw32-gcc"\n' >> /root/.cargo/config.toml

ENV CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=x86_64-w64-mingw32-gcc

# ── Stage 4: Universal ───────────────────────────────────────────────
FROM base AS universal

RUN apt-get update && apt-get install -y --no-install-recommends \
    gcc-aarch64-linux-gnu \
    g++-aarch64-linux-gnu \
    libc6-dev-arm64-cross \
    gcc-arm-linux-gnueabihf \
    g++-arm-linux-gnueabihf \
    libc6-dev-armhf-cross \
    gcc-mingw-w64-x86-64 \
    g++-mingw-w64-x86-64 \
    && rm -rf /var/lib/apt/lists/*

# Add all cross-compilation targets
RUN rustup target add aarch64-unknown-linux-gnu \
    && rustup target add armv7-unknown-linux-gnueabihf \
    && rustup target add x86_64-pc-windows-gnu

# Configure all cross-compilation linkers
RUN mkdir -p /root/.cargo && printf '\
[target.aarch64-unknown-linux-gnu]\n\
linker = "aarch64-linux-gnu-gcc"\n\
\n\
[target.armv7-unknown-linux-gnueabihf]\n\
linker = "arm-linux-gnueabihf-gcc"\n\
\n\
[target.x86_64-pc-windows-gnu]\n\
linker = "x86_64-w64-mingw32-gcc"\n' >> /root/.cargo/config.toml

ENV CARGO_TARGET_AARCH64_UNKNOWN_LINUX_GNU_LINKER=aarch64-linux-gnu-gcc
ENV CARGO_TARGET_ARMV7_UNKNOWN_LINUX_GNUEABIHF_LINKER=arm-linux-gnueabihf-gcc
ENV CARGO_TARGET_X86_64_PC_WINDOWS_GNU_LINKER=x86_64-w64-mingw32-gcc
