#!/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 # Extra arguments to pass to abuild ABUILD_ARGS="" # 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: -a | --abuild "<text>" Specify options to pass to abuild -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,abuild: -o a:C:K:nDhV -- "$@")"; then usage exit 1 fi eval set -- "${args}" while true; do case "$1" in -a | --abuild) shift ABUILD_ARGS=$1 ;; -C | --cpus) shift CPUS=$1 ;; -K | --kconfig) shift mblist=$(grep -r "$1" src/mainboard | grep Kconfig | 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}" ${ABUILD_ARGS}; 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 ${ABUILD_ARGS}; 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 "$@"