# syntax=docker/dockerfile:1

# FreeBSD 15.1 sysroot used only for headers and target libraries.
FROM ubuntu:24.04 AS sysroot
ARG FREEBSD_RELEASE=15.1-RELEASE
ARG FREEBSD_MIRROR=https://download.freebsd.org/releases/amd64/amd64
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    ca-certificates wget xz-utils \
    && rm -rf /var/lib/apt/lists/*
WORKDIR /tmp/freebsd
RUN set -eux; \
    url="${FREEBSD_MIRROR}/${FREEBSD_RELEASE}"; \
    wget -q "${url}/base.txz" -O base.txz; \
    wget -q "${url}/MANIFEST" -O MANIFEST; \
    expected="$(awk '$1 == "base.txz" { print $2; exit }' MANIFEST)"; \
    test -n "$expected"; \
    echo "$expected  base.txz" | sha256sum -c -; \
    mkdir -p /freebsd-sysroot; \
    tar -xJf base.txz -C /freebsd-sysroot ./lib ./usr/include ./usr/lib

# RustProxy requires rust-version = 1.88.
FROM rust:1.88-slim-bookworm AS builder
RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    ca-certificates clang lld llvm file git perl pkg-config python3 \
    && rm -rf /var/lib/apt/lists/*

COPY --from=sysroot /freebsd-sysroot /opt/freebsd-sysroot

ENV RUSTUP_TOOLCHAIN=1.88.0

RUN rustup target add \
    --toolchain 1.88.0 \
    x86_64-unknown-freebsd

ENV CARGO_TARGET_X86_64_UNKNOWN_FREEBSD_LINKER=clang \
    CC_x86_64_unknown_freebsd=clang \
    CXX_x86_64_unknown_freebsd=clang++ \
    AR_x86_64_unknown_freebsd=llvm-ar \
    RANLIB_x86_64_unknown_freebsd=llvm-ranlib \
    RUST_PROXY_PYTHON=python3 \
    CFLAGS_x86_64_unknown_freebsd="--target=x86_64-unknown-freebsd15.1 --sysroot=/opt/freebsd-sysroot" \
    CXXFLAGS_x86_64_unknown_freebsd="--target=x86_64-unknown-freebsd15.1 --sysroot=/opt/freebsd-sysroot" \
    CARGO_TARGET_X86_64_UNKNOWN_FREEBSD_RUSTFLAGS="-C link-arg=--target=x86_64-unknown-freebsd15.1 -C link-arg=--sysroot=/opt/freebsd-sysroot -C link-arg=-fuse-ld=lld"

WORKDIR /src
CMD ["bash"]
