This finds all the boards using a specified Kconfig option and runs both CrOS and non-CrOS abuilds on them to make sure they're working. Nobody wants to run the full what-jenkins-does build on their host machine. Hopefully this can help get some tests run locally before pushing to coreboot.org. Signed-off-by: Martin Roth <gaumless@gmail.com> Change-Id: Ifc71c28bf64a805f203a815a9468ff9fe882aad3 Reviewed-on: https://review.coreboot.org/c/coreboot/+/68956 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Elyes Haouas <ehaouas@noos.fr>
		
			
				
	
	
		
			181 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			3.4 KiB
		
	
	
	
		
			Bash
		
	
	
		
			Executable File
		
	
	
	
	
| #!/bin/bash
 | |
| set -e -o pipefail
 | |
| 
 | |
| PROGNAME="$(basename "${0}")"
 | |
| VERSION="1.00"
 | |
| 
 | |
| ABUILD="./util/abuild/abuild"
 | |
| OUTPUT="coreboot-builds"
 | |
| MAINBOARDS=()
 | |
| UNSORTED=()
 | |
| CPUS=$(nproc || echo "4")
 | |
| NO_CROS=0
 | |
| 
 | |
| # Text STYLE variables
 | |
| BOLD="\033[1m"
 | |
| RED='\033[38;5;9m'
 | |
| GREEN='\033[38;5;2m'
 | |
| NO_COLOR='\033[0m'
 | |
| 
 | |
| usage() {
 | |
| 	cat <<EOF
 | |
| The ${PROGNAME} script helps select boards to run test builds on.  It searches
 | |
| through all of the mainboard Kconfig files for specified identifiers and then
 | |
| runs abuild on the mainboards it finds.
 | |
| 
 | |
|   Usage: ${PROGNAME} [options]
 | |
| 
 | |
| Options:
 | |
|  -C | --cpus <num>       Specify number of CPUs to use (currently ${CPUS})
 | |
|  -K | --kconfig <CONFIG> Search for Kconfig option
 | |
|  -n | --no_cros	         Don't run chromeos builds
 | |
|  -h | --help             Print usage and exit
 | |
|  -D | --debug            Print debug information.  Use -DD to show all commands
 | |
|  -V | --version          Print the version and exit
 | |
|       --nocolor          Don't print color codes
 | |
| EOF
 | |
| }
 | |
| 
 | |
| _echo_color() {
 | |
| 	local color="$1"
 | |
| 	local text="$2"
 | |
| 	local newline="${3:-0}"
 | |
| 	if [[ ${newline} == "0" ]]; then
 | |
| 		printf "${color}%s${NO_COLOR}" "${text}"
 | |
| 	else
 | |
| 		printf "${color}%s${NO_COLOR}\n" "${text}"
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| _echo_error() {
 | |
| 	_echo_color "${RED}" "$*" 1 >&2
 | |
| }
 | |
| 
 | |
| show_version() {
 | |
| 	echo
 | |
| 	_echo_color "${BOLD}${GREEN}" "${PROGNAME} version ${VERSION}"
 | |
| 	echo
 | |
| }
 | |
| 
 | |
| get_real_dir() (
 | |
| 	cd -- "$1" >/dev/null 2>&1 || exit 1
 | |
| 	pwd -P
 | |
| )
 | |
| 
 | |
| get_args() {
 | |
| 	local mblist
 | |
| 	local mainboards=()
 | |
| 
 | |
| 	if ! args="$(getopt -l version,help,debug,nocolor,kconfig:,cpus:,no_cros -o C:K:nDhV -- "$@")"; then
 | |
| 		usage
 | |
| 		exit 1
 | |
| 	fi
 | |
| 
 | |
| 	eval set -- "${args}"
 | |
| 
 | |
| 	while true; do
 | |
| 		case "$1" in
 | |
| 		-C | --cpus)
 | |
| 			shift
 | |
| 			CPUS=$1
 | |
| 			;;
 | |
| 		-K | --kconfig)
 | |
| 			shift
 | |
| 			mblist=$(grep -r "$1" src/mainboard | sed 's|src/mainboard/||;s|/Kconfig.*||')
 | |
| 			printf "Adding mainboard for %s\n%s\n" "$1" "${mblist}"
 | |
| 			echo
 | |
| 			mapfile -t mainboards <<<"$mblist"
 | |
| 			UNSORTED+=(${mainboards[@]})
 | |
| 			;;
 | |
| 		-n | no_cros)
 | |
| 			NO_CROS=1
 | |
| 			;;
 | |
| 		-D | --debug)
 | |
| 			if [ -n "${VERBOSE}" ]; then
 | |
| 				set -x
 | |
| 			else
 | |
| 				VERBOSE="V=1"
 | |
| 			fi
 | |
| 			;;
 | |
| 		-h | --help)
 | |
| 			usage
 | |
| 			exit 0
 | |
| 			;;
 | |
| 		--nocolor)
 | |
| 			BOLD=""
 | |
| 			RED=""
 | |
| 			GREEN=""
 | |
| 			NO_COLOR=""
 | |
| 			;;
 | |
| 		-V | --version) exit 0 ;;
 | |
| 		--)
 | |
| 			shift
 | |
| 			break
 | |
| 			;;
 | |
| 		*)
 | |
| 			_echo_error "Unknown argument '$1'"
 | |
| 			usage
 | |
| 			exit 1
 | |
| 			;;
 | |
| 		esac
 | |
| 		shift
 | |
| 	done
 | |
| 
 | |
| 	if [[ -n $1 ]]; then
 | |
| 		_echo_error "Unknown command '$1'"
 | |
| 		echo
 | |
| 		usage
 | |
| 		exit 1
 | |
| 	fi
 | |
| }
 | |
| 
 | |
| main() {
 | |
| 	show_version
 | |
| 	get_args "$@"
 | |
| 
 | |
| 	if [[ ! -f "MAINTAINERS" ]]; then
 | |
| 		echo "${PWD}"
 | |
| 		_echo_error "Error: This doesn't look like the coreboot directory."
 | |
| 		exit 1
 | |
| 	fi
 | |
| 
 | |
| 	# Sort and dedupe list
 | |
| 	mapfile -t MAINBOARDS <<<"$(printf "%s\n" "${UNSORTED[@]}" | sort -u)"
 | |
| 
 | |
| 	if [[ "${#MAINBOARDS[@]}" != "0" ]]; then
 | |
| 		echo "Using ${CPUS} CPUs to build ${#MAINBOARDS[@]} boards:"
 | |
| 		printf "%s\n" "${MAINBOARDS[@]}"
 | |
| 		echo
 | |
| 	else
 | |
| 		_echo_error "Error: No mainboards found/specified."
 | |
| 		exit 1
 | |
| 	fi
 | |
| 
 | |
| 	for board in ${MAINBOARDS[*]}; do
 | |
| 		rm -rf "./${OUTPUT}"
 | |
| 
 | |
| 		# Non-CrOS build
 | |
| 		if ! "${ABUILD}" --exitcode --cpus ${CPUS} --target "${board}"; then
 | |
| 			_echo_error "Error: Non-cros build of ${board} failed."
 | |
| 			exit 1
 | |
| 		fi
 | |
| 
 | |
| 		# CrOS build
 | |
| 		if [[ ${NO_CROS} -eq 0 ]]; then
 | |
| 			rm -rf "./${OUTPUT}"
 | |
| 			if ! "${ABUILD}" --exitcode --cpus ${CPUS} --target "${board}" --chromeos; then
 | |
| 				_echo_error "Error: CrOS build of ${board} failed."
 | |
| 				exit 1
 | |
| 			fi
 | |
| 		fi
 | |
| 
 | |
| 	done
 | |
| 
 | |
| 	echo
 | |
| 	echo "Successfully built all boards:"
 | |
| 	printf "%s\n" "${MAINBOARDS[@]}"
 | |
| 
 | |
| }
 | |
| 
 | |
| main "$@"
 |