Ctrl K
ComunidadGuías…

scripts/build-host-kernel.sh

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
#!/usr/bin/env bash
# The caller verifies the source archive before starting this native build.
set -euo pipefail

check_only=0
if [ "$#" -eq 2 ] && [ "$1" = --check ]; then
  check_only=1
  architecture=$2
elif [ "$#" -eq 5 ]; then
  architecture=$1
  version=$2
  archive=$3
  work=$4
  output=$5
else
  printf 'Usage: %s --check <architecture> | <architecture> <version> <source.tar.xz> <work-directory> <output>\n' "$0" >&2
  exit 2
fi

[ "$(uname -s)" = Linux ] || { printf 'Kernel builds require a Linux host\n' >&2; exit 1; }
case "$(uname -m):$architecture" in
  x86_64:x86_64) make_arch=x86; target=vmlinux; image=vmlinux ;;
  aarch64:aarch64|arm64:aarch64) make_arch=arm64; target=Image; image=arch/arm64/boot/Image ;;
  *) printf 'Kernel builds require a matching host architecture: %s\n' "$architecture" >&2; exit 1 ;;
esac
for tool in make cc flex bison bc perl tar xz install grep; do
  command -v "$tool" >/dev/null || { printf 'Missing kernel build tool: %s\n' "$tool" >&2; exit 1; }
done
if ! printf '#include <libelf.h>\n#include <gelf.h>\n#include <openssl/opensslv.h>\n' | cc -x c -fsyntax-only - >/dev/null 2>&1; then
  printf 'Missing kernel build headers: install libelf and OpenSSL development packages\n' >&2
  exit 1
fi
jobs=${FIRECRAB_KERNEL_BUILD_JOBS:-2}
[[ "$jobs" =~ ^[1-9][0-9]*$ ]] || { printf 'FIRECRAB_KERNEL_BUILD_JOBS must be a positive integer\n' >&2; exit 1; }
[ "$check_only" -eq 0 ] || exit 0

# Each attempt has a fresh directory; an interrupted build is never reused.
mkdir -p "$work/source" "$work/objects"
work=$(cd -- "$work" && pwd -P)
tar -xJf "$archive" --no-same-owner --no-same-permissions -C "$work/source"
source="$work/source/linux-$version"
objects="$work/objects"
args=(-C "$source" O="$objects" ARCH="$make_arch")
make "${args[@]}" defconfig
"$source/scripts/config" --file "$objects/.config" \
  --enable BLOCK --enable BLK_DEV --enable DEVTMPFS --enable DEVTMPFS_MOUNT \
  --enable EXT4_FS --enable NET --enable INET --enable UNIX --enable PACKET \
  --enable VIRTIO --enable VIRTIO_BLK --enable VIRTIO_NET \
  --enable VIRTIO_MMIO --enable VIRTIO_MMIO_CMDLINE_DEVICES \
  --enable VSOCKETS --enable VIRTIO_VSOCKETS \
  --enable TTY --enable SERIAL_8250 --enable SERIAL_8250_CONSOLE \
  --enable UNIX98_PTYS --enable BINFMT_ELF --enable BINFMT_SCRIPT \
  --enable PROC_FS --enable SYSFS --enable TMPFS \
  --disable MODULES --disable DEBUG_INFO --disable DEBUG_INFO_BTF \
  --enable DEBUG_INFO_NONE --disable LOCALVERSION_AUTO \
  --set-str LOCALVERSION '-firecrab-host1' \
  --set-str SYSTEM_TRUSTED_KEYS '' --set-str SYSTEM_REVOCATION_KEYS ''
if [ "$architecture" = aarch64 ]; then
  "$source/scripts/config" --file "$objects/.config" --enable ARM64_4K_PAGES --disable ARM64_16K_PAGES --disable ARM64_64K_PAGES --enable EFI --enable EFI_STUB
fi
make "${args[@]}" olddefconfig
required=(BLOCK DEVTMPFS DEVTMPFS_MOUNT EXT4_FS NET INET UNIX PACKET VIRTIO_BLK VIRTIO_NET VIRTIO_MMIO VIRTIO_MMIO_CMDLINE_DEVICES VSOCKETS VIRTIO_VSOCKETS SERIAL_8250_CONSOLE UNIX98_PTYS BINFMT_ELF BINFMT_SCRIPT PROC_FS SYSFS TMPFS)
if [ "$architecture" = aarch64 ]; then required+=(ARM64_4K_PAGES EFI_STUB); fi
for option in "${required[@]}"; do
  grep -qx "CONFIG_$option=y" "$objects/.config" || { printf 'Missing built-in kernel option: %s\n' "$option" >&2; exit 1; }
done
make "${args[@]}" -j"$jobs" "$target"
install -m 0644 "$objects/$image" "$output"
install -m 0644 "$objects/.config" "$output.config"