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) <noreply@anthropic.com>
This commit is contained in:
@@ -39,12 +39,27 @@ if [ -f "$CUSTOM_IMAGE" ] && [ -d "$CUSTOM_MODULES/lib/modules/$KVER" ]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# --- Verify cross-compiler ---
|
# --- 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
|
if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then
|
||||||
echo "ERROR: aarch64-linux-gnu-gcc not found"
|
echo "ERROR: aarch64-linux-gnu-gcc not found"
|
||||||
echo "Install: apt-get install gcc-aarch64-linux-gnu"
|
echo "Install: apt-get install gcc-aarch64-linux-gnu"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
CROSS_COMPILE="aarch64-linux-gnu-"
|
||||||
|
echo "==> Cross-building ARM64 kernel from $HOST_ARCH"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "==> Building generic ARM64 kernel (mainline $KVER)..."
|
echo "==> Building generic ARM64 kernel (mainline $KVER)..."
|
||||||
echo " Source: $MAINLINE_KERNEL_URL"
|
echo " Source: $MAINLINE_KERNEL_URL"
|
||||||
@@ -92,7 +107,7 @@ cd "$KERNEL_SRC_DIR"
|
|||||||
|
|
||||||
# --- Base config: arm64 defconfig (generic ARMv8) ---
|
# --- Base config: arm64 defconfig (generic ARMv8) ---
|
||||||
echo "==> Applying arm64 defconfig..."
|
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 ---
|
# --- Apply shared container fragment ---
|
||||||
CONFIG_FRAGMENT="$PROJECT_ROOT/build/config/kernel-container.fragment"
|
CONFIG_FRAGMENT="$PROJECT_ROOT/build/config/kernel-container.fragment"
|
||||||
@@ -125,11 +140,11 @@ apply_fragment() {
|
|||||||
|
|
||||||
echo "==> Applying kernel-container.fragment (pass 1)..."
|
echo "==> Applying kernel-container.fragment (pass 1)..."
|
||||||
apply_fragment "$CONFIG_FRAGMENT"
|
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)..."
|
echo "==> Applying kernel-container.fragment (pass 2)..."
|
||||||
apply_fragment "$CONFIG_FRAGMENT"
|
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 ---
|
# --- ARM64 virt-host specific enables ---
|
||||||
# These are needed for the generic UEFI/virtio boot path but are arch-specific
|
# 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
|
./scripts/config --enable CONFIG_HW_RANDOM_VIRTIO
|
||||||
# NVMe for cloud / bare-metal ARM64 hosts that don't use virtio
|
# NVMe for cloud / bare-metal ARM64 hosts that don't use virtio
|
||||||
./scripts/config --enable CONFIG_BLK_DEV_NVME
|
./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 ---
|
# --- Verify critical configs ---
|
||||||
echo "==> Verifying critical configs..."
|
echo "==> Verifying critical configs..."
|
||||||
@@ -165,7 +180,7 @@ echo ""
|
|||||||
echo "==> Building ARM64 kernel (${NPROC} parallel jobs)..."
|
echo "==> Building ARM64 kernel (${NPROC} parallel jobs)..."
|
||||||
echo " This may take 20-40 minutes on a 6-core Odroid..."
|
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"
|
echo "==> Kernel build complete"
|
||||||
|
|
||||||
@@ -176,7 +191,7 @@ cp arch/arm64/boot/Image "$CUSTOM_IMAGE"
|
|||||||
echo "==> Installing modules (stripped)..."
|
echo "==> Installing modules (stripped)..."
|
||||||
rm -rf "$CUSTOM_MODULES"
|
rm -rf "$CUSTOM_MODULES"
|
||||||
mkdir -p "$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"
|
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)
|
# Pick up actual kernel version (e.g. 6.12.10 if KVER differs from package suffix)
|
||||||
|
|||||||
@@ -35,12 +35,25 @@ if [ -f "$CUSTOM_IMAGE" ] && [ -d "$CUSTOM_MODULES" ]; then
|
|||||||
exit 0
|
exit 0
|
||||||
fi
|
fi
|
||||||
|
|
||||||
# --- Verify cross-compiler ---
|
# --- 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
|
if ! command -v aarch64-linux-gnu-gcc >/dev/null 2>&1; then
|
||||||
echo "ERROR: aarch64-linux-gnu-gcc not found"
|
echo "ERROR: aarch64-linux-gnu-gcc not found"
|
||||||
echo "Install: apt-get install gcc-aarch64-linux-gnu"
|
echo "Install: apt-get install gcc-aarch64-linux-gnu"
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
CROSS_COMPILE="aarch64-linux-gnu-"
|
||||||
|
echo "==> Cross-building RPi kernel from $HOST_ARCH"
|
||||||
|
fi
|
||||||
|
|
||||||
echo "==> Building RPi kernel (raspberrypi/linux)..."
|
echo "==> Building RPi kernel (raspberrypi/linux)..."
|
||||||
echo " Branch: $RPI_KERNEL_BRANCH"
|
echo " Branch: $RPI_KERNEL_BRANCH"
|
||||||
@@ -65,7 +78,7 @@ cd "$KERNEL_BUILD_DIR"
|
|||||||
|
|
||||||
# --- Apply base config (Pi 4 = bcm2711) ---
|
# --- Apply base config (Pi 4 = bcm2711) ---
|
||||||
echo "==> Applying bcm2711_defconfig..."
|
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 ---
|
# --- Apply container config overrides ---
|
||||||
CONFIG_FRAGMENT="$PROJECT_ROOT/build/config/kernel-container.fragment"
|
CONFIG_FRAGMENT="$PROJECT_ROOT/build/config/kernel-container.fragment"
|
||||||
@@ -98,7 +111,7 @@ if [ -f "$CONFIG_FRAGMENT" ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
# Resolve dependencies
|
# Resolve dependencies
|
||||||
make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- olddefconfig
|
make ARCH=arm64 CROSS_COMPILE="$CROSS_COMPILE" olddefconfig
|
||||||
|
|
||||||
# --- Build kernel + modules + DTBs ---
|
# --- Build kernel + modules + DTBs ---
|
||||||
NPROC=$(nproc 2>/dev/null || echo 4)
|
NPROC=$(nproc 2>/dev/null || echo 4)
|
||||||
@@ -106,7 +119,7 @@ echo ""
|
|||||||
echo "==> Building RPi kernel (${NPROC} parallel jobs)..."
|
echo "==> Building RPi kernel (${NPROC} parallel jobs)..."
|
||||||
echo " This may take 20-30 minutes..."
|
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"
|
echo "==> RPi kernel build complete"
|
||||||
|
|
||||||
@@ -117,7 +130,7 @@ cp arch/arm64/boot/Image "$CUSTOM_IMAGE"
|
|||||||
echo "==> Installing modules (stripped)..."
|
echo "==> Installing modules (stripped)..."
|
||||||
rm -rf "$CUSTOM_MODULES"
|
rm -rf "$CUSTOM_MODULES"
|
||||||
mkdir -p "$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"
|
INSTALL_MOD_STRIP=1 modules_install INSTALL_MOD_PATH="$CUSTOM_MODULES"
|
||||||
|
|
||||||
# Remove build/source symlinks
|
# Remove build/source symlinks
|
||||||
|
|||||||
Reference in New Issue
Block a user