#!/bin/bash
# Tool mainly for U-Boot Quality Assurance: build one or more board
# configurations with minimal verbosity, showing only warnings and
# errors.
#
# SPDX-License-Identifier:	GPL-2.0+

usage()
{
	# if exiting with 0, write to stdout, else write to stderr
	local ret=${1:-0}
	[ "${ret}" -eq 1 ] && exec 1>&2
	cat <<-EOF
	Usage: MAKEALL [options] [--] [boards-to-build]

	Options:
	  -a ARCH,   --arch ARCH       Build all boards with arch ARCH
	  -c CPU,    --cpu CPU         Build all boards with cpu CPU
	  -v VENDOR, --vendor VENDOR   Build all boards with vendor VENDOR
	  -s SOC,    --soc SOC         Build all boards with soc SOC
	  -l,        --list            List all targets to be built
	  -m,        --maintainers     List all targets and maintainer email
	  -M,        --mails           List all targets and all affilated emails
	  -C,        --check           Enable build checking
	  -n,        --continue        Continue (skip boards already built)
	  -r,        --rebuild-errors  Rebuild any boards that errored
	  -h,        --help            This help output

	Selections by these options are logically ANDed; if the same option
	is used repeatedly, such selections are ORed.  So "-v FOO -v BAR"
	will select all configurations where the vendor is either FOO or
	BAR.  Any additional arguments specified on the command line are
	always build additionally.  See the boards.cfg file for more info.

	If no boards are specified, then the default is "powerpc".

	Environment variables:
	  BUILD_NCPUS      number of parallel make jobs (default: auto)
	  CROSS_COMPILE    cross-compiler toolchain prefix (default: "")
	  CROSS_COMPILE_<ARCH> cross-compiler toolchain prefix for
			   architecture "ARCH".  Substitute "ARCH" for any
			   supported architecture (default: "")
	  MAKEALL_LOGDIR   output all logs to here (default: ./LOG/)
	  BUILD_DIR        output build directory (default: ./)
	  BUILD_NBUILDS	   number of parallel targets (default: 1)

	Examples:
	  - build all Power Architecture boards:
	      MAKEALL -a powerpc
	      MAKEALL --arch powerpc
	      MAKEALL powerpc
	  - build all PowerPC boards manufactured by vendor "esd":
	      MAKEALL -a powerpc -v esd
	  - build all PowerPC boards manufactured either by "keymile" or "siemens":
	      MAKEALL -a powerpc -v keymile -v siemens
	  - build all Freescale boards with MPC83xx CPUs, plus all 4xx boards:
	      MAKEALL -c mpc83xx -v freescale 4xx
	EOF
	exit ${ret}
}

SHORT_OPTS="ha:c:v:s:lmMCnr"
LONG_OPTS="help,arch:,cpu:,vendor:,soc:,list,maintainers,mails,check,continue,rebuild-errors"

# Option processing based on util-linux-2.13/getopt-parse.bash

# Note that we use `"$@"' to let each command-line parameter expand to a
# separate word. The quotes around `$@' are essential!
# We need TEMP as the `eval set --' would nuke the return value of
# getopt.
TEMP=`getopt -o ${SHORT_OPTS} --long ${LONG_OPTS} \
     -n 'MAKEALL' -- "$@"`

[ $? != 0 ] && usage 1

# Note the quotes around `$TEMP': they are essential!
eval set -- "$TEMP"

SELECTED=''
ONLY_LIST=''
PRINT_MAINTS=''
MAINTAINERS_ONLY=''
CONTINUE=''
REBUILD_ERRORS=''

while true ; do
	case "$1" in
	-a|--arch)
		# echo "Option ARCH: argument \`$2'"
		if [ "$opt_a" ] ; then
			opt_a="${opt_a%)} || \$2 == \"$2\")"
		else
			opt_a="(\$2 == \"$2\")"
		fi
		SELECTED='y'
		shift 2 ;;
	-c|--cpu)
		# echo "Option CPU: argument \`$2'"
		if [ "$opt_c" ] ; then
			opt_c="${opt_c%)} || \$3 == \"$2\" || \$3 ~ /$2:/)"
		else
			opt_c="(\$3 == \"$2\" || \$3 ~ /$2:/)"
		fi
		SELECTED='y'
		shift 2 ;;
	-s|--soc)
		# echo "Option SoC: argument \`$2'"
		if [ "$opt_s" ] ; then
			opt_s="${opt_s%)} || \$4 == \"$2\" || \$4 ~ /$2/)"
		else
			opt_s="(\$4 == \"$2\" || \$4 ~ /$2/)"
		fi
		SELECTED='y'
		shift 2 ;;
	-v|--vendor)
		# echo "Option VENDOR: argument \`$2'"
		if [ "$opt_v" ] ; then
			opt_v="${opt_v%)} || \$5 == \"$2\")"
		else
			opt_v="(\$5 == \"$2\")"
		fi
		SELECTED='y'
		shift 2 ;;
	-C|--check)
		CHECK='C=1'
		shift ;;
	-n|--continue)
		CONTINUE='y'
		shift ;;
	-r|--rebuild-errors)
		REBUILD_ERRORS='y'
		shift ;;
	-l|--list)
		ONLY_LIST='y'
		shift ;;
	-m|--maintainers)
		ONLY_LIST='y'
		PRINT_MAINTS='y'
		MAINTAINERS_ONLY='y'
		shift ;;
	-M|--mails)
		ONLY_LIST='y'
		PRINT_MAINTS='y'
		shift ;;
	-h|--help)
		usage ;;
	--)
		shift ; break ;;
	*)
		echo "Internal error!" >&2 ; exit 1 ;;
	esac
done
# echo "Remaining arguments:"
# for arg do echo '--> '"\`$arg'" ; done

FILTER="\$1 !~ /^#/"
[ "$opt_a" ] && FILTER="${FILTER} && $opt_a"
[ "$opt_c" ] && FILTER="${FILTER} && $opt_c"
[ "$opt_s" ] && FILTER="${FILTER} && $opt_s"
[ "$opt_v" ] && FILTER="${FILTER} && $opt_v"

if [ "$SELECTED" ] ; then
	SELECTED=$(awk '('"$FILTER"') { print $7 }' boards.cfg)

	# Make sure some boards from boards.cfg are actually found
	if [ -z "$SELECTED" ] ; then
		echo "Error: No boards selected, invalid arguments"
		exit 1
	fi
fi

#########################################################################

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

# Determine number of CPU cores if no default was set
: ${BUILD_NCPUS:="`getconf _NPROCESSORS_ONLN`"}

if [ "$BUILD_NCPUS" -gt 1 ]
then
	JOBS="-j $((BUILD_NCPUS + 1))"
else
	JOBS=""
fi

if [ "${MAKEALL_LOGDIR}" ] ; then
	LOG_DIR=${MAKEALL_LOGDIR}
else
	LOG_DIR="LOG"
fi

: ${BUILD_NBUILDS:=1}
BUILD_MANY=0

if [ "${BUILD_NBUILDS}" -gt 1 ] ; then
	BUILD_MANY=1
	: ${BUILD_DIR:=./build}
	mkdir -p "${BUILD_DIR}/ERR"
	find "${BUILD_DIR}/ERR/" -type f -exec rm -f {} +
fi

: ${BUILD_DIR:=.}

OUTPUT_PREFIX="${BUILD_DIR}"

[ -d ${LOG_DIR} ] || mkdir "${LOG_DIR}" || exit 1
if [ "$CONTINUE" != 'y' -a "$REBUILD_ERRORS" != 'y' ] ; then
	find "${LOG_DIR}/" -type f -exec rm -f {} +
fi

LIST=""

# Keep track of the number of builds and errors
ERR_CNT=0
ERR_LIST=""
WRN_CNT=0
WRN_LIST=""
TOTAL_CNT=0
SKIP_CNT=0
CURRENT_CNT=0
OLDEST_IDX=1
RC=0

# Helper funcs for parsing boards.cfg
boards_by_field()
{
	FS="[ \t]+"
	[ -n "$3" ] && FS="$3"
	awk \
		-v field="$1" \
		-v select="$2" \
		-F "$FS" \
		'($1 !~ /^#/ && $field == select) { print $7 }' \
		boards.cfg
}
boards_by_arch() { boards_by_field 2 "$@" ; }
boards_by_cpu()  { boards_by_field 3 "$@" "[: \t]+" ; }
boards_by_soc()  { boards_by_field 4 "$@" ; }

#########################################################################
## MPC5xx Systems
#########################################################################

LIST_5xx="$(boards_by_cpu mpc5xx)"

#########################################################################
## MPC5xxx Systems
#########################################################################

LIST_5xxx="$(boards_by_cpu mpc5xxx)"

#########################################################################
## MPC512x Systems
#########################################################################

LIST_512x="$(boards_by_cpu mpc512x)"

#########################################################################
## MPC8xx Systems
#########################################################################

LIST_8xx="$(boards_by_cpu mpc8xx)"

#########################################################################
## PPC4xx Systems
#########################################################################

LIST_4xx="$(boards_by_cpu ppc4xx)"

#########################################################################
## MPC824x Systems
#########################################################################

LIST_824x="$(boards_by_cpu mpc824x)"

#########################################################################
## MPC8260 Systems (includes 8250, 8255 etc.)
#########################################################################

LIST_8260="$(boards_by_cpu mpc8260)"

#########################################################################
## MPC83xx Systems (includes 8349, etc.)
#########################################################################

LIST_83xx="$(boards_by_cpu mpc83xx)"

#########################################################################
## MPC85xx Systems (includes 8540, 8560 etc.)
#########################################################################

LIST_85xx="$(boards_by_cpu mpc85xx)"

#########################################################################
## MPC86xx Systems
#########################################################################

LIST_86xx="$(boards_by_cpu mpc86xx)"

#########################################################################
## 74xx/7xx Systems
#########################################################################

LIST_74xx_7xx="$(boards_by_cpu 74xx_7xx)"

#########################################################################
## PowerPC groups
#########################################################################

LIST_TSEC="		\
	${LIST_83xx}	\
	${LIST_85xx}	\
	${LIST_86xx}	\
"

LIST_powerpc="		\
	${LIST_5xx}	\
	${LIST_512x}	\
	${LIST_5xxx}	\
	${LIST_8xx}	\
	${LIST_824x}	\
	${LIST_8260}	\
	${LIST_83xx}	\
	${LIST_85xx}	\
	${LIST_86xx}	\
	${LIST_4xx}	\
	${LIST_74xx_7xx}\
"

# Alias "ppc" -> "powerpc" to not break compatibility with older scripts
# still using "ppc" instead of "powerpc"
LIST_ppc="		\
	${LIST_powerpc}	\
"

#########################################################################
## StrongARM Systems
#########################################################################

LIST_SA="$(boards_by_cpu sa1100)"

#########################################################################
## ARM7 Systems
#########################################################################

LIST_ARM7="$(boards_by_cpu arm720t)"

#########################################################################
## ARM9 Systems
#########################################################################

LIST_ARM9="$(boards_by_cpu arm920t)	\
	$(boards_by_cpu arm926ejs)	\
	$(boards_by_cpu arm946es)	\
"

#########################################################################
## ARM11 Systems
#########################################################################
LIST_ARM11="$(boards_by_cpu arm1136)	\
	$(boards_by_cpu arm1176)	\
"

#########################################################################
## ARMV7 Systems
#########################################################################

LIST_ARMV7="$(boards_by_cpu armv7)"

#########################################################################
## AT91 Systems
#########################################################################

LIST_at91="$(boards_by_soc at91)"

#########################################################################
## Xscale Systems
#########################################################################

LIST_pxa="$(boards_by_cpu pxa)"

LIST_ixp="$(boards_by_cpu ixp)"

#########################################################################
## SPEAr Systems
#########################################################################

LIST_spear="$(boards_by_soc spear)"

#########################################################################
## ARM groups
#########################################################################

LIST_arm="$(boards_by_arch arm)"

#########################################################################
## MIPS Systems		(default = big endian)
#########################################################################

LIST_mips4kc="		\
	incaip		\
	incaip_100MHz	\
	incaip_133MHz	\
	incaip_150MHz	\
	qemu_mips	\
	vct_platinum	\
	vct_platinum_small	\
	vct_platinum_onenand	\
	vct_platinum_onenand_small	\
	vct_platinumavc	\
	vct_platinumavc_small	\
	vct_platinumavc_onenand	\
	vct_platinumavc_onenand_small	\
	vct_premium	\
	vct_premium_small	\
	vct_premium_onenand	\
	vct_premium_onenand_small	\
"

LIST_au1xx0="		\
	dbau1000	\
	dbau1100	\
	dbau1500	\
	dbau1550	\
"

LIST_mips="		\
	${LIST_mips4kc}	\
	${LIST_mips5kc}	\
	${LIST_au1xx0}	\
"

#########################################################################
## MIPS Systems		(little endian)
#########################################################################

LIST_au1xx0_el="	\
	dbau1550_el	\
	pb1000		\
"
LIST_mips_el="			\
	${LIST_au1xx0_el}	\
"
#########################################################################
## OpenRISC Systems
#########################################################################

LIST_openrisc="$(boards_by_arch openrisc)"

#########################################################################
## x86 Systems
#########################################################################

LIST_x86="$(boards_by_arch x86)"

#########################################################################
## Nios-II Systems
#########################################################################

LIST_nios2="$(boards_by_arch nios2)"

#########################################################################
## MicroBlaze Systems
#########################################################################

LIST_microblaze="$(boards_by_arch microblaze)"

#########################################################################
## ColdFire Systems
#########################################################################

LIST_m68k="$(boards_by_arch m68k)"
LIST_coldfire=${LIST_m68k}

#########################################################################
## AVR32 Systems
#########################################################################

LIST_avr32="$(boards_by_arch avr32)"

#########################################################################
## Blackfin Systems
#########################################################################

LIST_blackfin="$(boards_by_arch blackfin)"

#########################################################################
## SH Systems
#########################################################################

LIST_sh2="$(boards_by_cpu sh2)"
LIST_sh3="$(boards_by_cpu sh3)"
LIST_sh4="$(boards_by_cpu sh4)"

LIST_sh="$(boards_by_arch sh)"

#########################################################################
## SPARC Systems
#########################################################################

LIST_sparc="$(boards_by_arch sparc)"

#########################################################################
## NDS32 Systems
#########################################################################

LIST_nds32="$(boards_by_arch nds32)"

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

get_target_location() {
	local target=$1
	local BOARD_NAME=""
	local CONFIG_NAME=""
	local board=""
	local vendor=""

	# Automatic mode
	local line=`awk -F '\ +' '\$7 == "'"$target"'" { print \$0 }' boards.cfg`
	if [ -z "${line}" ] ; then echo "" ; return ; fi

	set ${line}

	CONFIG_NAME="${7%_config}"

	[ "${BOARD_NAME}" ] || BOARD_NAME="${7%_config}"

	if [ $# -gt 5 ]; then
		if [ "$6" = "-" ] ; then
			board=${BOARD_NAME}
		else
			board="$6"
		fi
	fi

	[ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5"
	[ $# -gt 6 ] && [ "$8" != "-" ] && {
		tmp="${8%:*}"
		if [ "$tmp" ] ; then
			CONFIG_NAME="$tmp"
		fi
	}

	# Assign board directory to BOARDIR variable
	if [ "${vendor}" == "-" ] ; then
	    BOARDDIR=${board}
	else
	    BOARDDIR=${vendor}/${board}
	fi

	echo "${CONFIG_NAME}:${BOARDDIR}:${BOARD_NAME}"
}

get_target_maintainers() {
	local name=`echo $1 | cut -d : -f 3`

	local line=`awk -F '\ +' '\$7 == "'"$target"'" { print \$0 }' boards.cfg`
	if [ -z "${line}" ]; then
		echo ""
		return ;
	fi

	local mails=`echo ${line} | cut -d ' ' -f 9- | sed -e 's/[^<]*<//' -e 's/>.*</ /' -e 's/>[^>]*$//'`
	[ "$mails" == "-" ] && mails=""
	echo "$mails"
}

get_target_arch() {
	local target=$1

	# Automatic mode
	local line=`egrep -i "^[[:space:]]*${target}[[:space:]]" boards.cfg`

	if [ -z "${line}" ] ; then echo "" ; return ; fi

	set ${line}
	echo "$2"
}

list_target() {
	if [ "$PRINT_MAINTS" != 'y' ] ; then
		echo "$1"
		return
	fi

	echo -n "$1:"

	local loc=`get_target_location $1`

	if [ -z "${loc}" ] ; then echo "ERROR" ; return ; fi

	local maintainers_result=`get_target_maintainers ${loc} | tr " " "\n"`

	if [ "$MAINTAINERS_ONLY" != 'y' ] ; then

		local dir=`echo ${loc} | cut -d ":" -f 2`
		local cfg=`echo ${loc} | cut -d ":" -f 1`
		local git_result=`git log --format=%aE board/${dir} \
				include/configs/${cfg}.h | grep "@"`
		local git_result_recent=`echo ${git_result} | tr " " "\n" | \
						head -n 3`
		local git_result_top=`echo ${git_result} | tr " " "\n" | \
			sort | uniq -c | sort -nr | head -n 3 | \
			sed "s/^ \+[0-9]\+ \+//"`

		echo -e "$git_result_recent\n$git_result_top\n$maintainers_result" | \
			sort -u | tr "\n" " " | sed "s/ $//" ;
	else
		echo -e "$maintainers_result" | sort -u | tr "\n" " " | \
						sed "s/ $//" ;
	fi

	echo ""
}

# Each finished build will have a file called ${donep}${n},
# where n is the index of the build. Each build
# we've already noted as finished will have ${skipp}${n}.
# The code managing the build process will use this information
# to ensure that only BUILD_NBUILDS builds are in flight at once
donep="${LOG_DIR}/._done_"
skipp="${LOG_DIR}/._skip_"

build_target_killed() {
	echo "Aborted $target build."
	# Remove the logs for this board since it was aborted
	rm -f ${LOG_DIR}/$target.MAKELOG ${LOG_DIR}/$target.ERR
	exit
}

build_target() {
	target=$1
	build_idx=$2

	if [ "$ONLY_LIST" == 'y' ] ; then
		list_target ${target}
		return
	fi

	if [ $BUILD_MANY == 1 ] ; then
		output_dir="${OUTPUT_PREFIX}/${target}"
		mkdir -p "${output_dir}"
		trap build_target_killed TERM
	else
		output_dir="${OUTPUT_PREFIX}"
	fi

	export BUILD_DIR="${output_dir}"

	target_arch=$(get_target_arch ${target})
	eval cross_toolchain=\$CROSS_COMPILE_`echo $target_arch | tr '[:lower:]' '[:upper:]'`
	if [ "${cross_toolchain}" ] ; then
	    MAKE="make CROSS_COMPILE=${cross_toolchain}"
	elif [ "${CROSS_COMPILE}" ] ; then
	    MAKE="make CROSS_COMPILE=${CROSS_COMPILE}"
	else
	    MAKE=make
	fi

	${MAKE} distclean >/dev/null
	${MAKE} -s ${target}_config

	${MAKE} ${JOBS} ${CHECK} all \
		>${LOG_DIR}/$target.MAKELOG 2> ${LOG_DIR}/$target.ERR

	# Check for 'make' errors
	if [ ${PIPESTATUS[0]} -ne 0 ] ; then
		RC=1
	fi

	if [ $BUILD_MANY == 1 ] ; then
		trap - TERM

		${MAKE} -s tidy

		if [ -s ${LOG_DIR}/${target}.ERR ] ; then
			cp ${LOG_DIR}/${target}.ERR ${OUTPUT_PREFIX}/ERR/${target}
		else
			rm ${LOG_DIR}/${target}.ERR
		fi
	else
		if [ -s ${LOG_DIR}/${target}.ERR ] ; then
			if grep -iw error ${LOG_DIR}/${target}.ERR ; then
				: $(( ERR_CNT += 1 ))
				ERR_LIST="${ERR_LIST} $target"
			else
				: $(( WRN_CNT += 1 ))
				WRN_LIST="${WRN_LIST} $target"
			fi
		else
			rm ${LOG_DIR}/${target}.ERR
		fi
	fi

	OBJS=${output_dir}/u-boot
	if [ -e ${output_dir}/spl/u-boot-spl ]; then
		OBJS="${OBJS} ${output_dir}/spl/u-boot-spl"
	fi

	${CROSS_COMPILE}size ${OBJS} | tee -a ${LOG_DIR}/$target.MAKELOG

	[ -e "${LOG_DIR}/${target}.ERR" ] && cat "${LOG_DIR}/${target}.ERR"

	touch "${donep}${build_idx}"
}

manage_builds() {
	search_idx=${OLDEST_IDX}
	if [ "$ONLY_LIST" == 'y' ] ; then return ; fi

	while true; do
		if [ -e "${donep}${search_idx}" ] ; then
			: $(( CURRENT_CNT-- ))
			[ ${OLDEST_IDX} -eq ${search_idx} ] &&
				: $(( OLDEST_IDX++ ))

			# Only want to count it once
			rm -f "${donep}${search_idx}"
			touch "${skipp}${search_idx}"
		elif [ -e "${skipp}${search_idx}" ] ; then
			[ ${OLDEST_IDX} -eq ${search_idx} ] &&
				: $(( OLDEST_IDX++ ))
		fi
		: $(( search_idx++ ))
		if [ ${search_idx} -gt ${TOTAL_CNT} ] ; then
			if [ ${CURRENT_CNT} -ge ${BUILD_NBUILDS} ] ; then
				search_idx=${OLDEST_IDX}
				sleep 1
			else
				break
			fi
		fi
	done
}

build_targets() {
	for t in "$@" ; do
		# If a LIST_xxx var exists, use it.  But avoid variable
		# expansion in the eval when a board name contains certain
		# characters that the shell interprets.
		case ${t} in
			*[-+=]*) list= ;;
			*)       list=$(eval echo '${LIST_'$t'}') ;;
		esac
		if [ -n "${list}" ] ; then
			build_targets ${list}
		else
			: $((TOTAL_CNT += 1))
			: $((CURRENT_CNT += 1))
			rm -f "${donep}${TOTAL_CNT}"
			rm -f "${skipp}${TOTAL_CNT}"
			if [ "$CONTINUE" = 'y' -a -e ${LOG_DIR}/$t.MAKELOG ] ; then
				: $((SKIP_CNT += 1))
				touch "${donep}${TOTAL_CNT}"
			elif [ "$REBUILD_ERRORS" = 'y' -a ! -e ${LOG_DIR}/$t.ERR ] ; then
				: $((SKIP_CNT += 1))
				touch "${donep}${TOTAL_CNT}"
			else
				if [ $BUILD_MANY == 1 ] ; then
					build_target ${t} ${TOTAL_CNT} &
				else
					CUR_TGT="${t}"
					build_target ${t} ${TOTAL_CNT}
					CUR_TGT=''
				fi
			fi
		fi

		# We maintain a running count of all the builds we have done.
		# Each finished build will have a file called ${donep}${n},
		# where n is the index of the build. Each build
		# we've already noted as finished will have ${skipp}${n}.
		# We track the current index via TOTAL_CNT, and the oldest
		# index. When we exceed the maximum number of parallel builds,
		# We look from oldest to current for builds that have completed,
		# and update the current count and oldest index as appropriate.
		# If we've gone through the entire list, wait a second, and
		# reprocess the entire list until we find a build that has
		# completed
		if [ ${CURRENT_CNT} -ge ${BUILD_NBUILDS} ] ; then
			manage_builds
		fi
	done
}

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

kill_children() {
	local OS=$(uname -s)
	local children=""
	case "${OS}" in
		"Darwin")
			# Mac OS X is known to have BSD style ps
			local pgid=$(ps -p $$ -o pgid | sed -e "/PGID/d")
			children=$(ps -g $pgid -o pid | sed -e "/PID\|$$\|$pgid/d")
			;;
		*)
			# everything else tries the GNU style
			local pgid=$(ps -p $$ --no-headers -o "%r" | tr -d ' ')
			children=$(pgrep -g $pgid | sed -e "/$$\|$pgid/d")
			;;
	esac

	kill $children 2> /dev/null
	wait $children 2> /dev/null

	exit
}

print_stats() {
	if [ "$ONLY_LIST" == 'y' ] ; then return ; fi

	# Only count boards that completed
	: $((TOTAL_CNT = `find ${skipp}* 2> /dev/null | wc -l`))

	rm -f ${donep}* ${skipp}*

	if [ $BUILD_MANY == 1 ] && [ -e "${OUTPUT_PREFIX}/ERR" ] ; then
		ERR_LIST=`grep -riwl error ${OUTPUT_PREFIX}/ERR/`
		ERR_LIST=`for f in $ERR_LIST ; do echo -n " $(basename $f)" ; done`
		ERR_CNT=`echo $ERR_LIST | wc -w | awk '{print $1}'`
		WRN_LIST=`grep -riwL error ${OUTPUT_PREFIX}/ERR/`
		WRN_LIST=`for f in $WRN_LIST ; do echo -n " $(basename $f)" ; done`
		WRN_CNT=`echo $WRN_LIST | wc -w | awk '{print $1}'`
	else
		# Remove the logs for any board that was interrupted
		rm -f ${LOG_DIR}/${CUR_TGT}.MAKELOG ${LOG_DIR}/${CUR_TGT}.ERR
	fi

	: $((TOTAL_CNT -= ${SKIP_CNT}))
	echo ""
	echo "--------------------- SUMMARY ----------------------------"
	if [ "$CONTINUE" = 'y' -o "$REBUILD_ERRORS" = 'y' ] ; then
		echo "Boards skipped: ${SKIP_CNT}"
	fi
	echo "Boards compiled: ${TOTAL_CNT}"
	if [ ${ERR_CNT} -gt 0 ] ; then
		echo "Boards with errors: ${ERR_CNT} (${ERR_LIST} )"
	fi
	if [ ${WRN_CNT} -gt 0 ] ; then
		echo "Boards with warnings but no errors: ${WRN_CNT} (${WRN_LIST} )"
	fi
	echo "----------------------------------------------------------"

	if [ $BUILD_MANY == 1 ] ; then
		kill_children
	fi

	exit $RC
}

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

# Build target groups selected by options, plus any command line args
set -- ${SELECTED} "$@"
# run PowerPC by default
[ $# = 0 ] && set -- powerpc
build_targets "$@"
wait
