#!/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

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

LIST_5xx="		\
	cmi_mpc5xx	\
"

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

LIST_5xxx="		\
	BC3450		\
	cm5200		\
	cpci5200	\
	digsy_mtc	\
	EVAL5200	\
	fo300		\
	galaxy5200	\
	icecube_5200	\
	inka4x0		\
	ipek01		\
	lite5200b	\
	mcc200		\
	mecp5200	\
	motionpro	\
	munices		\
	MVBC_P		\
	MVSMR		\
	o2dnt		\
	pcm030		\
	pf5200		\
	PM520		\
	TB5200		\
	Total5200	\
	Total5200_Rev2	\
	TQM5200		\
	TQM5200_B	\
	TQM5200S	\
	v38b		\
"

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

LIST_512x="		\
	aria		\
	mecp5123	\
	mpc5121ads	\
"

#########################################################################
## MPC8xx Systems
#########################################################################
LIST_8xx="		\
	Adder87x	\
	AdderII		\
	ADS860		\
	AMX860		\
	c2mon		\
	CCM		\
	cogent_mpc8xx	\
	ELPT860		\
	EP88x		\
	ESTEEM192E	\
	ETX094		\
	FADS823		\
	FADS850SAR	\
	FADS860T	\
	FLAGADM		\
	FPS850L		\
	GEN860T		\
	GEN860T_SC	\
	GENIETV		\
	GTH		\
	hermes		\
	IAD210		\
	ICU862_100MHz	\
	IP860		\
	IVML24		\
	IVML24_128	\
	IVML24_256	\
	IVMS8		\
	IVMS8_128	\
	IVMS8_256	\
	KUP4K		\
	KUP4X		\
	LANTEC		\
	lwmon		\
	kmsupx4		\
	MBX		\
	MBX860T		\
	mgsuvd		\
	MHPC		\
	MPC86xADS	\
	MPC885ADS	\
	NETPHONE	\
	NETTA		\
	NETTA2		\
	NETTA_ISDN	\
	NETVIA		\
	NETVIA_V2	\
	NX823		\
	pcu_e		\
	QS823		\
	QS850		\
	QS860T		\
	quantum		\
	R360MPI		\
	RBC823		\
	rmu		\
	RPXClassic	\
	RPXlite		\
	RPXlite_DW	\
	RRvision	\
	SM850		\
	spc1920		\
	SPD823TS	\
	svm_sc8xx	\
	SXNI855T	\
	TK885D		\
	TOP860		\
	TQM823L		\
	TQM823L_LCD	\
	TQM850L		\
	TQM855L		\
	TQM860L		\
	TQM885D		\
	uc100		\
	v37		\
"

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

LIST_4xx="		\
	acadia		\
	acadia_nand	\
	ADCIOP		\
	alpr		\
	AP1000		\
	AR405		\
	arches		\
	ASH405		\
	bamboo		\
	bamboo_nand	\
	bubinga		\
	CANBT		\
	canyonlands	\
	canyonlands_nand \
	CMS700		\
	CPCI2DP		\
	CPCI405		\
	CPCI4052	\
	CPCI405AB	\
	CPCI405DT	\
	CPCIISER4	\
	CRAYL1		\
	csb272		\
	csb472		\
	DASA_SIM	\
	devconcenter	\
	dlvision	\
	DP405		\
	DU405		\
	DU440		\
	ebony		\
	ERIC		\
	fx12mm		\
	G2000		\
	gdppc440etx	\
	glacier		\
	haleakala	\
	haleakala_nand	\
	hcu4		\
	hcu5		\
	HH405		\
	HUB405		\
	intip		\
	JSE		\
	KAREF		\
	katmai		\
	kilauea		\
	kilauea_nand	\
	korat		\
	luan		\
	lwmon5		\
	makalu		\
	mcu25		\
	METROBOX	\
	MIP405		\
	MIP405T		\
	ML2		\
	ml507		\
	ml507_flash	\
	neo		\
	ocotea		\
	OCRTC		\
	ORSG		\
	p3p440		\
	PCI405		\
	pcs440ep	\
	PIP405		\
	PLU405		\
	PMC405		\
	PMC405DE	\
	PMC440		\
	PPChameleonEVB	\
	quad100hd	\
	rainier		\
	redwood		\
	sbc405		\
	sc3		\
	sequoia		\
	sequoia_nand	\
	taihu		\
	taishan		\
	v5fx30teval	\
	v5fx30teval_flash \
	VOH405		\
	VOM405		\
	W7OLMC		\
	W7OLMG		\
	walnut		\
	WUH405		\
	xilinx-ppc440-generic \
	xilinx-ppc440-generic_flash \
	XPEDITE1000	\
	yellowstone	\
	yosemite	\
	yucca		\
	zeus		\
"

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

LIST_8220="		\
	Alaska8220	\
	Yukon8220	\
"

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

LIST_824x="		\
	A3000		\
	barco		\
	BMW		\
	CPC45		\
	CU824		\
	debris		\
	eXalion		\
	HIDDEN_DRAGON	\
	IDS8247		\
	linkstation_HGLAN	\
	MOUSSE		\
	MUSENKI		\
	MVBLUE		\
	OXC		\
	PN62		\
	Sandpoint8240	\
	Sandpoint8245	\
	sbc8240		\
	utx8245		\
"

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

LIST_8260="		\
	atc		\
	cogent_mpc8260	\
	CPU86		\
	CPU87		\
	ep8248		\
	ep8260		\
	ep82xxm		\
	gw8260		\
	hymod		\
	IPHASE4539	\
	ISPAN		\
	mgcoge		\
	MPC8260ADS	\
	MPC8266ADS	\
	MPC8272ADS	\
	PM826		\
	PM828		\
	ppmc8260	\
	Rattler8248	\
	RPXsuper	\
	rsdproto	\
	sacsng		\
	sbc8260		\
	SCM		\
	TQM8260_AC	\
	TQM8260_AD	\
	TQM8260_AE	\
	TQM8272		\
	ZPC1900		\
"

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

LIST_83xx="		\
	caddy2		\
	kmeter1		\
	MPC8313ERDB_33	\
	MPC8313ERDB_NAND_66	\
	MPC8315ERDB	\
	MPC8315ERDB_NAND	\
	MPC8323ERDB	\
	MPC832XEMDS	\
	MPC832XEMDS_ATM	\
	MPC8349EMDS	\
	MPC8349ITX	\
	MPC8349ITXGP	\
	MPC8360EMDS	\
	MPC8360EMDS_ATM	\
	MPC8360ERDK_33	\
	MPC8360ERDK_66	\
	MPC837XEMDS	\
	MPC837XERDB	\
	MVBLM7		\
	sbc8349		\
	SIMPC8313_LP	\
	TQM834x		\
	vme8349		\
"


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

LIST_85xx="		\
	ATUM8548	\
	MPC8536DS	\
	MPC8536DS_NAND	\
	MPC8536DS_SDCARD	\
	MPC8536DS_SPIFLASH	\
	MPC8540ADS	\
	MPC8540EVAL	\
	MPC8541CDS	\
	MPC8544DS	\
	MPC8548CDS	\
	MPC8555CDS	\
	MPC8560ADS	\
	MPC8568MDS	\
	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	\
	PM854		\
	PM856		\
	sbc8540		\
	sbc8548		\
	sbc8548_PCI_33	\
	sbc8548_PCI_66	\
	sbc8548_PCI_33_PCIE \
	sbc8548_PCI_66_PCIE \
	sbc8560		\
	socrates	\
	stxgp3		\
	stxssa		\
	TQM8540		\
	TQM8541		\
	TQM8548		\
	TQM8548_AG	\
	TQM8548_BE	\
	TQM8555		\
	TQM8560		\
	XPEDITE5200	\
	XPEDITE5370	\
"

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

LIST_86xx="		\
	MPC8610HPCD	\
	MPC8641HPCN	\
	sbc8641d	\
	XPEDITE5170	\
"

#########################################################################
## 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="		\
	assabet		\
	dnp1110		\
	gcplus		\
	lart		\
	shannon		\
"

#########################################################################
## 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		\
	edb9301			\
	edb9302			\
	edb9302a		\
	edb9307			\
	edb9307a		\
	edb9312			\
	edb9315			\
	edb9315a		\
	imx27lite		\
	lpd7a400		\
	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		\
"

#########################################################################
## ARM Cortex-A8 Systems
#########################################################################
LIST_ARM_CORTEX_A8="		\
	devkit8000		\
	mx51evk			\
	omap3_beagle		\
	omap3_overo		\
	omap3_evm		\
	omap3_pandora		\
	omap3_sdp3430		\
	omap3_zoom1		\
	omap3_zoom2		\
	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			\
	SBC35_A9G20		\
	TNY_A9260		\
	TNY_A9G20		\
"

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

LIST_pxa="		\
	cerf250		\
	cradle		\
	csb226		\
	delta		\
	innokom		\
	lubbock		\
	pleb2		\
	polaris		\
	pxa255_idp	\
	trizepsiv	\
	wepep250	\
	xaeniax		\
	xm250		\
	xsengine	\
	zylonite	\
"

LIST_ixp="		\
	actux1		\
	actux2		\
	actux3		\
	actux4		\
	ixdp425		\
	ixdpg425	\
	pdnb3		\
	scpu		\
"

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

LIST_arm="			\
	${LIST_SA}		\
	${LIST_ARM7}		\
	${LIST_ARM9}		\
	${LIST_ARM10}		\
	${LIST_ARM11}		\
	${LIST_ARM_CORTEX_A8}	\
	${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_I486="		\
	sc520_cdp	\
	sc520_eNET	\
	sc520_spunk	\
	sc520_spunk_rel	\
"

LIST_x86="		\
	${LIST_I486}	\
"

#########################################################################
## NIOS Systems
#########################################################################

LIST_nios="			\
	ADNPESC1		\
	ADNPESC1_base_32	\
	ADNPESC1_DNPEVA2_base_32\
	DK1C20			\
	DK1C20_standard_32	\
	DK1S10			\
	DK1S10_standard_32	\
	DK1S10_mtx_ldk_20	\
"

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

LIST_nios2="		\
	EP1C20		\
	EP1S10		\
	EP1S40		\
	PCI5441		\
	PK1C20		\
"

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

LIST_microblaze="			\
	microblaze-generic		\
"

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

LIST_coldfire="			\
	astro_mcf5373l		\
	cobra5272		\
	EB+MCF-EV123		\
	EB+MCF-EV123_internal	\
	idmr			\
	M5208EVBE		\
	M52277EVB		\
	M5235EVB		\
	M5249EVB		\
	M5253DEMO		\
	M5253EVBE		\
	M5271EVB		\
	M5272C3			\
	M5275EVB		\
	M5282EVB		\
	M53017EVB		\
	M5329AFEE		\
	M5373EVB		\
	M54451EVB		\
	M54455EVB		\
	M5475AFE		\
	M5485AFE		\
	TASREG			\
"

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

LIST_avr32="		\
	atstk1002	\
	atstk1003	\
	atstk1004	\
	atstk1006	\
	atngw100	\
	favr-32-ezkit	\
	hammerhead	\
	mimc200		\
"

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

LIST_blackfin="		\
	bf518f-ezbrd	\
	bf526-ezbrd	\
	bf527-ezkit	\
	bf527-ezkit-v2	\
	bf533-ezkit	\
	bf533-stamp	\
	bf537-minotaur	\
	bf537-pnav	\
	bf537-srv1	\
	bf537-stamp	\
	bf538f-ezkit	\
	bf548-ezkit	\
	bf561-acvilon	\
	bf561-ezkit	\
	blackstamp	\
	cm-bf527	\
	cm-bf533	\
	cm-bf537e	\
	cm-bf537u	\
	cm-bf548	\
	cm-bf561	\
	ibf-dsp561	\
	ip04		\
	tcm-bf518	\
	tcm-bf537	\
"

#########################################################################
## 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="gr_xc3s_1500	gr_cpci_ax2000	gr_ep2s60	grsim	grsim_leon2"

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

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

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

build_target() {
	target=$1

	${MAKE} distclean >/dev/null
	${MAKE} ${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
}

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

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 arg in $@
do
	case "$arg" in
	arm|SA|ARM7|ARM9|ARM10|ARM11|ARM_CORTEX_A8|at91|ixp|pxa \
	|avr32 \
	|blackfin \
	|coldfire \
	|microblaze \
	|mips|mips_el \
	|nios|nios2 \
	|ppc|powerpc|5xx|5xxx|512x|8xx|8220|824x|8260|83xx|85xx|86xx|4xx|7xx|74xx|TSEC \
	|sh|sh2|sh3|sh4 \
	|sparc \
	|x86|I486 \
	)
			for target in `eval echo '$LIST_'${arg}`
			do
				build_target ${target}
			done
			;;
	*)		build_target ${arg}
			;;
	esac
done