kernel.inc (5347B)
1 #!/bin/sh 2 # mk/kernel.inc - shared kbuild recipe for the linux-{longterm,stable, 3 # mainline} templates. Sourced at template top level via 4 # . "${UNOS_MKDIR}/kernel.inc" (UNOS_MKDIR is exported by the driver before the 5 # template is sourced). 6 # 7 # The template sets variables, then the standard phases call in: 8 # version=... (checksum, distfiles as usual) 9 # KDELTA_ENABLE="IKCONFIG IKCONFIG_PROC" (forced =y, no CONFIG_ prefix) 10 # KDELTA_MODULE="NET_VRF" (forced =m) 11 # KDELTA_DISABLE="MODULE_SIG" (forced n) 12 # KASSERT_Y="IPV6 ..." KASSERT_M="NET_VRF" KASSERT_N="MODULE_SIG" 13 # do_configure() { kernel_configure; } 14 # do_build() { kernel_build; } 15 # do_install() { kernel_install; } 16 # sub_linux() { spick boot "lib/modules"; } # linux 17 # sub_linux_headers() { spick usr/include; } # linux-headers 18 # empty sub functions (`:`) for the two metas. 19 # 20 # Conventions (locked here, not per template): 21 # - defconfig + explicit deltas + olddefconfig. Deltas and asserts are 22 # fail-loud: a renamed/vanished symbol breaks the build, never the boot. 23 # - modules_install with INSTALL_MOD_STRIP=1; build/source symlinks removed 24 # (absolute links into the build tree must never ship). Module dependency 25 # maps are generated at build time with host kmod depmod -b (explicit 26 # version: uname lies in containers) and asserted present. 27 # - headers = sanitized `headers_install` (user API). A module-build tree 28 # (full source for out-of-tree .ko like openbcm) is a separate follow-up, 29 # not silently half-shipped here. 30 # - KREL (e.g. 6.18.51, 7.3.0-rc3) is derived via `make kernelrelease`, 31 # never assumed from ${version}: pre-release trees differ (7.3_rc3 apk 32 # version vs 7.3.0-rc3 uname). All install paths use KREL. 33 # - Reproducibility: KBUILD_BUILD_USER/HOST/TIMESTAMP (from 34 # SOURCE_DATE_EPOCH, driver-exported). 35 36 kernel_configure() { 37 cd "${WRKSRC}" 38 [ -f scripts/config ] || die "kernel: scripts/config missing" 39 # ARCH defaults to x86_64 for the primary target; aarch64 when cross-building 40 # (the conductor dispatches per-arch, builder calls ARCH=aarch64 make). 41 : "${ARCH:=x86_64}" 42 case "${ARCH}" in arm64) ARCH=aarch64 ;; esac 43 msg "kernel: defconfig (ARCH=${ARCH})" 44 make ARCH="${ARCH}" defconfig >/dev/null || die "kernel: defconfig failed" 45 for s in ${KDELTA_ENABLE:-}; do 46 ./scripts/config --enable "CONFIG_${s}" || die "kernel: cannot enable CONFIG_${s}" 47 done 48 for s in ${KDELTA_MODULE:-}; do 49 ./scripts/config --module "CONFIG_${s}" || die "kernel: cannot modularize CONFIG_${s}" 50 done 51 for s in ${KDELTA_DISABLE:-}; do 52 ./scripts/config --disable "CONFIG_${s}" || die "kernel: cannot disable CONFIG_${s}" 53 done 54 if [ -n "${KDELTA_ENABLE:-}${KDELTA_MODULE:-}${KDELTA_DISABLE:-}" ]; then 55 make ARCH="${ARCH}" olddefconfig >/dev/null || die "kernel: olddefconfig failed" 56 fi 57 for s in ${KASSERT_Y:-}; do 58 grep -qx "CONFIG_${s}=y" .config || die "kernel: CONFIG_${s} is not =y" 59 done 60 for s in ${KASSERT_M:-}; do 61 grep -qx "CONFIG_${s}=m" .config || die "kernel: CONFIG_${s} is not =m" 62 done 63 for s in ${KASSERT_N:-}; do 64 grep -qx "# CONFIG_${s} is not set" .config || die "kernel: CONFIG_${s} is set" 65 done 66 KREL=$(make -s ARCH="${ARCH}" kernelrelease) || die "kernel: kernelrelease failed" 67 [ -n "${KREL}" ] || die "kernel: empty KREL" 68 export KREL 69 msg "kernel: release ${KREL}" 70 } 71 72 kernel_build() { 73 cd "${WRKSRC}" 74 : "${ARCH:=x86_64}" 75 case "${ARCH}" in arm64) ARCH=aarch64 ;; esac 76 make ARCH="${ARCH}" -j"$(nproc)" \ 77 KBUILD_BUILD_USER=unos \ 78 KBUILD_BUILD_HOST=unos \ 79 KBUILD_BUILD_TIMESTAMP="$(date -u -d "@${SOURCE_DATE_EPOCH}" '+%Y-%m-%d %H:%M:%S')" \ 80 bzImage modules || die "kernel: build failed" 81 # bzImage path varies by arch 82 case "${ARCH}" in 83 x86_64) [ -f arch/x86/boot/bzImage ] || die "kernel: bzImage missing" ;; 84 aarch64) [ -f arch/arm64/boot/Image ] || die "kernel: Image missing (aarch64)" ;; 85 esac 86 } 87 88 kernel_install() { 89 cd "${WRKSRC}" 90 : "${ARCH:=x86_64}" 91 case "${ARCH}" in arm64) ARCH=aarch64 ;; esac 92 case "${ARCH}" in 93 x86_64) install -D -m 644 arch/x86/boot/bzImage "${DESTDIR}/boot/vmlinuz-${KREL}" ;; 94 aarch64) install -D -m 644 arch/arm64/boot/Image "${DESTDIR}/boot/vmlinuz-${KREL}" ;; 95 esac 96 ln -sf "vmlinuz-${KREL}" "${DESTDIR}/boot/vmlinuz" 97 install -D -m 644 System.map "${DESTDIR}/boot/System.map-${KREL}" 98 install -D -m 644 .config "${DESTDIR}/boot/config-${KREL}" 99 make ARCH="${ARCH}" INSTALL_MOD_PATH="${DESTDIR}" INSTALL_MOD_STRIP=1 \ 100 modules_install >/dev/null || die "kernel: modules_install failed" 101 # absolute build-tree symlinks must never ship 102 rm -f "${DESTDIR}/lib/modules/${KREL}/build" "${DESTDIR}/lib/modules/${KREL}/source" 103 make ARCH="${ARCH}" INSTALL_HDR_PATH="${DESTDIR}/usr" \ 104 headers_install >/dev/null || die "kernel: headers_install failed" 105 # dependency maps at build time (explicit version: uname lies in userns) 106 command -v depmod >/dev/null 2>&1 || die "kernel: host depmod missing" 107 depmod -b "${DESTDIR}" "${KREL}" || die "kernel: depmod failed" 108 [ -d "${DESTDIR}/lib/modules/${KREL}" ] || die "kernel: no modules dir" 109 [ -f "${DESTDIR}/lib/modules/${KREL}/modules.dep" ] || die "kernel: no modules.dep" 110 [ -f "${DESTDIR}/usr/include/linux/version.h" ] || die "kernel: no headers" 111 }