#!/usr/bin/env bash set -Eeuo pipefail source /opt/rust-package-builder/scripts/lib.sh SOURCE_DIR=${1:?source path required} OUTPUT_BINARY=${2:?output binary required} BINARY_NAME=${3:?binary name required} WORK_DIR=${4:?work directory required} BUILD_SOURCE="$WORK_DIR/freebsd-source" rm -rf "$BUILD_SOURCE" mkdir -p "$BUILD_SOURCE" "$(dirname "$OUTPUT_BINARY")" rsync -a --delete \ --exclude='.git/' \ --exclude='target/' \ "$SOURCE_DIR/" "$BUILD_SOURCE/" if [[ "${APPLY_FREEBSD_PATCHES:-1}" == "1" ]]; then /opt/rust-package-builder/scripts/apply-freebsd-patches.sh "$BUILD_SOURCE" else log "FreeBSD/OPNsense source patches disabled" fi FREEBSD_TARGET_VERSION=${FREEBSD_RELEASE%-RELEASE} export CFLAGS_x86_64_unknown_freebsd="--target=x86_64-unknown-freebsd${FREEBSD_TARGET_VERSION} --sysroot=/opt/freebsd-sysroot" export CXXFLAGS_x86_64_unknown_freebsd="--target=x86_64-unknown-freebsd${FREEBSD_TARGET_VERSION} --sysroot=/opt/freebsd-sysroot" export CARGO_TARGET_X86_64_UNKNOWN_FREEBSD_RUSTFLAGS="-C link-arg=--target=x86_64-unknown-freebsd${FREEBSD_TARGET_VERSION} -C link-arg=--sysroot=/opt/freebsd-sysroot -C link-arg=-fuse-ld=lld" log "cross-compiling $BINARY_NAME for x86_64-unknown-freebsd${FREEBSD_TARGET_VERSION}" cd "$BUILD_SOURCE" FREEBSD_RUST_TOOLCHAIN=$(/opt/rust-package-builder/scripts/ensure-rust-toolchain.sh "$BUILD_SOURCE" freebsd) if [[ -f Cargo.lock ]]; then cargo "+$FREEBSD_RUST_TOOLCHAIN" build --release --locked --target x86_64-unknown-freebsd else cargo "+$FREEBSD_RUST_TOOLCHAIN" build --release --target x86_64-unknown-freebsd fi BUILT="$CARGO_TARGET_DIR/x86_64-unknown-freebsd/release/$BINARY_NAME" [[ -x "$BUILT" ]] || fatal "FreeBSD binary not found: $BUILT" install -m 0555 "$BUILT" "$OUTPUT_BINARY" desc=$(file -b "$OUTPUT_BINARY") log "FreeBSD binary: $desc" [[ "$desc" == *FreeBSD* ]] || fatal "cross-built ELF is not identified as FreeBSD" header=$(llvm-readelf -h "$OUTPUT_BINARY") printf '%s\n' "$header" | grep -qi FreeBSD || fatal "cross-built ELF header is not marked for FreeBSD" dynamic=$(llvm-readelf -d "$OUTPUT_BINARY" || true) if printf '%s\n' "$dynamic" | grep -q 'libc\.so\.6'; then fatal "Linux libc detected in FreeBSD target binary" fi