# Copyright (c) 2009 The Chromium OS Authors. All rights reserved.
# Distributed under the terms of the GNU General Public License v2

EAPI=4
CROS_WORKON_COMMIT="64c457758e9b2dfa360134d7f2fce4632eede9c2"
CROS_WORKON_PROJECT="chromiumos/third_party/kernel"

inherit toolchain-funcs
inherit binutils-funcs

DESCRIPTION="Chrome OS Kernel"
HOMEPAGE="http://www.chromium.org/"
LICENSE="GPL-2"
SLOT="0"
KEYWORDS="amd64 arm x86"
IUSE_KCONFIG="+kconfig_generic kconfig_atom kconfig_atom64 kconfig_tegra2"
IUSE="-fbconsole -initramfs -nfs -blkdevram ${IUSE_KCONFIG} -device_tree"
IUSE="${IUSE} -pcserial -kernel_sources -systemtap"
REQUIRED_USE="^^ ( ${IUSE_KCONFIG/+} )"
STRIP_MASK="/usr/lib/debug/boot/vmlinux"

DEPEND="sys-apps/debianutils
    chromeos-base/kernel-headers
    initramfs? ( chromeos-base/chromeos-initramfs )
    !sys-kernel/chromeos-kernel-next
"
RDEPEND="!sys-kernel/chromeos-kernel-next"

vmlinux_text_base=${CHROMEOS_U_BOOT_VMLINUX_TEXT_BASE:-0x20008000}

# TODO(vbendeb): we might need to be able to define the device tree source
# name by some other means or to override the default. For now it must match
# the name/board name.
dev_tree_base=${PKG_CONFIG#pkg-config-}

# Use a single or split kernel config as specified in the board or variant
# make.conf overlay. Default to the arch specific split config if an
# overlay or variant does not set either CHROMEOS_KERNEL_CONFIG or
# CHROMEOS_KERNEL_SPLITCONFIG. CHROMEOS_KERNEL_CONFIG is set relative
# to the root of the kernel source tree.

if [ -n "${CHROMEOS_KERNEL_CONFIG}" ]; then
	config="${S}/${CHROMEOS_KERNEL_CONFIG}"
else
	if [ "${ARCH}" = "x86" ]; then
		config=${CHROMEOS_KERNEL_SPLITCONFIG:-"chromeos-intel-menlow"}
	else
		config=${CHROMEOS_KERNEL_SPLITCONFIG:-"chromeos-${ARCH}"}
	fi
fi

# TODO(jglasgow) Need to fix DEPS file to get rid of "files"
CROS_WORKON_LOCALNAME="../third_party/kernel/files"

# This must be inherited *after* EGIT/CROS_WORKON variables defined
inherit cros-workon

# Allow override of kernel arch.
kernel_arch=${CHROMEOS_KERNEL_ARCH:-"$(tc-arch-kernel)"}

cross=${CHOST}-
COMPILER_OPTS=""
# Hack for using 64-bit kernel with 32-bit user-space
if [ "${ARCH}" = "x86" -a "${kernel_arch}" = "x86_64" ]; then
	cross=${CBUILD}-
else
	# TODO(raymes): Force GNU ld over gold. There are still some
	# gold issues to iron out. See: 13209.
	tc-export LD CC CXX
	COMPILER_OPTS="LD=\"$(get_binutils_path_ld)/ld\""
	COMPILER_OPTS+=" CC=\"${CC} -B$(get_binutils_path_ld)\""
	COMPILER_OPTS+=" CXX=\"${CXX} -B$(get_binutils_path_ld)\""
fi

build_dir="${S}/build/$(basename ${ROOT})"
bin_dtb="${build_dir}/device-tree.dtb"
build_cfg="${build_dir}/.config"

src_configure() {
	mkdir -p "${build_dir}"

	elog "Using kernel config: ${config}"

	if [ -n "${CHROMEOS_KERNEL_CONFIG}" ]; then
		cp -f "${config}" "${build_cfg}" || die
	else
		chromeos/scripts/prepareconfig ${config} || die
		mv .config "${build_cfg}"
	fi

	if use blkdevram; then
		elog "   - adding ram block device config"
		cat "${FILESDIR}"/blkdevram.config >> "${build_cfg}"
	fi

	if use fbconsole; then
		elog "   - adding framebuffer console config"
		cat "${FILESDIR}"/fbconsole.config >> "${build_cfg}"
	fi

	if use nfs; then
		elog "   - adding NFS config"
		cat "${FILESDIR}"/nfs.config >> "${build_cfg}"
	fi
	if use systemtap; then
		elog "	- adding configs to support systemtap"
		cat "${FILESDIR}"/systemtap.config >> "${build_cfg}"
	fi

	if use pcserial; then
		elog "   - adding PC serial config"
		cat "${FILESDIR}"/pcserial.config >> "${build_cfg}"
	fi

	# Use default for any options not explitly set in splitconfig
	yes "" | eval emake \
		${COMPILER_OPTS} \
		ARCH=${kernel_arch} \
		O="${build_dir}" \
		oldconfig || die
}

src_compile() {

	if use arm; then
		build_targets='uImage  modules'
	else
		build_targets=  # use make default target
	fi

	if use initramfs; then
		INITRAMFS="CONFIG_INITRAMFS_SOURCE=${ROOT}/usr/bin/initramfs.cpio.gz"
		# We want avoid copying modules into the initramfs so we need to enable
		# the functionality required for the initramfs here.

		# TPM support to ensure proper locking.
		INITRAMFS="$INITRAMFS CONFIG_TCG_TPM=y CONFIG_TCG_TIS=y"

		# VFAT FS support for EFI System Partition updates.
		INITRAMFS="$INITRAMFS CONFIG_NLS_CODEPAGE_437=y"
		INITRAMFS="$INITRAMFS CONFIG_NLS_ISO8859_1=y"
		INITRAMFS="$INITRAMFS CONFIG_FAT_FS=y CONFIG_VFAT_FS=y"
	else
		INITRAMFS=""
	fi
	eval emake ${COMPILER_OPTS} \
		$INITRAMFS \
		ARCH=${kernel_arch} \
		O="${build_dir}" \
		CROSS_COMPILE="${cross}" ${build_targets} || die

	if use device_tree; then
		dtc  -O dtb -p 500 -o "${bin_dtb}" \
		  "arch/arm/boot/dts/${dev_tree_base}.dts" || \
		  die 'Device tree compilation failed'
	fi
}

# Install the kernel sources into usr/src and fix symlinks.
install_kernel_sources() {
	local version="$(ls "${D}"/lib/modules)"
	local dest_modules_dir="lib/modules/${version}"
	local dest_source_dir="usr/src/${P}"
	local dest_build_dir="${dest_source_dir}/build"

	# Fix symlinks in lib/modules
	ln -sfvT "../../../${dest_build_dir}" "${D}/${dest_modules_dir}/build" || die
	ln -sfvT "../../../${dest_source_dir}" "${D}/${dest_modules_dir}/source" || die

	einfo "Installing kernel source tree"
	dodir "${dest_source_dir}" || die
	rsync -a --exclude "build" "${S}/" "${D}/${dest_source_dir}" || die

	einfo "Installing kernel build tree"
	dodir "${dest_build_dir}" || die
	cp -a "${build_dir}"/{.config,.version,Makefile,Module.symvers,include} \
		"${D}/${dest_build_dir}" || die

	# Modify Makefile to use the ROOT environment variable if defined.
	# This path needs to be absolute so that the build directory will
	# still work if copied elsewhere.
	sed -i -e "s@${S}@\$(ROOT)/${dest_source_dir}@" \
		"${D}/${dest_build_dir}/Makefile" || die
}

src_install() {
	dodir boot

	eval emake ${COMPILER_OPTS} \
		ARCH=${kernel_arch}\
		CROSS_COMPILE="${cross}" \
		INSTALL_PATH="${D}/boot" \
		O="${build_dir}" \
		install || die

	eval emake ${COMPILER_OPTS} \
		ARCH=${kernel_arch}\
		CROSS_COMPILE="${cross}" \
		INSTALL_MOD_PATH="${D}" \
		O="${build_dir}" \
		modules_install || die

	eval emake ${COMPILER_OPTS} \
		ARCH=${kernel_arch}\
		CROSS_COMPILE="${cross}" \
		INSTALL_MOD_PATH="${D}" \
		O="${build_dir}" \
		firmware_install || die

	if use arm; then
		local version=$(ls "${D}"/lib/modules)
		local boot_dir="${build_dir}/arch/${ARCH}/boot"
		local kernel_bin="${D}/boot/vmlinuz-${version}"
		local load_addr=0x01000000
		if use device_tree; then
			local its_script="${build_dir}/its_script"
			sed "s|%BUILD_ROOT%|${boot_dir}|;\
			     s|%DEV_TREE%|${bin_dtb}|; \
			     s|%LOAD_ADDR%|${load_addr}|;" \
			  "${FILESDIR}/kernel_fdt.its" > "${its_script}" || die
			mkimage  -f "${its_script}" "${kernel_bin}" || die
		else
			cp -a "${boot_dir}/uImage" "${kernel_bin}" || die
		fi

		# TODO(vbendeb): remove the below .uimg link creation code
		# after the build scripts have been modified to use the base
		# image name.
		cd $(dirname "${kernel_bin}")
		ln -sf $(basename "${kernel_bin}") vmlinux.uimg || die
	fi

	# Install uncompressed kernel for debugging purposes.
	dodir /usr/lib/debug/boot
	insinto /usr/lib/debug/boot
	doins "${build_dir}/vmlinux"

	if use kernel_sources; then
		install_kernel_sources
	fi
}
