From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from lists.gentoo.org (pigeon.gentoo.org [208.92.234.80]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by finch.gentoo.org (Postfix) with ESMTPS id DA547138334 for ; Sun, 5 Jan 2020 06:28:33 +0000 (UTC) Received: from pigeon.gentoo.org (localhost [127.0.0.1]) by pigeon.gentoo.org (Postfix) with SMTP id 65365E0A4F; Sun, 5 Jan 2020 06:28:11 +0000 (UTC) Received: from smtp.gentoo.org (dev.gentoo.org [IPv6:2001:470:ea4a:1:5054:ff:fec7:86e4]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by pigeon.gentoo.org (Postfix) with ESMTPS id BAB3AE096A for ; Sun, 5 Jan 2020 06:28:10 +0000 (UTC) Received: from localhost.localdomain (c142-245.icpnet.pl [85.221.142.245]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) (Authenticated sender: mgorny) by smtp.gentoo.org (Postfix) with ESMTPSA id 59EB534DD3D; Sun, 5 Jan 2020 06:28:09 +0000 (UTC) From: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= To: gentoo-dev@lists.gentoo.org Cc: =?UTF-8?q?Micha=C5=82=20G=C3=B3rny?= Subject: [gentoo-dev] [PATCH v2 2/4] kernel-build.eclass: Build logic for dist-kernels Date: Sun, 5 Jan 2020 07:27:39 +0100 Message-Id: <20200105062741.82357-2-mgorny@gentoo.org> X-Mailer: git-send-email 2.24.1 In-Reply-To: <20200105062741.82357-1-mgorny@gentoo.org> References: <20200105062741.82357-1-mgorny@gentoo.org> Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: List-Id: Gentoo Linux mail X-BeenThere: gentoo-dev@lists.gentoo.org Reply-to: gentoo-dev@lists.gentoo.org X-Auto-Response-Suppress: DR, RN, NRN, OOF, AutoReply MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-Archives-Salt: fa72ab6f-1502-445c-9b0a-e5196d32bd80 X-Archives-Hash: fd74332d760c7abe63ec5fe71a147956 Introduce a new eclass that contains common logic for building distribution kernels from source. Signed-off-by: Michał Górny --- 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 +# @AUTHOR: +# Michał Górny +# @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