# Reproducible cross-compilation environment for Windows trampolines. # # All toolchain versions are pinned for binary reproducibility. # This image provides the build environment; the workspace is bind-mounted # at runtime by scripts/build-trampolines.sh. ARG UBUNTU_SNAPSHOT=20260127T200000Z ARG RUST_NIGHTLY=nightly-2026-05-06 ARG XWIN_SDK_VERSION=10.0.22621 ARG XWIN_CRT_VERSION=14.44.17.14 FROM docker.io/ubuntu:26.04@sha256:4095ef613201918336b5d7d00be15d8b09c72ddb77c80bca249c255887a64d87 AS base ARG RUST_NIGHTLY ARG UBUNTU_SNAPSHOT ENV HOME=/app ENV CARGO_HOME=${HOME}/rust/cargo ENV RUSTUP_HOME=${HOME}/rust/rustup ENV XWIN_CACHE_DIR=${HOME}/xwin-cache WORKDIR ${HOME} # Install build dependencies RUN apt install -y --update ca-certificates && \ apt install -y --update --snapshot ${UBUNTU_SNAPSHOT} \ curl \ llvm \ clang \ lld \ python3 \ && ln -s /usr/bin/llvm-mt /usr/bin/mt.exe \ && rm -rf /var/lib/apt/lists/* # Install Rust nightly toolchain with Windows targets ARG RUSTUP_VERSION=1.29.2 RUN curl --proto '=https' --tlsv1.2 -sSf \ "https://static.rust-lang.org/rustup/archive/${RUSTUP_VERSION}/$(uname -m)-unknown-linux-gnu/rustup-init" \ -o rustup-init \ && chmod +x rustup-init \ && ./rustup-init -y --default-toolchain=${RUST_NIGHTLY} --profile=minimal \ && rm rustup-init ENV PATH="${CARGO_HOME}/bin:${PATH}" RUN rustup component add rust-src --toolchain ${RUST_NIGHTLY}-x86_64-unknown-linux-gnu && \ rustup target add --toolchain ${RUST_NIGHTLY} \ i686-pc-windows-msvc \ x86_64-pc-windows-msvc \ aarch64-pc-windows-msvc # Install cargo-xwin FROM base AS cargo-xwin COPY --from=ghcr.io/astral-sh/uv:0.13.0@sha256:cdc6093146eb3ff6a40107b38f008b789e050e77ad87865e381d9917da55a168 /uv /usr/local/bin/uv COPY toolchain/pyproject.toml toolchain/uv.lock ./ RUN uv sync --locked --no-dev --python /usr/bin/python3 # Prefetch the Windows SDK/CRT FROM base AS xwin-cache ARG XWIN_SDK_VERSION ARG XWIN_CRT_VERSION COPY --from=cargo-xwin ${HOME}/.venv/bin/cargo-xwin /usr/local/bin/cargo-xwin RUN cargo xwin cache xwin \ --xwin-sdk-version ${XWIN_SDK_VERSION} \ --xwin-crt-version ${XWIN_CRT_VERSION} \ --xwin-arch x86,x86_64,aarch64 FROM base COPY --from=xwin-cache ${HOME}/xwin-cache ${HOME}/xwin-cache RUN chmod a+rwX ${HOME}/xwin-cache COPY --from=cargo-xwin ${HOME}/.venv/bin/cargo-xwin /usr/local/bin/cargo-xwin COPY --from=cargo-xwin /usr/local/bin/uv /usr/local/bin/uv