#!/bin/sh

# Print statistics when we exit
trap exit 1 2 3 15
trap stats 0

# Keep track of the number of builds and errors
nb_errors=0
errors_list=""
nb_defconfigs=0
ret=0

here=$(pwd)

time_start=$(date +%s)

filename=`basename $0`

is_print_stats=1

#-----------------------------------------------------------------------

usage() {
	is_print_stats=0
	echo "Usage: ${filename} [OPTION]..."
	echo "Barebox MAKEALL tools."
	echo ""
	echo "it's allow you to compile specific defconfig or ARCH or all"
	echo "as"
	echo ""
	echo "CROSS_COMPILE=arm-linux- ARCH=arm ./MAKEALL at91sam9263ek_defconfig"
	echo "CROSS_COMPILE=arm-linux- ARCH=arm ./MAKEALL"
	echo ""
	echo "The cross-compiler can be specify via"
	echo "    CROSS_COMPILE               default"
	echo "    CROSS_COMPILE_<arch>        arch default"
	echo "    CROSS_COMPILE_<target>      deconfig specifc"
	echo ""
	echo "it will be evaluated in the invert order"
	echo ""
	echo "or via config"
	echo ""
	echo "you can specify it via env CONFIG or option -c (overwrite env)"
	echo ""
	echo "CONFIG=./MAKEALL.cfg ARCH=arm ./MAKEALL at91sam9263ek_defconfig"
	echo "CONFIG=./MAKEALL.cfg ARCH=arm ./MAKEALL"
	echo ""
	echo "and for all"
	echo ""
	echo "CONFIG=./MAKEALL.cfg ./MAKEALL"
	echo ""
	echo "you can specify via env or option"
	echo "env       option"
	echo "ARCH      -a      arch"
	echo "CONFIG    -c      config"
	echo "JOBS      -j      jobs"
	echo "BUILDDIR  -O      build dir"
	echo "LOGDIR    -l      log dir"
	echo ""
}

stats() {
	[ ${is_print_stats} -lt 1 ] && return

	echo ""
	echo "--------------------- SUMMARY ----------------------------"
	echo "defconfigs compiled: ${nb_defconfigs}"
	time_stop=$(date +%s)
	time_diff=$((${time_stop} - ${time_start}))
	printf "compiled in %4is\n" ${time_diff}
	if [ ${nb_errors} -gt 0 ] ; then
		echo "defcongids with warnings or errors: ${nb_errors} (${errors_list} )"
	fi
	echo "----------------------------------------------------------"

	exit ${ret}
}

check_pipe_status() {
	for i in "${PIPESTATUS[@]}"
	do
		[ $i -gt 0 ] && return 1
	done
	return 0
}

do_build_target() {
	local arch=$1
	local target=$2
	local target_time_start=$(date +%s)
	local log_report="${LOGDIR}/${target}/report.log"
	local log_err="${LOGDIR}/${target}/errors.log"

	rm -rf "${BUILDDIR}"
	mkdir -p "${BUILDDIR}"
	mkdir -p "${LOGDIR}/${target}"
	printf "Building ${arch} ${target} \n" >&2 | tee -a "${log_report}"

	cross_compile=`eval echo '$CROSS_COMPILE_'${target}`
	cross_compile_set=`eval echo '${CROSS_COMPILE_'${target}'+set}'`
	if [ "${cross_compile_set}" = "" ]
	then
		cross_compile=`eval echo '$CROSS_COMPILE_'${arch}`
		cross_compile_set=`eval echo '${CROSS_COMPILE_'${arch}'+set}'`
		if [ "${cross_compile_set}" = "" ]
		then
			cross_compile=${CROSS_COMPILE}
		fi
	fi

	MAKE="make -C ${here} CROSS_COMPILE=${cross_compile} ARCH=${arch} O=${BUILDDIR}"
	${MAKE} -j${JOBS} ${target} 2>&1 > "${log_report}" | tee "${log_err}"

	printf "Configure: " | tee -a "${log_report}"
	check_pipe_status
	if [ "$?" = "0" ]; then
		printf "OK     \n" | tee -a "${log_report}"

		${MAKE} -j${JOBS} -s 2>&1 >> "${log_report}" | tee -a "${log_err}"

		printf "Compile: " ${target} | tee -a "${log_report}"

		check_pipe_status
		if [ "$?" = "0" ]; then
			printf "OK     \n" | tee -a "${log_report}"
			${cross_compile}size ${BUILDDIR}/barebox | tee -a "${log_report}"
		else
			printf "FAILED \n" | tee -a "${log_report}"
			ret=1
		fi
	else
		printf "FAILED \n" | tee -a "${log_report}"
		printf "Compile: ------ \n" | tee -a "${log_report}"
		ret=1
	fi

	if [ -s "${log_err}" ] ; then
		nb_errors=$((nb_errors + 1))
		errors_list="${errors_list} ${target}"
	else
		rm "${log_err}"
	fi

	nb_defconfigs=$((nb_defconfigs + 1))

	target_time_stop=$(date +%s)
	target_time_diff=$((${target_time_stop} - ${target_time_start}))
	printf "Compiled in %4is\n" ${target_time_diff} | tee -a "${log_report}"
}

do_build() {
	local arch=$1

	for i in arch/${arch}/configs/*_defconfig
	do
		local target=$(basename $i)

		do_build_target ${arch} ${target}
	done
}

do_build_all() {
	local build_target=0

	for i in arch/*
	do
		local arch=$(basename $i)

		if [ -d $i ]
		then
			do_build ${arch}
			build_target=$((build_target + 1))
		fi
	done

	return $build_target
}

while getopts "hc:j:O:l:a:" Option
do
case $Option in
	a )
		ARCH=${OPTARG}
		;;
	c )
		CONFIG=${OPTARG}
		;;
	j )
		JOBS=${OPTARG}
		;;
	l )
		LOGDIR=${OPTARG}
		;;
	O )
		BUILDDIR=${OPTARG}
		;;
	h )
		usage
		exit 0
		;;
esac
done

shift $((OPTIND - 1))

if [ ! "${JOBS}" ] ; then
	#linux, BSD, MacOS
	nb_cpu=`getconf _NPROCESSORS_ONLN`

	if [ $? -gt 0 ]
	then
		nb_cpu=1
	fi

	JOBS=$((${nb_cpu} * 2))
fi

if [ ! "${LOGDIR}" ]
then
	LOGDIR="log"
fi

if [ ! "${BUILDDIR}" ]
then
	BUILDDIR="makeall_builddir"
fi

if [ "${CONFIG}" ]
then
	basedir=`dirname ${CONFIG}`

	if [ ! "${basedir}" ] || [ "${basedir}" = "." ]
	then
		CONFIG="./${CONFIG}"
	fi

	source "${CONFIG}"
fi

[ -d "${LOGDIR}" ] || mkdir ${LOGDIR} || exit 1

if [ ! "${CONFIG}" ] && [ ! "${CROSS_COMPILE+set}" ]
then
	echo "You need to specify a CONFIG or a CROSS_COMPILE"
	usage
	exit 1
fi

if [ ! "${ARCH}" ] || [ ! -d arch/${ARCH} ]
then
	do_build_all
	if [ $? -eq 0 ]
	then
		echo "You need to specify the ARCH or CROSS_COMPILE_<arch> or CROSS_COMPILE_<target> in your config file"
		usage
		exit 1
	fi
	exit 0
fi

if [ $# -eq 0 ]
then
	do_build ${ARCH}
else
	do_build_target ${ARCH} $1
fi
