Introduce a new eclass that contains common logic for building
distribution kernels from source.

Signed-off-by: Michał Górny <[email protected]>
---
 eclass/kernel-build.eclass | 175 +++++++++++++++++++++++++++++++++++++
 1 file changed, 175 insertions(+)
 create mode 100644 eclass/kernel-build.eclass

Changed in v2: improved cross support, thanks to floppym

diff --git a/eclass/kernel-build.eclass b/eclass/kernel-build.eclass
new file mode 100644
index 000000000000..028f0da8148e
--- /dev/null
+++ b/eclass/kernel-build.eclass
@@ -0,0 +1,175 @@
+# Copyright 2020 Gentoo Authors
+# Distributed under the terms of the GNU General Public License v2
+
+# @ECLASS: kernel-build.eclass
+# @MAINTAINER:
+# Distribution Kernel Project <[email protected]>
+# @AUTHOR:
+# Michał Górny <[email protected]>
+# @SUPPORTED_EAPIS: 7
+# @BLURB: Build mechanics for Distribution Kernels
+# @DESCRIPTION:
+# This eclass provides the logic to build a Distribution Kernel from
+# source and install it.  Post-install and test logic is inherited
+# from kernel-install.eclass.
+#
+# The ebuild must take care of unpacking the kernel sources, copying
+# an appropriate .config into them (e.g. in src_prepare()) and setting
+# correct S.  The eclass takes care of respecting savedconfig, building
+# the kernel and installing it along with its modules and subset
+# of sources needed to build external modules.
+
+if [[ ! ${_KERNEL_BUILD_ECLASS} ]]; then
+
+case "${EAPI:-0}" in
+       0|1|2|3|4|5|6)
+               die "Unsupported EAPI=${EAPI:-0} (too old) for ${ECLASS}"
+               ;;
+       7)
+               ;;
+       *)
+               die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}"
+               ;;
+esac
+
+inherit savedconfig toolchain-funcs kernel-install
+
+BDEPEND="
+       sys-devel/bc
+       virtual/libelf"
+
+# @FUNCTION: kernel-build_src_configure
+# @DESCRIPTION:
+# Prepare the toolchain for building the kernel, get the default .config
+# or restore savedconfig, and get build tree configured for modprep.
+kernel-build_src_configure() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       # force ld.bfd if we can find it easily
+       local LD="$(tc-getLD)"
+       if type -P "${LD}.bfd" &>/dev/null; then
+               LD+=.bfd
+       fi
+
+       tc-export_build_env
+       MAKEARGS=(
+               V=1
+
+               HOSTCC="$(tc-getBUILD_CC)"
+               HOSTCXX="$(tc-getBUILD_CXX)"
+               HOSTCFLAGS="${BUILD_CFLAGS}"
+               HOSTLDFLAGS="${BUILD_LDFLAGS}"
+
+               CROSS_COMPILE=${CHOST}-
+               AS="$(tc-getAS)"
+               CC="$(tc-getCC)"
+               LD="${LD}"
+               AR="$(tc-getAR)"
+               NM="$(tc-getNM)"
+               STRIP=":"
+               OBJCOPY="$(tc-getOBJCOPY)"
+               OBJDUMP="$(tc-getOBJDUMP)"
+
+               # we need to pass it to override colliding Gentoo envvar
+               ARCH=$(tc-arch-kernel)
+       )
+
+       [[ -f .config ]] || die "Ebuild error: please copy default config into 
.config"
+       restore_config .config
+
+       mkdir -p "${WORKDIR}"/modprep || die
+       mv .config "${WORKDIR}"/modprep/ || die
+       emake O="${WORKDIR}"/modprep "${MAKEARGS[@]}" olddefconfig
+       emake O="${WORKDIR}"/modprep "${MAKEARGS[@]}" modules_prepare
+       cp -pR "${WORKDIR}"/modprep "${WORKDIR}"/build || die
+}
+
+# @FUNCTION: kernel-build_src_compile
+# @DESCRIPTION:
+# Compile the kernel sources.
+kernel-build_src_compile() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       emake O="${WORKDIR}"/build "${MAKEARGS[@]}" all
+}
+
+# @FUNCTION: kernel-build_src_test
+# @DESCRIPTION:
+# Test the built kernel via qemu.  This just wraps the logic
+# from kernel-install.eclass with the correct paths.
+kernel-build_src_test() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       emake O="${WORKDIR}"/build "${MAKEARGS[@]}" \
+               INSTALL_MOD_PATH="${T}" modules_install
+
+       kernel-install_test "${PV}" \
+               "${WORKDIR}/build/$(kernel-install_get_image_path)" \
+               "${T}/lib/modules/${PV}"
+}
+
+# @FUNCTION: kernel-build_src_install
+# @DESCRIPTION:
+# Install the built kernel along with subset of sources
+# into /usr/src/linux-${PV}.  Install the modules.  Save the config.
+kernel-build_src_install() {
+       debug-print-function ${FUNCNAME} "${@}"
+
+       # do not use 'make install' as it behaves differently based
+       # on what kind of installkernel is installed
+       emake O="${WORKDIR}"/build "${MAKEARGS[@]}" \
+               INSTALL_MOD_PATH="${ED}" modules_install
+
+       # note: we're using mv rather than doins to save space and time
+       # install main and arch-specific headers first, and scripts
+       local kern_arch=$(tc-arch-kernel)
+       dodir "/usr/src/linux-${PV}/arch/${kern_arch}"
+       mv include scripts "${ED}/usr/src/linux-${PV}/" || die
+       mv "arch/${kern_arch}/include" \
+               "${ED}/usr/src/linux-${PV}/arch/${kern_arch}/" || die
+
+       # remove everything but Makefile* and Kconfig*
+       find -type f '!' '(' -name 'Makefile*' -o -name 'Kconfig*' ')' \
+               -delete || die
+       find -type l -delete || die
+       cp -p -R * "${ED}/usr/src/linux-${PV}/" || die
+
+       cd "${WORKDIR}" || die
+       # strip out-of-source build stuffs from modprep
+       # and then copy built files as well
+       find modprep -type f '(' \
+                       -name Makefile -o \
+                       -name '*.[ao]' -o \
+                       '(' -name '.*' -a -not -name '.config' ')' \
+               ')' -delete || die
+       rm modprep/source || die
+       cp -p -R modprep/. "${ED}/usr/src/linux-${PV}"/ || die
+
+       # install the kernel and files needed for module builds
+       insinto "/usr/src/linux-${PV}"
+       doins build/{System.map,Module.symvers}
+       local image_path=$(kernel-install_get_image_path)
+       cp -p "build/${image_path}" "${ED}/usr/src/linux-${PV}/${image_path}" 
|| die
+
+       # strip empty directories
+       find "${D}" -type d -empty -exec rmdir {} + || die
+
+       # fix source tree and build dir symlinks
+       dosym ../../../usr/src/linux-${PV} /lib/modules/${PV}/build
+       dosym ../../../usr/src/linux-${PV} /lib/modules/${PV}/source
+
+       save_config build/.config
+}
+
+# @FUNCTION: kernel-build_pkg_postinst
+# @DESCRIPTION:
+# Combine postinst from kernel-install and savedconfig eclasses.
+kernel-build_pkg_postinst() {
+       kernel-install_pkg_postinst
+       savedconfig_pkg_postinst
+}
+
+_KERNEL_BUILD_ECLASS=1
+fi
+
+EXPORT_FUNCTIONS src_configure src_compile src_test src_install pkg_postinst
-- 
2.24.1


Reply via email to