| #!/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 "$@" |