From c20f5a2e8c29e6a8fac7445d08709373a90f00f9 Mon Sep 17 00:00:00 2001 From: Adolfo Delorenzo Date: Thu, 14 May 2026 10:56:39 -0600 Subject: [PATCH] fix(build): detect native ARM64 host and skip cross-compiler requirement build-kernel-arm64.sh and build-kernel-rpi.sh both insisted on aarch64-linux-gnu-gcc (the cross-compiler from x86), which fails on a native ARM64 build host like the Odroid runner. Detect uname -m and use the host's gcc with an empty CROSS_COMPILE on aarch64 hosts. Co-Authored-By: Claude Opus 4.7 (1M context) --- build/scripts/build-kernel-arm64.sh | 37 ++++++++++++++++++++--------- build/scripts/build-kernel-rpi.sh | 31 +++++++++++++++++------- 2 files changed, 48 insertions(+), 20 deletions(-) diff --git a/build/scripts/build-kernel-arm64.sh b/build/scripts/build-kernel-arm64.sh index 8e2364c..9393186 100755 --- a/build/scripts/build-kernel-arm64.sh +++ b/build/scripts/build-kernel-arm64.sh @@ -39,11 +39,26 @@ if [ -f "$CUSTOM_IMAGE" ] && [ -d "$CUSTOM_MODULES/lib/modules/$KVER" ]; then exit 0 fi -# --- Verify cross-compiler --- -if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then - echo "ERROR: aarch64-linux-gnu-gcc not found" - echo "Install: apt-get install gcc-aarch64-linux-gnu" - exit 1 +# --- Toolchain selection: native on arm64 hosts, cross-compile elsewhere --- +HOST_ARCH="$(uname -m)" +if [ "$HOST_ARCH" = "aarch64" ] || [ "$HOST_ARCH" = "arm64" ]; then + # Native build — use the host's gcc + if ! command -v gcc >/dev/null 2>&1; then + echo "ERROR: gcc not found" + echo "Install: apt-get install build-essential" + exit 1 + fi + CROSS_COMPILE="" + echo "==> Native ARM64 build (host arch: $HOST_ARCH)" +else + # Cross-build from x86 — use aarch64 cross-compiler + if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then + echo "ERROR: aarch64-linux-gnu-gcc not found" + echo "Install: apt-get install gcc-aarch64-linux-gnu" + exit 1 + fi + CROSS_COMPILE="aarch64-linux-gnu-" + echo "==> Cross-building ARM64 kernel from $HOST_ARCH" fi echo "==> Building generic ARM64 kernel (mainline $KVER)..." @@ -92,7 +107,7 @@ cd "$KERNEL_SRC_DIR" # --- Base config: arm64 defconfig (generic ARMv8) --- echo "==> Applying arm64 defconfig..." -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" defconfig # --- Apply shared container fragment --- CONFIG_FRAGMENT="$PROJECT_ROOT/build/config/kernel-container.fragment" @@ -125,11 +140,11 @@ apply_fragment() { echo "==> Applying kernel-container.fragment (pass 1)..." apply_fragment "$CONFIG_FRAGMENT" -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" olddefconfig echo "==> Applying kernel-container.fragment (pass 2)..." apply_fragment "$CONFIG_FRAGMENT" -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" olddefconfig # --- ARM64 virt-host specific enables --- # These are needed for the generic UEFI/virtio boot path but are arch-specific @@ -146,7 +161,7 @@ echo "==> Enabling ARM64 virt-host configs..." ./scripts/config --enable CONFIG_HW_RANDOM_VIRTIO # NVMe for cloud / bare-metal ARM64 hosts that don't use virtio ./scripts/config --enable CONFIG_BLK_DEV_NVME -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" olddefconfig # --- Verify critical configs --- echo "==> Verifying critical configs..." @@ -165,7 +180,7 @@ echo "" echo "==> Building ARM64 kernel (${NPROC} parallel jobs)..." echo " This may take 20-40 minutes on a 6-core Odroid..." -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j"$NPROC" Image modules 2>&1 +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" -j"$NPROC" Image modules 2>&1 echo "==> Kernel build complete" @@ -176,7 +191,7 @@ cp arch/arm64/boot/Image "$CUSTOM_IMAGE" echo "==> Installing modules (stripped)..." rm -rf "$CUSTOM_MODULES" mkdir -p "$CUSTOM_MODULES" -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" \ INSTALL_MOD_STRIP=1 modules_install INSTALL_MOD_PATH="$CUSTOM_MODULES" # Pick up actual kernel version (e.g. 6.12.10 if KVER differs from package suffix) diff --git a/build/scripts/build-kernel-rpi.sh b/build/scripts/build-kernel-rpi.sh index e144113..8eea209 100755 --- a/build/scripts/build-kernel-rpi.sh +++ b/build/scripts/build-kernel-rpi.sh @@ -35,11 +35,24 @@ if [ -f "$CUSTOM_IMAGE" ] && [ -d "$CUSTOM_MODULES" ]; then exit 0 fi -# --- Verify cross-compiler --- -if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then - echo "ERROR: aarch64-linux-gnu-gcc not found" - echo "Install: apt-get install gcc-aarch64-linux-gnu" - exit 1 +# --- Toolchain selection: native on arm64 hosts, cross-compile elsewhere --- +HOST_ARCH="$(uname -m)" +if [ "$HOST_ARCH" = "aarch64" ] || [ "$HOST_ARCH" = "arm64" ]; then + if ! command -v gcc >/dev/null 2>&1; then + echo "ERROR: gcc not found" + echo "Install: apt-get install build-essential" + exit 1 + fi + CROSS_COMPILE="" + echo "==> Native ARM64 build (host arch: $HOST_ARCH)" +else + if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then + echo "ERROR: aarch64-linux-gnu-gcc not found" + echo "Install: apt-get install gcc-aarch64-linux-gnu" + exit 1 + fi + CROSS_COMPILE="aarch64-linux-gnu-" + echo "==> Cross-building RPi kernel from $HOST_ARCH" fi echo "==> Building RPi kernel (raspberrypi/linux)..." @@ -65,7 +78,7 @@ cd "$KERNEL_BUILD_DIR" # --- Apply base config (Pi 4 = bcm2711) --- echo "==> Applying bcm2711_defconfig..." -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- bcm2711_defconfig +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" bcm2711_defconfig # --- Apply container config overrides --- CONFIG_FRAGMENT="$PROJECT_ROOT/build/config/kernel-container.fragment" @@ -98,7 +111,7 @@ if [ -f "$CONFIG_FRAGMENT" ]; then fi # Resolve dependencies -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" olddefconfig # --- Build kernel + modules + DTBs --- NPROC=$(nproc 2>/dev/null || echo 4) @@ -106,7 +119,7 @@ echo "" echo "==> Building RPi kernel (${NPROC} parallel jobs)..." echo " This may take 20-30 minutes..." -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- -j"$NPROC" Image modules dtbs 2>&1 +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" -j"$NPROC" Image modules dtbs 2>&1 echo "==> RPi kernel build complete" @@ -117,7 +130,7 @@ cp arch/arm64/boot/Image "$CUSTOM_IMAGE" echo "==> Installing modules (stripped)..." rm -rf "$CUSTOM_MODULES" mkdir -p "$CUSTOM_MODULES" -make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- \ +make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" \ INSTALL_MOD_STRIP=1 modules_install INSTALL_MOD_PATH="$CUSTOM_MODULES" # Remove build/source symlinks