diff options
author | Bertrand Jacquin <beber@meleeweb.net> | 2014-02-27 00:03:15 +0100 |
---|---|---|
committer | Bertrand Jacquin <beber@meleeweb.net> | 2014-02-27 00:35:37 +0100 |
commit | d84c75b7eaa85727fc182e3ea0d988fb198167ba (patch) | |
tree | cd256f9b1537e758a33e518e748e0ecaae7fe700 /eclass/linux-build.eclass | |
parent | sys-kernel/stable-sources: Version bump (diff) | |
download | portage-d84c75b7eaa85727fc182e3ea0d988fb198167ba.tar.xz |
sys-kernel: Eclassify
Package-Manager: portage-2.2.8-r1
Diffstat (limited to 'eclass/linux-build.eclass')
-rw-r--r-- | eclass/linux-build.eclass | 230 |
1 files changed, 230 insertions, 0 deletions
diff --git a/eclass/linux-build.eclass b/eclass/linux-build.eclass new file mode 100644 index 00000000..fcb9b889 --- /dev/null +++ b/eclass/linux-build.eclass @@ -0,0 +1,230 @@ +# Copyright 1999-2014 Gentoo Foundation +# Distributed under the terms of the GNU General Public License v2 +# $Header: $ + +# @ECLASS: linux-build.eclass +# @MAINTAINER: +# Bertrand Jacquin <beber@meleeweb.net> +# @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_<key> +# 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[@]}" +} |