summaryrefslogtreecommitdiff
path: root/eclass
diff options
context:
space:
mode:
Diffstat (limited to 'eclass')
-rw-r--r--eclass/linux-build.eclass230
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[@]}"
+}