mirror of
				https://xff.cz/git/u-boot/
				synced 2025-10-31 18:35:42 +01:00 
			
		
		
		
	All the 74xx_7xx boards are still non-generic boards: P3G4, ZUMA, ppmc7xx, ELPPC, mpc7448hpc2 Acked-by: Marek Vasut <marex@denx.de> Acked-by: Stefan Roese <sr@denx.de> Acked-by: York Sun <yorksun@freescale.com> Signed-off-by: Masahiro Yamada <yamada.m@jp.panasonic.com> Cc: Wolfgang Denk <wd@denx.de> Cc: Nye Liu <nyet@zumanetworks.com> Cc: Roy Zang <tie-fei.zang@freescale.com>
		
			
				
	
	
		
			847 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			847 lines
		
	
	
		
			23 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/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
 | |
| 	  -b BOARD,  --board BOARD     Build all boards with board name BOARD
 | |
| 	  -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:b:lmMCnr"
 | |
| LONG_OPTS="help,arch:,cpu:,vendor:,soc:,board:,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 ;;
 | |
| 	-b|--board)
 | |
| 		# echo "Option BOARD: argument \`$2'"
 | |
| 		if [ "$opt_b" ] ; then
 | |
| 			opt_b="${opt_b%)} || \$6 == \"$2\" || \$7 == \"$2\")"
 | |
| 		else
 | |
| 			# We need to check the 7th field too
 | |
| 			# for boards whose 6th field is "-"
 | |
| 			opt_b="(\$6 == \"$2\" || \$7 == \"$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
 | |
| 
 | |
| GNU_MAKE=$(scripts/show-gnu-make) || {
 | |
| 	echo "GNU Make not found" >&2
 | |
| 	exit 1
 | |
| }
 | |
| 
 | |
| # echo "Remaining arguments:"
 | |
| # for arg do echo '--> '"\`$arg'" ; done
 | |
| 
 | |
| tools/genboardscfg.py || {
 | |
| 	echo "Failed to generate boards.cfg" >&2
 | |
| 	exit 1
 | |
| }
 | |
| 
 | |
| 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"
 | |
| [ "$opt_b" ] && FILTER="${FILTER} && $opt_b"
 | |
| 
 | |
| 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
 | |
| targets_by_field()
 | |
| {
 | |
| 	field=$1
 | |
| 	regexp=$2
 | |
| 
 | |
| 	awk '($1 !~ /^#/ && $'"$field"' ~ /^'"$regexp"'$/) { print $7 }' \
 | |
| 								boards.cfg
 | |
| }
 | |
| 
 | |
| targets_by_arch() { targets_by_field 2 "$@" ; }
 | |
| targets_by_cpu()  { targets_by_field 3 "$@" ; targets_by_field 3 "$@:.*" ; }
 | |
| targets_by_soc()  { targets_by_field 4 "$@" ; }
 | |
| 
 | |
| #########################################################################
 | |
| ## MPC5xx Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_5xx="$(targets_by_cpu mpc5xx)"
 | |
| 
 | |
| #########################################################################
 | |
| ## MPC5xxx Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_5xxx="$(targets_by_cpu mpc5xxx)"
 | |
| 
 | |
| #########################################################################
 | |
| ## MPC512x Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_512x="$(targets_by_cpu mpc512x)"
 | |
| 
 | |
| #########################################################################
 | |
| ## MPC8xx Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_8xx="$(targets_by_cpu mpc8xx)"
 | |
| 
 | |
| #########################################################################
 | |
| ## PPC4xx Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_4xx="$(targets_by_cpu ppc4xx)"
 | |
| 
 | |
| #########################################################################
 | |
| ## MPC8260 Systems (includes 8250, 8255 etc.)
 | |
| #########################################################################
 | |
| 
 | |
| LIST_8260="$(targets_by_cpu mpc8260)"
 | |
| 
 | |
| #########################################################################
 | |
| ## MPC83xx Systems (includes 8349, etc.)
 | |
| #########################################################################
 | |
| 
 | |
| LIST_83xx="$(targets_by_cpu mpc83xx)"
 | |
| 
 | |
| #########################################################################
 | |
| ## MPC85xx Systems (includes 8540, 8560 etc.)
 | |
| #########################################################################
 | |
| 
 | |
| LIST_85xx="$(targets_by_cpu mpc85xx)"
 | |
| 
 | |
| #########################################################################
 | |
| ## MPC86xx Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_86xx="$(targets_by_cpu mpc86xx)"
 | |
| 
 | |
| #########################################################################
 | |
| ## 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}	\
 | |
| "
 | |
| 
 | |
| # Alias "ppc" -> "powerpc" to not break compatibility with older scripts
 | |
| # still using "ppc" instead of "powerpc"
 | |
| LIST_ppc="		\
 | |
| 	${LIST_powerpc}	\
 | |
| "
 | |
| 
 | |
| #########################################################################
 | |
| ## StrongARM Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_SA="$(targets_by_cpu sa1100)"
 | |
| 
 | |
| #########################################################################
 | |
| ## ARM7 Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_ARM7="$(targets_by_cpu arm720t)"
 | |
| 
 | |
| #########################################################################
 | |
| ## ARM9 Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_ARM9="$(targets_by_cpu arm920t)	\
 | |
| 	$(targets_by_cpu arm926ejs)	\
 | |
| 	$(targets_by_cpu arm946es)	\
 | |
| "
 | |
| 
 | |
| #########################################################################
 | |
| ## ARM11 Systems
 | |
| #########################################################################
 | |
| LIST_ARM11="$(targets_by_cpu arm1136)	\
 | |
| 	$(targets_by_cpu arm1176)	\
 | |
| "
 | |
| 
 | |
| #########################################################################
 | |
| ## ARMV7 Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_ARMV7="$(targets_by_cpu armv7)"
 | |
| 
 | |
| #########################################################################
 | |
| ## ARMV8 Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_ARMV8="$(targets_by_cpu armv8)"
 | |
| 
 | |
| #########################################################################
 | |
| ## AT91 Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_at91="$(targets_by_soc at91)"
 | |
| 
 | |
| #########################################################################
 | |
| ## Xscale Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_pxa="$(targets_by_cpu pxa)"
 | |
| 
 | |
| #########################################################################
 | |
| ## SPEAr Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_spear="$(targets_by_soc spear)"
 | |
| 
 | |
| #########################################################################
 | |
| ## ARM groups
 | |
| #########################################################################
 | |
| 
 | |
| LIST_arm="$(targets_by_arch arm |		\
 | |
| 	for ARMV8_TARGET in $LIST_ARMV8;	\
 | |
| 		do sed "/$ARMV8_TARGET/d";	\
 | |
| 	done)					\
 | |
| "
 | |
| 
 | |
| #########################################################################
 | |
| ## MIPS Systems		(default = big endian)
 | |
| #########################################################################
 | |
| 
 | |
| LIST_mips="$(targets_by_arch mips)"
 | |
| 
 | |
| #########################################################################
 | |
| ## OpenRISC Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_openrisc="$(targets_by_arch openrisc)"
 | |
| 
 | |
| #########################################################################
 | |
| ## x86 Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_x86="$(targets_by_arch x86)"
 | |
| 
 | |
| #########################################################################
 | |
| ## Nios-II Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_nios2="$(targets_by_arch nios2)"
 | |
| 
 | |
| #########################################################################
 | |
| ## MicroBlaze Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_microblaze="$(targets_by_arch microblaze)"
 | |
| 
 | |
| #########################################################################
 | |
| ## ColdFire Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_m68k="$(targets_by_arch m68k)"
 | |
| LIST_coldfire=${LIST_m68k}
 | |
| 
 | |
| #########################################################################
 | |
| ## AVR32 Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_avr32="$(targets_by_arch avr32)"
 | |
| 
 | |
| #########################################################################
 | |
| ## Blackfin Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_blackfin="$(targets_by_arch blackfin)"
 | |
| 
 | |
| #########################################################################
 | |
| ## SH Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_sh2="$(targets_by_cpu sh2)"
 | |
| LIST_sh3="$(targets_by_cpu sh3)"
 | |
| LIST_sh4="$(targets_by_cpu sh4)"
 | |
| 
 | |
| LIST_sh="$(targets_by_arch sh)"
 | |
| 
 | |
| #########################################################################
 | |
| ## SPARC Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_sparc="$(targets_by_arch sparc)"
 | |
| 
 | |
| #########################################################################
 | |
| ## NDS32 Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_nds32="$(targets_by_arch nds32)"
 | |
| 
 | |
| #########################################################################
 | |
| ## ARC Systems
 | |
| #########################################################################
 | |
| 
 | |
| LIST_arc="$(targets_by_arch arc)"
 | |
| 
 | |
| #-----------------------------------------------------------------------
 | |
| 
 | |
| get_target_location() {
 | |
| 	local target=$1
 | |
| 	local BOARD_NAME=""
 | |
| 	local CONFIG_NAME=""
 | |
| 	local board=""
 | |
| 	local vendor=""
 | |
| 
 | |
| 	# Automatic mode
 | |
| 	local line=`awk '\$7 == "'"$target"'" { print \$0 }' boards.cfg`
 | |
| 	if [ -z "${line}" ] ; then echo "" ; return ; fi
 | |
| 
 | |
| 	set ${line}
 | |
| 
 | |
| 	CONFIG_NAME="${7%_defconfig}"
 | |
| 
 | |
| 	[ "${BOARD_NAME}" ] || BOARD_NAME="${7%_defconfig}"
 | |
| 
 | |
| 	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 '\$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=`awk '\$7 == "'"$target"'" { print \$0 }' 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
 | |
| 
 | |
| 	target_arch=$(get_target_arch ${target})
 | |
| 	eval cross_toolchain=\$CROSS_COMPILE_`echo $target_arch | tr '[:lower:]' '[:upper:]'`
 | |
| 	if [ "${cross_toolchain}" ] ; then
 | |
| 	    MAKE="$GNU_MAKE CROSS_COMPILE=${cross_toolchain}"
 | |
| 	elif [ "${CROSS_COMPILE}" ] ; then
 | |
| 	    MAKE="$GNU_MAKE CROSS_COMPILE=${CROSS_COMPILE}"
 | |
| 	else
 | |
| 	    MAKE=$GNU_MAKE
 | |
| 	fi
 | |
| 
 | |
| 	if [  "${output_dir}" != "." ] ; then
 | |
| 		MAKE="${MAKE} O=${output_dir}"
 | |
| 	fi
 | |
| 
 | |
| 	${MAKE} mrproper >/dev/null
 | |
| 
 | |
| 	echo "Building ${target} board..."
 | |
| 	${MAKE} -s ${target}_defconfig >/dev/null
 | |
| 
 | |
| 	${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 clean
 | |
| 
 | |
| 		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
 |