summaryrefslogblamecommitdiff
path: root/eclass/linux-build.eclass
blob: fcb9b8893114ffe752015b60fae42d646d760f42 (plain) (tree)





































































































































































































































                                                                                                
# 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[@]}"
}