#!/bin/bash

# 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 [ "${CROSS_COMPILE}" ] ; then
	MAKE="make CROSS_COMPILE=${CROSS_COMPILE}"
else
	MAKE=make
fi

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

if [ ! "${BUILD_DIR}" ] ; then
	BUILD_DIR="."
fi

[ -d ${LOG_DIR} ] || mkdir ${LOG_DIR} || exit 1

LIST=""

# Keep track of the number of builds and errors
ERR_CNT=0
ERR_LIST=""
TOTAL_CNT=0
RC=0

# Helper funcs for parsing boards.cfg
boards_by_field()
{
	awk \
		-v field="$1" \
		-v select="$2" \
		'($1 !~ /^#/ && $field == select) { print $1 }' \
		boards.cfg
}
boards_by_arch() { boards_by_field 2 "$@" ; }
boards_by_cpu()  { boards_by_field 3 "$@" ; }

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

LIST_5xx="$(boards_by_cpu mpc5xx)"

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

LIST_5xxx="$(boards_by_cpu mpc5xxx)
	digsy_mtc	\
	EVAL5200	\
	fo300		\
	galaxy5200	\
	icecube_5200	\
	lite5200b	\
	mcc200		\
	MVBC_P		\
	MVSMR		\
	pcm030		\
	PM520		\
	TB5200		\
	Total5200	\
	Total5200_Rev2	\
	TQM5200		\
	TQM5200_B	\
	TQM5200S	\
"

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

LIST_512x="$(boards_by_cpu mpc512x)
	mpc5121ads	\
"

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

LIST_8xx="$(boards_by_cpu mpc8xx)
	Adder87x	\
	AdderII		\
	ADS860		\
	FADS823		\
	FADS850SAR	\
	FADS860T	\
	FPS850L		\
	GEN860T		\
	GEN860T_SC	\
	ICU862_100MHz	\
	IVML24		\
	IVML24_128	\
	IVML24_256	\
	IVMS8		\
	IVMS8_128	\
	IVMS8_256	\
	MBX		\
	MBX860T		\
	MPC86xADS	\
	MPC885ADS	\
	NETPHONE	\
	NETTA		\
	NETTA2		\
	NETTA_ISDN	\
	NETVIA		\
	NETVIA_V2	\
	RPXlite_DW	\
	SPD823TS	\
	SXNI855T	\
	TK885D		\
	TQM823L		\
	TQM823L_LCD	\
	TQM850L		\
	TQM855L		\
	TQM860L		\
	TQM885D		\
	v37		\
"

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

LIST_4xx="$(boards_by_cpu ppc4xx)
	acadia_nand	\
	arches		\
	bamboo_nand	\
	canyonlands	\
	canyonlands_nand \
	CPCI405		\
	CPCI4052	\
	CPCI405AB	\
	CPCI405DT	\
	devconcenter	\
	fx12mm		\
	glacier		\
	haleakala	\
	haleakala_nand	\
	hcu4		\
	hcu5		\
	intip		\
	kilauea		\
	kilauea_nand	\
	mcu25		\
	MIP405T		\
	ml507		\
	ml507_flash	\
	OCRTC		\
	ORSG		\
	PPChameleonEVB	\
	rainier		\
	sequoia		\
	sequoia_nand	\
	v5fx30teval	\
	v5fx30teval_flash \
	W7OLMC		\
	W7OLMG		\
	walnut		\
	xilinx-ppc440-generic \
	xilinx-ppc440-generic_flash \
	yellowstone	\
	yosemite	\
"

#########################################################################
## MPC8220 Systems
#########################################################################

LIST_8220="$(boards_by_cpu mpc8220)"

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

LIST_824x="$(boards_by_cpu mpc824x)
	CPC45		\
	eXalion		\
	IDS8247		\
	linkstation_HGLAN	\
	Sandpoint8240	\
	Sandpoint8245	\
"

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

LIST_8260="$(boards_by_cpu mpc8260)
	cogent_mpc8260	\
	CPU86		\
	CPU87		\
	ep8248		\
	ISPAN		\
	MPC8260ADS	\
	MPC8272ADS	\
	PM826		\
	PM828		\
	Rattler8248	\
	TQM8260_AC	\
	TQM8260_AD	\
	TQM8260_AE	\
"

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

LIST_83xx="$(boards_by_cpu mpc83xx)
	caddy2		\
	MPC8313ERDB_33	\
	MPC8313ERDB_NAND_66	\
	MPC8315ERDB	\
	MPC8315ERDB_NAND	\
	MPC832XEMDS	\
	MPC832XEMDS_ATM	\
	MPC8349ITX	\
	MPC8349ITXGP	\
	MPC8360EMDS	\
	MPC8360EMDS_ATM	\
	MPC8360ERDK_33	\
	MPC8360ERDK_66	\
	MPC837XEMDS	\
	sbc8349		\
	SIMPC8313_LP	\
	vme8349		\
"


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

LIST_85xx="$(boards_by_cpu mpc85xx)
	MPC8536DS	\
	MPC8536DS_NAND	\
	MPC8536DS_SDCARD	\
	MPC8536DS_SPIFLASH	\
	MPC8536DS_36BIT	\
	MPC8540EVAL	\
	MPC8541CDS	\
	MPC8548CDS	\
	MPC8555CDS	\
	MPC8569MDS	\
	MPC8569MDS_ATM	\
	MPC8569MDS_NAND \
	MPC8572DS	\
	MPC8572DS_36BIT	\
	P2020DS		\
	P2020DS_36BIT	\
	P1011RDB	\
	P1011RDB_NAND	\
	P1011RDB_SDCARD	\
	P1011RDB_SPIFLASH	\
	P1020RDB	\
	P1020RDB_NAND	\
	P1020RDB_SDCARD	\
	P1020RDB_SPIFLASH	\
	P2010RDB	\
	P2010RDB_NAND	\
	P2010RDB_SDCARD	\
	P2010RDB_SPIFLASH	\
	P2020RDB	\
	P2020RDB_NAND	\
	P2020RDB_SDCARD	\
	P2020RDB_SPIFLASH	\
	sbc8540		\
	sbc8548		\
	sbc8548_PCI_33	\
	sbc8548_PCI_66	\
	sbc8548_PCI_33_PCIE \
	sbc8548_PCI_66_PCIE \
	sbc8560		\
	stxssa		\
	TQM8540		\
	TQM8541		\
	TQM8548		\
	TQM8548_AG	\
	TQM8548_BE	\
	TQM8555		\
	TQM8560		\
"

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

LIST_86xx="$(boards_by_cpu mpc86xx)
	MPC8641HPCN_36BIT \
	MPC8641HPCN	\
"

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

LIST_74xx="		\
	DB64360		\
	DB64460		\
	EVB64260	\
	mpc7448hpc2	\
	P3G4		\
	p3m7448		\
	PCIPPC2		\
	PCIPPC6		\
	ZUMA		\
"

LIST_7xx="		\
	BAB7xx		\
	CPCI750		\
	ELPPC		\
	p3m750		\
	ppmc7xx		\
"

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

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

LIST_powerpc="		\
	${LIST_5xx}	\
	${LIST_512x}	\
	${LIST_5xxx}	\
	${LIST_8xx}	\
	${LIST_8220}	\
	${LIST_824x}	\
	${LIST_8260}	\
	${LIST_83xx}	\
	${LIST_85xx}	\
	${LIST_86xx}	\
	${LIST_4xx}	\
	${LIST_74xx}	\
	${LIST_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="		\
	ap7		\
	ap720t		\
	armadillo	\
	B2		\
	ep7312		\
	evb4510		\
	impa7		\
	integratorap	\
	lpc2292sodimm	\
	modnet50	\
	SMN42		\
"

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

LIST_ARM9="			\
	a320evb			\
	ap920t			\
	ap922_XA10		\
	ap926ejs		\
	ap946es			\
	ap966			\
	cp920t			\
	cp922_XA10		\
	cp926ejs		\
	cp946es			\
	cp966			\
	da830evm		\
	da850evm		\
	edb9301			\
	edb9302			\
	edb9302a		\
	edb9307			\
	edb9307a		\
	edb9312			\
	edb9315			\
	edb9315a		\
	edminiv2		\
	guruplug		\
	imx27lite		\
	jadecpu			\
	lpd7a400		\
	magnesium		\
	mv88f6281gtw_ge		\
	mx1ads			\
	mx1fs2			\
	netstar			\
	nhk8815			\
	nhk8815_onenand		\
	omap1510inn		\
	omap1610h2		\
	omap1610inn		\
	omap5912osk		\
	omap730p2		\
	openrd_base		\
	rd6281a			\
	sbc2410x		\
	scb9328			\
	sheevaplug		\
	smdk2400		\
	smdk2410		\
	spear300		\
	spear310		\
	spear320		\
	spear600		\
	suen3			\
	trab			\
	VCMA9			\
	versatile		\
	versatileab		\
	versatilepb		\
	voiceblue		\
	davinci_dvevm		\
	davinci_schmoogie	\
	davinci_sffsdr		\
	davinci_sonata		\
	davinci_dm355evm	\
	davinci_dm355leopard	\
	davinci_dm365evm	\
	davinci_dm6467evm	\
"

#########################################################################
## ARM10 Systems
#########################################################################
LIST_ARM10="		\
	integratorcp	\
	cp1026		\
"

#########################################################################
## ARM11 Systems
#########################################################################
LIST_ARM11="			\
	cp1136			\
	omap2420h4		\
	apollon			\
	imx31_litekit		\
	imx31_phycore		\
	imx31_phycore_eet	\
	mx31ads			\
	mx31pdk			\
	mx31pdk_nand		\
	qong			\
	smdk6400		\
	tnetv107x_evm		\
"

#########################################################################
## ARMV7 Systems
#########################################################################
LIST_ARMV7="		\
	am3517_evm		\
	ca9x4_ct_vxp		\
	devkit8000		\
	igep0020		\
	igep0030		\
	mx51evk			\
	omap3_beagle		\
	omap3_overo		\
	omap3_evm		\
	omap3_pandora		\
	omap3_sdp3430		\
	omap3_zoom1		\
	omap3_zoom2		\
	omap4_panda		\
	omap4_sdp4430		\
	s5p_goni		\
	smdkc100		\
"

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

LIST_at91="			\
	afeb9260		\
	at91cap9adk		\
	at91rm9200dk		\
	at91rm9200ek		\
	at91sam9260ek		\
	at91sam9261ek		\
	at91sam9263ek		\
	at91sam9g10ek		\
	at91sam9g20ek		\
	at91sam9m10g45ek	\
	at91sam9rlek		\
	cmc_pu2			\
	CPUAT91			\
	CPU9260			\
	CPU9G20			\
	csb637			\
	eb_cpux9k2		\
	kb9202			\
	meesc			\
	mp2usb			\
	m501sk			\
	otc570			\
	pm9261			\
	pm9263			\
	pm9g45			\
	SBC35_A9G20		\
	TNY_A9260		\
	TNY_A9G20		\
"

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

LIST_pxa="$(boards_by_cpu pxa)
	polaris		\
	trizepsiv	\
	vpac270_nor	\
	vpac270_onenand	\
"

LIST_ixp="$(boards_by_cpu ixp)
	pdnb3		\
	scpu		\
"

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

LIST_arm="			\
	${LIST_SA}		\
	${LIST_ARM7}		\
	${LIST_ARM9}		\
	${LIST_ARM10}		\
	${LIST_ARM11}		\
	${LIST_ARMV7}	\
	${LIST_at91}		\
	${LIST_pxa}		\
	${LIST_ixp}		\
"

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

LIST_mips4kc="		\
	incaip		\
	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_mips5kc="		\
	purple		\
"

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

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

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

LIST_mips4kc_el=""

LIST_mips5kc_el=""

LIST_au1xx0_el="	\
	dbau1550_el	\
	pb1000		\
"

LIST_mips_el="			\
	${LIST_mips4kc_el}	\
	${LIST_mips5kc_el}	\
	${LIST_au1xx0_el}	\
"

#########################################################################
## i386 Systems
#########################################################################

LIST_x86="$(boards_by_arch i386)
	sc520_eNET	\
"

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

LIST_nios2="$(boards_by_arch nios2)
	nios2-generic	\
"

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

LIST_microblaze="$(boards_by_arch microblaze)"

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

LIST_coldfire="$(boards_by_arch m68k)
	astro_mcf5373l		\
	cobra5272		\
	EB+MCF-EV123		\
	EB+MCF-EV123_internal	\
	M52277EVB		\
	M5235EVB		\
	M5329AFEE		\
	M5373EVB		\
	M54451EVB		\
	M54455EVB		\
	M5475AFE		\
	M5485AFE		\
"

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

LIST_avr32="$(boards_by_arch avr32)"

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

LIST_blackfin="$(boards_by_arch blackfin)
	bf527-ezkit-v2
"

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

LIST_sh2="		\
	rsk7203		\
"
LIST_sh3="		\
	mpr2		\
	ms7720se	\
"

LIST_sh4="		\
	ms7750se	\
	ms7722se	\
	MigoR		\
	r7780mp		\
	r2dplus		\
	sh7763rdp	\
	sh7785lcr	\
	ap325rxa	\
	espt		\
"

LIST_sh="		\
	${LIST_sh2}	\
	${LIST_sh3}	\
	${LIST_sh4}	\
"

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

LIST_sparc="$(boards_by_arch sparc)"

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

build_target() {
	target=$1

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

	${MAKE} ${JOBS} all 2>&1 >${LOG_DIR}/$target.MAKELOG \
				| tee ${LOG_DIR}/$target.ERR

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

	if [ -s ${LOG_DIR}/$target.ERR ] ; then
		ERR_CNT=$((ERR_CNT + 1))
		ERR_LIST="${ERR_LIST} $target"
	else
		rm ${LOG_DIR}/$target.ERR
	fi

	TOTAL_CNT=$((TOTAL_CNT + 1))

	${CROSS_COMPILE}size ${BUILD_DIR}/u-boot \
				| tee -a ${LOG_DIR}/$target.MAKELOG
}
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
			build_target ${t}
		fi
	done
}

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

print_stats() {
	echo ""
	echo "--------------------- SUMMARY ----------------------------"
	echo "Boards compiled: ${TOTAL_CNT}"
	if [ ${ERR_CNT} -gt 0 ] ; then
		echo "Boards with warnings or errors: ${ERR_CNT} (${ERR_LIST} )"
	fi
	echo "----------------------------------------------------------"

	exit $RC
}

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

#----- for now, just run PowerPC by default -----
[ $# = 0 ] && set -- powerpc

build_targets "$@"