#!/bin/bash
# Copyright (c) 2000-2016 Synology Inc. All rights reserved.
# vim:ft=sh

# ========================================================================
# To specify which platform depends on this kernel,
# please edit the section [platform kernel] in config/project.depends
# ========================================================================

# Copy key file
cp -sv /lnxscripts/config/{signing_key,trusted_certificates,untrusted_certificates} .

export ARCH=${ARCH}
CC=`echo ${CC} | awk -F" " '{print $1}'`
export CROSS_COMPILE=${ToolChainPrefix} CC="${CC}"
KERNEL_CC="${CC}"
KERNEL_STRIP=${STRIP_ORI}

if [ "$PLATFORM_FAMILY" = "SYNOPLAT_F_X86_64" ] && [ "$BUILD_TARGET" != "DOCKERX64" ]; then
ln -s "${SysRootInclude}/hydrogen/hydrogen.h" "${KernelDir}/include/crypto/hydrogen.h"
	ln -s "${SysRootInclude}/hydrogen/hydrogen.c" "${KernelDir}/crypto/hydrogen/hydrogen.c"
	ln -s "${SysRootInclude}/hydrogen/impl" "${KernelDir}/crypto/hydrogen/impl"
	sed -i "s/__RAMDISK_SIGN_PUBLIC_KEY__/$(cat /lnxscripts/config/rd_sign.pub | xxd -i -c 32 )/" \
		"${KernelDir}/init/initramfs.c"
fi

case ${MakeClean} in
	[Yy][Ee][Ss])
		[ -f Makefile ] && make distclean
		;;
esac

case ${CleanOnly} in
	[Yy][Ee][Ss])
		return
		;;
esac

# Version Infomation
LNXVERSION="${KernelDir}/.version"
if [ -f ${VERSION_FILE} ]; then
	expr $(GetDSMBuildNumber) - 1 > ${LNXVERSION}
fi

mkdir -p ${ImageDir}/modules
mkdir -p ${SysRootInclude}/crypto


KernelImage=${KernelDir}/arch/arm/boot/uImage
KernelTarget=uImage

case "$BUILD_TARGET" in
	ALPINE|STM_MONACO|MARVELL_ARMADA38X|HISILICON_HI3536)
		KernelConfig=synoconfigs/${PLATFORM_ABBR}
		;;
	*)
		SkipThisProject
		return
		;;
esac

config_debug_mode()
{
    local _protect_ver="$(dpkg -l | grep -w synoprotection | awk '{print $3}' | cut -d'-' -f2 | head -n1)"
    local _dsm_ver="$(GetDSMBuildNumber)"
    if [ -z "$_protect_ver" ]; then
        WARNING "Unable to detect dpkg 'synoprotection'"
    elif [ "$_dsm_ver" != "$_protect_ver" ]; then
        WARNING "buildnumber in synoversion/VERSION doesn't match dpkg 'synoprotection'"
        exit 1
    fi

    local _cfg=
    local _enabled="
        CONFIG_DEBUG_FS
        CONFIG_PERF_EVENTS

        CONFIG_DEBUG_INFO
        CONFIG_FRAME_POINTER

        CONFIG_DEBUG_SPINLOCK
        CONFIG_DEBUG_MUTEXES
        CONFIG_DEBUG_ATOMIC_SLEEP

        CONFIG_FTRACE
        CONFIG_BRANCH_PROFILE_NONE
        CONFIG_FUNCTION_TRACER
        CONFIG_FTRACE_SYSCALLS
        CONFIG_IRQSOFF_TRACER
        CONFIG_PREEMPT_TRACER
        CONFIG_SCHED_TRACER
        CONFIG_BLK_DEV_IO_TRACE
        CONFIG_STACK_TRACER
        CONFIG_UPROBE_EVENT
        CONFIG_FUNCTION_PROFILER

        CONFIG_KPROBES
        CONFIG_BPF_SYSCALL
    "
    local _disabled="
    "

    for _cfg in $_enabled; do
        INFO "Enable $_cfg"
        ./scripts/config --enable $_cfg
    done

    for _cfg in $_disabled; do
        INFO "Disable $_cfg"
        ./scripts/config --disable $_cfg
    done
}

# Build kernel and modules
rm -f ${KernelImage}
rm -f ${ImageDir}/modules/*

cp -f ${KernelConfig} .config
mkdir -p include/linux/modules

if [ -f ".debug" ]; then
    INFO ".debug detected. Configured as debug mode."
    config_debug_mode
    make olddefconfig
else
    make oldconfig
fi

echo "===== Build Synology Linux kernel 3.10.x BSP ====="
make ${MAKE_FLAGS} ${KernelTarget} modules CC=${KERNEL_CC}

# Check if kernel is built correctly
if [ ! -f "${KernelImage}" ]; then
	echo "Error! ${KernelImage} does not exist!"
	exit 1;
fi

./scripts/syno_gen_usbmodem_table.sh create-table
if [ "$BUILD_TARGET" = "STM_MONACO" ]; then
	DVB_MODULES_DIR="scripts/DVB/3.10.x"
	if [ -d "$DVB_MODULES_DIR" ]; then
		rm -rf ${DVB_MODULES_DIR}
	fi

	mkdir -p ${DVB_MODULES_DIR}
	find drivers/media -name '*.ko' -exec cp {} ${DVB_MODULES_DIR}/ \;
	cd ./scripts/DVB/
	./generate_dependency_table.py 2>&1
	./generate_VIDPID_table.py 2>&1
	./generate_cleanuped_dependency_table.py 2>&1
	cd -
fi

# Compare kernel config with re-generated one to see
# if any changes or new options not reapplied to ${KernelConfig}.
ConfigDiff=`diff -bu ${KernelConfig} .config`
if [ -z "$ConfigDiff" ]; then
	echo
	echo "Kernel config matches generated .config"
	echo
else
	echo ========== diff -bu ${KernelConfig} .config
	diff -bu ${KernelConfig} .config
	echo ========== END of diff

        if [ ! -f ".debug" ]; then
            echo
            echo "!!! Diff EXISTS between ${KernelConfig} & generated .config"
            echo "!!! Recheck before committing."
            echo
        fi
fi
