Files
rust-package-builder/scripts/build-opnsense.sh
T
2026-10-22 13:03:12 +02:00

54 lines
2.2 KiB
Bash
Executable File

#!/usr/bin/env bash
set -Eeuo pipefail
BUILDER_ROOT=${BUILDER_ROOT:-/opt/rust-package-builder}
source "$BUILDER_ROOT/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
"$BUILDER_ROOT/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=$("$BUILDER_ROOT/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