# 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