# Copyright 1999-2014 Gentoo Foundation # Distributed under the terms of the GNU General Public License v2 # $Header: $ # @ECLASS: linux-build.eclass # @MAINTAINER: # Bertrand Jacquin # @BLURB: Eclass for building kernel # @DESCRIPTION: # Build kernel properly case "${EAPI:-0}" in 5) ;; *) die "Unsupported EAPI=${EAPI} (unknown) for ${ECLASS}" ;; esac ETYPE="sources" inherit savedconfig kernel-2 detect_version EXPORT_FUNCTIONS src_prepare src_compile src_install pkg_postinst SLOT="${PV%.*}" DESCRIPTION="Kernel stable sources and build" HOMEPAGE="http://www.kernel.org" SRC_URI="${KERNEL_URI} ${GENPATCHES_URI} ${ARCH_URI}" SRCDIR="${WORKDIR}/linux-${KV_FULL}" BUILDDIR="${WORKDIR}/build" KV_EXTRA="${EXTRAVERSION}" S="${SRCDIR}" IUSE="build source zlib lzma" REQUIRED_USE=" ?? ( zlib lzma ) zlib? ( build ) lzma? ( build ) symlink? ( source ) " DEPEND=" sys-devel/bc sys-apps/diffutils || ( sys-apps/kmod[zlib?,lzma?] sys-apps/module-init-tools )" RDEPEND="" # @FUNCTION: _linux-build_configval # @INTERNAL # @DESCRIPTION: # Request a CONFIG value from .config file # Return true if set, and define CONFIG_ # Return false if not set _linux-build_configval() { local _v="CONFIG_$1" # Export only the needed config value # when not already define declare -p "${_v}" > /dev/null 2>&1 \ || . <(sed -n "/^${_v}=/ p" "${BUILDDIR}/.config") case "${!_v}" in "") declare "$_v=n" ; export "${_v}" ; return 1 ;; *) export "${_v}" ; return 0 ;; esac } _linux-build_src_prepare_build() { mkdir "${BUILDDIR}" restore_config "${BUILDDIR}/.config" if [[ ! -e "${BUILDDIR}/.config" ]] ; then ewarn "Generate .config using 'defconfig'" emake defconfig "${myopt[@]}" fi mkdir "${WORKDIR}/boot" if _linux-build_configval CMDLINE_BOOL && _linux-build_configval CMDLINE ; then einfo "Creating kernel.arg" einfo " CONFIG_CMDLINE='${CONFIG_CMDLINE}'" echo "${CONFIG_CMDLINE}" > "${WORKDIR}/boot/kernel.arg" fi _linux-build_configval MODULES || ewarn "CONFIG_MODULES is not set" _linux-build_configval UEVENT_HELPER_PATH \ && ewarn "CONFIG_UEVENT_HELPER_PATH should be empty" _linux-build_configval FHANDLE || ewarn "CONFIG_FHANDLE is needed for >=sys-fs/udev-210" _linux-build_configval NET || ewarn "CONFIG_NET is needed for >=sys-fs/udev-210" } linux-build_src_prepare() { bopt=( -C "${BUILDDIR}" -f "${SRCDIR}/Makefile" KBUILD_SRC="${SRCDIR}" KCONFIG_CONFIG="${BUILDDIR}/.config" KBUILD_BUILD_USER="${KBUILD_BUILD_USER:-$PORTAGE_USERNAME}" ) copt=( CC="$(tc-getCC)" HOSTCC="${CBUILD}-gcc" CROSS_COMPILE="${CHOST}-" ARCH="$(tc-arch-kernel)" SUBARCH="$(tc-arch-kernel)" ) vopt=( EXTRAVERSION="${KV_EXTRA}" LOCALVERSION= CONFIG_LOCALVERSION= V=1 ) myopt=( "${bopt[@]}" "${copt[@]}" "${vopt[@]}" ) use build && _linux-build_src_prepare_build } _linux-build_src_compile_build() { einfo "Checking configuration file" emake oldconfig "${myopt[@]}" < /dev/null if diff -Nu0 "${BUILDDIR}/.config.old" "${BUILDDIR}/.config" \ | egrep -q '^(\-|\+)CONFIG_' ; then eerror "You configuration is not up to date" diff -Nu "${BUILDDIR}/.config.old" "${BUILDDIR}/.config" die "Bad configuration" fi einfo "Building kernel" emake bzImage "${myopt[@]}" if _linux-build_configval MODULES ; then einfo "Building modules" emake modules "${myopt[@]}" fi } linux-build_src_compile() { use build && _linux-build_src_compile_build } _linux-build_src_install_sources() { kernel-2_src_install } _linux-build_src_install_build() { einfo "Installing kernel" emake install "${myopt[@]}" \ INSTALL_PATH="${WORKDIR}/boot" insinto "/boot/${KV_FULL}" newins "${WORKDIR}/boot/config-${KV_FULL}" kernel.cfg newins "${WORKDIR}/boot/vmlinuz-${KV_FULL}" kernel.img newins "${WORKDIR}/boot/System.map-${KV_FULL}" System.map if _linux-build_configval CMDLINE_BOOL && _linux-build_configval CMDLINE ; then doins "${WORKDIR}/boot/kernel.arg" fi if _linux-build_configval MODULES ; then einfo "Installing modules" emake modules_install "${myopt[@]}" \ INSTALL_MOD_PATH="${WORKDIR}" \ INSTALL_MOD_STRIP="${PORTAGE_STRIP_FLAGS}" # kmod only support zlib and lzma # See libkmod/libkmod-util.c / struct kmod_ext kmod_exts if use zlib || use lzma ; then local cmp ext use zlib && { cmp="gzip -9c" ext="gz" ; } use lzma && { cmp="xz -9c" ext="xz" ; } einfo "Compressing modules" find "${WORKDIR}/lib/modules" \ -type f -name "*.ko" \ | while read ; do ${cmp} < "${REPLY}" > "${REPLY}.${ext}" \ || die "${cmp} ${REPLY} failed" rm "${REPLY}" done fi einfo "Generating modules.dep" depmod -ae -F "${BUILDDIR}/System.map" -b "${WORKDIR}" "${KV_FULL}" \ || die "depmod failed" rm "${WORKDIR}/lib/modules/${KV_FULL}/build" rm "${WORKDIR}/lib/modules/${KV_FULL}/source" insinto /lib doins -r "${WORKDIR}/lib/modules" # No need to make firmware_install, make modules_install does if [[ -e "${WORKDIR}/lib/firmware" ]] ; then einfo "Installing firmwares" insinto /lib doins -r "${WORKDIR}/lib/firmware" fi fi use savedconfig && save_config "${BUILDDIR}/.config" } linux-build_src_install() { use build && _linux-build_src_install_build use source && _linux-build_src_install_sources } linux-build_pkg_postinst() { kernel-2_pkg_postinst # Bypass kernel-2_pkg_postinst madness if ! use symlink && [[ -L "${EROOT}usr/src/linux" ]] ; then rm "${EROOT}usr/src/linux" fi einfo "You may need to:" einfo " make menuconfig ${copt[@]}" }