diff options
Diffstat (limited to 'util/scripts/testsoc')
-rwxr-xr-x | util/scripts/testsoc | 180 |
1 files changed, 180 insertions, 0 deletions
diff --git a/util/scripts/testsoc b/util/scripts/testsoc new file mode 100755 index 0000000000..bf23e6640d --- /dev/null +++ b/util/scripts/testsoc @@ -0,0 +1,180 @@ +#!/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 "$@" |