#! /bin/bash
#
#  author: yao.zhang1@amlogic.com
#  2021.05.20

MAIN_FOLDER=`pwd`
CONFIG_COVERITY_ALL="0"
CC64="/opt/gcc-linaro-6.3.1-2017.02-x86_64_aarch64-linux-gnu/bin/aarch64-linux-gnu-"
CC32="/opt/gcc-linaro-6.3.1-2017.02-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-"
CC64_5_4="/opt/gcc-arm-8.3-2019.03-x86_64-aarch64-linux-gnu/bin/aarch64-linux-gnu-"
CONFIG_GKI_MODULE="arch/arm64/configs/meson64_gki_module_config"
CONFIG_A64_R="arch/arm64/configs/meson64_a64_R_defconfig"

function usage() {
  cat << EOF
  Usage:
    ./$(basename $0) --help

		code check kernel build script.
		This script will coverity the latest code commit or all code coverity locally.

		In the common\html-result directory, you can open the index.html and summary.html files through a browser and view code defects

    command list:
        ./$(basename $0)  [CONFIG_COVERITY_ALL]

    Example:
    1) ./scripts/amlogic/code_check.sh --all //kernel 5.4 or kernel 4.9, then coverity all

    2) ./scripts/amlogic/code_check.sh //kernel 5.4 or kernel 4.9, then coverity own local last commit

		3) ./scripts/amlogic/code_check.sh drivers/amlogic/power //kernel 5.4 or kernel 4.9, Scan code in a directory

EOF
  exit 1
}

function build_kernel() {
	#echo "=====build kernel======"
	if [ "$CONFIG_KERNEL_VERSION" = "4.9" ]; then
		if [ "$CONFIG_ARCH" = "arm64" ]; then
			echo "===========CONFIG_ARCH $CONFIG_ARCH ==========="
			make ARCH=arm64 clean
			make ARCH=arm64 mrproper
			make ARCH=arm64 O=./kernel-output clean
			make ARCH=arm64 O=./kernel-output mrproper
			make ARCH=arm64 CROSS_COMPILE=$CC64 O=./kernel-output meson64_defconfig
			cov-build --dir ./im-dir/ make ARCH=arm64 CROSS_COMPILE=$CC64 O=./kernel-output Image -j32
		elif [ "$CONFIG_ARCH" = "arm32" ]; then
			echo "===========CONFIG_ARCH $CONFIG_ARCH ==========="
			make ARCH=arm clean
			make ARCH=arm mrproper
			make ARCH=arm O=./kernel-output clean
			make ARCH=arm O=./kernel-output mrproper
			make ARCH=arm CROSS_COMPILE=$CC32 O=../kernel_output/ meson64_a32_defconfig
			#make ARCH=arm mrproper
			cov-build --dir ./im-dir/ make ARCH=arm CROSS_COMPILE=$CC32 O=kernel_output uImage -j32
		else
			echo "===========CONFIG_ARCH ? ==========="
			usage
		fi
	elif [ "$CONFIG_KERNEL_VERSION" = "5.4" ]; then
		#rm -rf ./im-dir/ ./html-result/ ./kernel-output*
		make ARCH=arm64 mrproper
		make ARCH=arm64 clean
		git checkout scripts/kconfig/merge_config.sh
		make ARCH=arm64 O=./kernel-output mrproper
		make ARCH=arm64 O=./kernel-output clean
		cat $CONFIG_GKI_MODULE $CONFIG_A64_R > arch/arm64/configs/cover_defconfig
		sed -i 's/=m/=y/' arch/arm64/configs/cover_defconfig
		sed -i 's/OUTPUT=\./OUTPUT=.\/kernel-output/' ./scripts/kconfig/merge_config.sh
		make ARCH=arm64 CROSS_COMPILE=$CC64_5_4 O=./kernel-output cover_defconfig
		rm arch/arm64/configs/cover_defconfig
		git checkout scripts/kconfig/merge_config.sh
		#git checkout .
		cov-build --dir ./im-dir/ make ARCH=arm64 CROSS_COMPILE=$CC64_5_4 O=./kernel-output Image -j32
	else
		usage
	fi
}

function build() {
	WORKSPACE=`pwd`
	#echo "===========WORKSPACE $WORKSPACE==========="

	#git diff HEAD@{1} --name-only | grep -e '\.c$' -e '\.h$' > file.list
	#git diff HEAD@{0} --name-only | grep -v -e '\.dtsi$' -e '\.dts$' > file.list
	#git diff HEAD~1 HEAD~0 --name-only | grep -e '\.c$' -e '\.h$' > file.list
	git diff HEAD^ --name-only | grep -e '\.c$' -e '\.h$' > file.list

	tupattern="0"
	firstline="0"
	while read line
	do
		if [ "$firstline" = "0" ]; then
			filelist="$line"
			tupattern="file('/$line')"
			firstline="1"
		else
			filelist="$line|$filelist"
			tupattern="file('/$line')||$tupattern"
		fi
	done < file.list

	FILE_LIST="--include-files \"${filelist}\""

	if [ -n "$1" ]; then
		if [ -d "$WORKSPACE/$1" ]; then
			echo "scan path: $1"
			tupattern="file(\"$1\")"
			FILE_LIST=""
			filelist=""
		fi
	fi

	echo "===========filelist $filelist==========="
	#echo "===========FILE_LIST $FILE_LIST==========="
	result1=`echo $tupattern |grep "arch/arm/"`
	result2=`echo $tupattern |grep "arch/arm64/"`
	if [ "$result1" != "" ]&&[ "$result2" != "" ]; then
		CONFIG_ARCH="arm64"
	elif [ "$result1" != "" ]; then
		CONFIG_ARCH="arm32"
	else
		CONFIG_ARCH="arm64"
	fi

	sleep 1

	build_kernel

	sleep 1

	if [ "$CONFIG_COVERITY_ALL" = "1" ]; then
		echo "===========CONFIG_COVERITY_ALL==========="
		cov-analyze --dir ./im-dir/ --strip-path $WORKSPACE/ --all
		sleep 1
		cov-format-errors --dir ./im-dir/ --html-output ./html-result --filesort --strip-path $WORKSPACE/ -x
	else
		#echo "===========filelist ${filelist}"
		echo "===========tupattern ${tupattern}"
		if [ "$filelist" = "" ]; then
			echo "===========only coverity .c and .h !!!================="
		fi
		cov-analyze --dir ./im-dir/ --strip-path $WORKSPACE/ --tu-pattern "${tupattern}" --all
		#cov-analyze --dir ./im-dir/ --strip-path $WORKSPACE/ --tu-pattern "${tupattern}"
		sleep 1
		cov-format-errors --dir ./im-dir/ $FILE_LIST --html-output ./html-result --filesort --strip-path $WORKSPACE/ -x
		#cov-format-errors --dir ./im-dir/ --html-output ./html-result --filesort --strip-path $WORKSPACE/ -x
	fi
}

function parser() {
	local i=0
	local j=0
	local argv=()
	for arg in "$@" ; do
		argv[$i]="$arg"
		i=$((i + 1))
	done
	i=0
	j=0
	while [ $i -lt $# ]; do
		arg="${argv[$i]}"
		i=$((i + 1)) # must place here
		case "$arg" in
			-h|--help|help)
				usage
				exit ;;
			#-a)
			#	CONFIG_ARCH="${argv[$i]}"
			#	echo "CONFIG_ARCH: ${CONFIG_ARCH}"
			#	continue ;;
			#-v)
			#	CONFIG_KERNEL_VERSION="${argv[$i]}"
			#	echo "CONFIG_KERNEL_VERSION: ${CONFIG_KERNEL_VERSION}"
			#	continue ;;
			--all)
				CONFIG_COVERITY_ALL="1"
				continue ;;
			*)
		esac
	done

	CONFIG_ARCH="arm64"
	cat Makefile |grep "VERSION " > version_cat
	cat Makefile |grep "PATCHLEVEL " > patchlevel_cat
	VERSION=`sed -n '1p' version_cat | cut -d ' ' -f 3`
	PATCHLEVEL=`sed -n '1p' patchlevel_cat | cut -d ' ' -f 3`
	rm version_cat patchlevel_cat
	CONFIG_KERNEL_VERSION=$VERSION.$PATCHLEVEL

	echo "===========CONFIG_KERNEL_VERSION $CONFIG_KERNEL_VERSION==========="
	#if [ "$j" == "0" ]; then
		#usage
		#exit
	#fi
}

function main() {
	if [ -z $0 ]
	then
		usage
		return
	fi
	parser $@
	build $@
}

main $@
