#!/usr/bin/env bash set -euo pipefail # 🔧 CONFIGURATION FREEBSD_BRANCH="stable/14" KERNCONF="STORAGE_ZFS" MAKEJOBS=$(nproc) BUILDROOT="$HOME/freebsd-kernel-build" OBJDIR="/tmp/obj" TOOLCHAIN_BIN="/tmp/amd64.amd64/usr/bin" # 🌱 Step 1: Prep Environment mkdir -p "$BUILDROOT" cd "$BUILDROOT" # 🔻 Step 2: Get FreeBSD source if [ ! -d "src" ]; then git clone https://git.freebsd.org/src.git cd src git checkout "$FREEBSD_BRANCH" else cd src git fetch git checkout "$FREEBSD_BRANCH" git pull fi # 🛠️ Step 3: Build FreeBSD toolchain (only once) if [ ! -d "$TOOLCHAIN_BIN" ]; then echo "[*] Bootstrapping FreeBSD native-xtools..." bmake XDEV=amd64 XDEV_ARCH=amd64 native-xtools else echo "[*] Toolchain already built. Skipping..." fi # 🔁 Step 4: Prepare kernel config cd "$BUILDROOT/src/sys/amd64/conf" if [ ! -f "$KERNCONF" ]; then cp GENERIC "$KERNCONF" echo "[*] Created new kernel config from GENERIC: $KERNCONF" fi # 🧠 Step 5: Build the kernel export PATH="$TOOLCHAIN_BIN:$PATH" export MAKEOBJDIRPREFIX="$OBJDIR" cd "$BUILDROOT/src" bmake -j"$MAKEJOBS" buildkernel TARGET=amd64 TARGET_ARCH=amd64 KERNCONF="$KERNCONF" # 📦 Step 6: Package the kernel KERNEL_OUT="$OBJDIR/$BUILDROOT/src/amd64.amd64/sys/$KERNCONF" PACKAGE_NAME="freebsd-kernel-$(date +%Y%m%d-%H%M%S).tar.gz" tar czf "$BUILDROOT/$PACKAGE_NAME" -C "$KERNEL_OUT" kernel # 📣 Done echo "✅ Kernel build and package complete." echo "➡️ Output: $BUILDROOT/$PACKAGE_NAME"