Skip to content

Instantly share code, notes, and snippets.

@willcl-ark
Last active October 7, 2025 13:52
Show Gist options
  • Select an option

  • Save willcl-ark/61bdbf106ba8990e7c4da96c59bec207 to your computer and use it in GitHub Desktop.

Select an option

Save willcl-ark/61bdbf106ba8990e7c4da96c59bec207 to your computer and use it in GitHub Desktop.
#!/usr/bin/env bash
set -e
export HOST=x86_64-unknown-freebsd
export FREEBSD_SYSROOT=/opt/cross-freebsd-14
export FREEBSD_VERSION="14.2"
CLANG_REQUIRED="18"
export CFLAGS="--sysroot=$FREEBSD_SYSROOT"
export CXXFLAGS="--sysroot=$FREEBSD_SYSROOT"
export LDFLAGS="--sysroot=$FREEBSD_SYSROOT"
# Check Clang version - must match FreeBSD sysroot clang version which is clang18 for FreeBSD 14.2
CLANG_VERSION=$(clang --version | head -n1 | sed 's/.*clang version \([0-9]\+\).*/\1/')
if [ "$CLANG_VERSION" != "$CLANG_REQUIRED" ]; then
echo "ERROR: Clang version $CLANG_VERSION detected, but version $CLANG_REQUIRED is required"
echo "The FreeBSD sysroot contains Clang $CLANG_REQUIRED intrinsics headers that must match the compiler version"
exit 1
fi
echo "Using Clang $CLANG_VERSION (compatible with FreeBSD sysroot)"
# Get sysroot
if [ ! -f "$FREEBSD_SYSROOT/base.txz" ]; then
mkdir -p "$FREEBSD_SYSROOT"
cd "$FREEBSD_SYSROOT"
wget "http://ftp.plusline.de/FreeBSD/releases/amd64/$FREEBSD_VERSION-RELEASE/base.txz"
tar -xf base.txz
fi
install_freebsd_packages() {
echo "Installing FreeBSD packages to sysroot..."
local original_dir=$(pwd)
mkdir -p "$FREEBSD_SYSROOT/packages"
cd "$FREEBSD_SYSROOT/packages"
local packages=(
"boost-libs-1.88.0_2"
"libevent-2.1.12"
"sqlite3-3.50.2_1,1"
"pkgconf-2.4.3,1"
"libzmq4-4.3.5_2"
"capnproto-1.2.0"
)
for pkg in "${packages[@]}"; do
if [ ! -f "${pkg}.pkg" ]; then
echo "Downloading ${pkg}..."
wget "https://pkg.freebsd.org/FreeBSD:14:amd64/latest/All/${pkg}.pkg" || {
echo "Warning: Could not download ${pkg}, skipping..."
continue
}
fi
echo "Extracting ${pkg}..."
tar -xf "${pkg}.pkg" -C "$FREEBSD_SYSROOT" 2>/dev/null || {
echo "Warning: Could not extract ${pkg}, skipping..."
}
done
cd "$original_dir"
echo "FreeBSD packages installed to sysroot"
}
install_freebsd_packages
# Set up PKG_CONFIG environment for FreeBSD packages
export PKG_CONFIG_PATH="$FREEBSD_SYSROOT/usr/local/libdata/pkgconfig:$FREEBSD_SYSROOT/usr/libdata/pkgconfig"
export PKG_CONFIG_SYSROOT_DIR="$FREEBSD_SYSROOT"
echo "PKG_CONFIG_PATH: $PKG_CONFIG_PATH"
echo "Available .pc files:"
find "$FREEBSD_SYSROOT" -name "*.pc" | head -10
# Generate build system
cmake -B build \
-DCMAKE_SYSTEM_NAME=FreeBSD \
-DCMAKE_SYSTEM_PROCESSOR=x86_64 \
-DCMAKE_C_COMPILER=$(which clang) \
-DCMAKE_CXX_COMPILER=$(which clang++) \
-DCMAKE_C_COMPILER_TARGET=x86_64-unknown-freebsd \
-DCMAKE_CXX_COMPILER_TARGET=x86_64-unknown-freebsd \
-DCMAKE_SYSROOT="$FREEBSD_SYSROOT" \
-DCMAKE_CXX_FLAGS="-isystem$FREEBSD_SYSROOT/usr/lib/clang/18/include" \
-DCMAKE_PREFIX_PATH="$FREEBSD_SYSROOT/usr/local;$FREEBSD_SYSROOT/usr" \
-DENABLE_WALLET=ON \
-DENABLE_IPC=ON \
-DWITH_ZMQ=ON
# Build bitcoind
cmake --build build --parallel --target bitcoind --target bitcoin-cli
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment