#!/bin/sh
# cross-cc-freebsd — Apple clang wrapper that emits FreeBSD ELF.
#
# Usage:  cross-cc-freebsd <arch> [clang args...]
#
# <arch> is the leading argv[0] sniff value: "x86_64" or "aarch64".
# The wrapper picks a target triple, points clang at the FreeBSD sysroot in
# .freebsd-sysroot/<arch>/, and prepends the matching crt object dir to the
# link line so the FreeBSD libc resolves correctly.
#
# Intended to be invoked through one of two argv[0] symlinks:
#   support/cross-cc-freebsd-amd64    -> cross-cc-freebsd
#   support/cross-cc-freebsd-arm64    -> cross-cc-freebsd
#
# Override CLANG=/path/to/clang if Apple's /usr/bin/clang is missing.

set -eu

CLANG="${CLANG:-/usr/bin/clang}"
SCRIPT_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_DIR="$(cd "$SCRIPT_DIR/.." && pwd)"

self="$(basename "$0")"
case "$self" in
    cross-cc-freebsd-amd64) arch=amd64;     triple=x86_64-unknown-freebsd14.0;  release_arch=amd64/amd64   ;;
    cross-cc-freebsd-arm64) arch=arm64;     triple=aarch64-unknown-freebsd14.0; release_arch=arm64/aarch64 ;;
    *)
        echo "ERROR: cross-cc-freebsd must be invoked via cross-cc-freebsd-{amd64,arm64} symlink" >&2
        exit 1
        ;;
esac

SYSROOT="${FREEBSD_SYSROOT:-$REPO_DIR/.freebsd-sysroot/$arch}"
[ -d "$SYSROOT/usr/include" ] || {
    echo "ERROR: FreeBSD sysroot missing at $SYSROOT (expected usr/include + usr/lib)" >&2
    echo "       Download with: curl -L -o .freebsd-sysroot/base.txz \\" >&2
    echo "         https://download.freebsd.org/releases/$release_arch/14.4-RELEASE/base.txz" >&2
    echo "       Then: tar -xf .freebsd-sysroot/base.txz -C .freebsd-sysroot/$arch ./usr/include ./usr/lib ./lib" >&2
    exit 1
}

exec "$CLANG" \
    --target="$triple" \
    --sysroot="$SYSROOT" \
    -B"$SYSROOT/usr/lib" \
    -fuse-ld=lld \
    "$@"
