#! /bin/bash

# Platform identification
CCNAME="$1"
CCDIR="$2"
PREFIX="$3"
STAGE="$4"

. 'scripts/common'

# Platform-specific adjustments
kernelArch="${arch}"
case "${kernelArch}" in
	aarch64)
		kernelArch='arm64'
		;;
esac

# URLs and versions
if [ -z "${LINUX_VERS}" ]; then
	LINUX_VERS='3.2.98'
	LINUX_TARBALL_SHA256="f31dc3ad9473086b413f8cd3daef1a8003481eb25910a617c74cbc640635eb31"
fi
if [ -z "${LINUX_URL}" ]; then
	LINUX_VERS_SHORT="$(echo "${LINUX_VERS}" | cut -f 1-2 -d '.')"
	LINUX_VERS_MAJX="$(echo "${LINUX_VERS}" | cut -f 1 -d '.').x"
	case "${LINUX_VERS}" in
		[12].*)
			LINUX_URL="http://www.kernel.org/pub/linux/kernel/v${LINUX_VERS_SHORT}/linux-${LINUX_VERS}.tar.bz2"
			;;
		*)
			LINUX_URL="http://www.kernel.org/pub/linux/kernel/v${LINUX_VERS_MAJX}/linux-${LINUX_VERS}.tar.xz"
			;;
	esac
fi
case "${LINUX_URL}" in
	*.gz)
		LINUX_TARBALL_COMPRESSION='gz'
		LINUX_TARBALL_COMPRESSION_TOOL='gzip'
		;;
	*.bz2)
		LINUX_TARBALL_COMPRESSION='bz2'
		LINUX_TARBALL_COMPRESSION_TOOL='bzip2'
		;;
	*.xz)
		LINUX_TARBALL_COMPRESSION='xz'
		LINUX_TARBALL_COMPRESSION_TOOL='xz'
		;;
esac
LINUX_TARBALL="src/linux-${LINUX_VERS}.tar.${LINUX_TARBALL_COMPRESSION}"
LINUX_DIR="linux-${LINUX_VERS}"

# Clean
if [ "$1" = "distclean" ]; then
	rm -f "${LINUX_TARBALL}"

	set -- clean
fi

if [ "$1" = "clean" ]; then
	rm -rf "${LINUX_DIR}"

	exit 0
fi

# Only build Linux headers for Linux platforms
if ! echo "${CCNAME}" | grep -- '-linux' >/dev/null; then
	exit 0
fi

# Kernel headers are only needed for Stage 1
if [ "${STAGE}" != "stage1" ]; then
	exit 0
fi

if [ -d "${PREFIX}/include/linux" ]; then
	exit 0
fi

# Inform the user of what we are doing
echo " * Building Linux kernel headers for ${arch}"

# Download source
if [ ! -d "${LINUX_DIR}" ]; then
	download "${LINUX_URL}" "${LINUX_TARBALL}" "${LINUX_TARBALL_SHA256}" || exit 1

	"${LINUX_TARBALL_COMPRESSION_TOOL}" -dc "${LINUX_TARBALL}" | tar -xf -
fi

cp -rp "${LINUX_DIR}" "${LINUX_DIR}-${CCNAME}"

(
	cd "${LINUX_DIR}-${CCNAME}" || exit 1

	${MAKE} ${BUILD_CC_MAKE_FLAGS_SINGLE} CROSS_COMPILE="${CCNAME}-" ARCH="${kernelArch}" defconfig || exit 1

	${MAKE} ${BUILD_CC_MAKE_FLAGS_SINGLE} CROSS_COMPILE="${CCNAME}-" ARCH="${kernelArch}" INSTALL_HDR_PATH="${PREFIX}" headers_install || exit 1
) || exit 1

rm -rf "${LINUX_DIR}-${CCNAME}"

exit 0
