#!/usr/bin/env bash # scripts/build-boringtun.sh — Build the boringtun WireGuard FFI library for Artemis. # # Usage: # bash scripts/build-boringtun.sh # native target # bash scripts/build-boringtun.sh --universal # macOS fat binary (x86_64 + arm64) # # Output: # deps/boringtun/libboringtun.a — static library # deps/boringtun/wireguard_ffi.h — C ABI header (for reference) # # Prerequisites: # • Rust toolchain (https://rustup.rs) # • git set -euo pipefail REPO="https://github.com/cloudflare/boringtun.git" ROOT="$(cd "$(dirname "$0")/.." && pwd)" SRC="$ROOT/build/boringtun-src" OUT="$ROOT/deps/boringtun" UNIVERSAL=false while [[ $# -gt 0 ]]; do case "$1" in --universal) UNIVERSAL=true; shift ;; *) echo "Unknown flag: $1"; exit 1 ;; esac done info() { echo " $*"; } ok() { echo " ✓ $*"; } fail() { echo " ✗ $*" >&2; exit 1; } # ── Prerequisites ───────────────────────────────────────────────────────────── command -v cargo &>/dev/null || fail "cargo not found. Install Rust from https://rustup.rs" command -v git &>/dev/null || fail "git not found" if $UNIVERSAL; then rustup target add x86_64-apple-darwin aarch64-apple-darwin 2>/dev/null || true fi # ── Clone / update ──────────────────────────────────────────────────────────── if [[ ! -d "$SRC" ]]; then info "Cloning boringtun..." git clone --depth 1 "$REPO" "$SRC" else info "Updating boringtun..." git -C "$SRC" pull --ff-only fi ok "Source ready" # ── Build ───────────────────────────────────────────────────────────────────── if $UNIVERSAL && [[ "$(uname)" == "Darwin" ]]; then info "Building for x86_64-apple-darwin..." (cd "$SRC" && cargo build --release --target x86_64-apple-darwin --features ffi-bindings) info "Building for aarch64-apple-darwin..." (cd "$SRC" && cargo build --release --target aarch64-apple-darwin --features ffi-bindings) ok "Both slices built" else info "Building boringtun (release)..." (cd "$SRC" && cargo build --release --features ffi-bindings) ok "Build complete" fi # ── Copy artifacts ──────────────────────────────────────────────────────────── mkdir -p "$OUT" if $UNIVERSAL && [[ "$(uname)" == "Darwin" ]]; then X86="$SRC/target/x86_64-apple-darwin/release/libboringtun.a" ARM="$SRC/target/aarch64-apple-darwin/release/libboringtun.a" [[ -f "$X86" ]] || fail "x86_64 library not found: $X86" [[ -f "$ARM" ]] || fail "arm64 library not found: $ARM" lipo -create "$X86" "$ARM" -output "$OUT/libboringtun.a" ok "Created universal fat binary" else LIB="$SRC/target/release/libboringtun.a" [[ -f "$LIB" ]] || fail "Library not found: $LIB" cp "$LIB" "$OUT/libboringtun.a" ok "Copied libboringtun.a" fi # Copy reference header if present HDR="$SRC/boringtun/src/ffi/wireguard_ffi.h" if [[ -f "$HDR" ]]; then cp "$HDR" "$OUT/wireguard_ffi.h" ok "Copied wireguard_ffi.h" fi echo "" echo " Build successful. Library at:" echo " $OUT/libboringtun.a" echo "" echo " Next: cmake -B build && cmake --build build"