54 lines
2.2 KiB
Bash
Executable File
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
|