blob: c093042301b0d102d1386fa663fac53bec037de9 [file] [log] [blame]
Martin Roth815c3632022-10-28 21:30:31 -06001#!/bin/bash
2set -e -o pipefail
3
4PROGNAME="$(basename "${0}")"
5VERSION="1.00"
6
7ABUILD="./util/abuild/abuild"
8OUTPUT="coreboot-builds"
9MAINBOARDS=()
10UNSORTED=()
11CPUS=$(nproc || echo "4")
12NO_CROS=0
13
Martin Roth4bd23252023-02-03 13:10:11 -070014# Extra arguments to pass to abuild
15ABUILD_ARGS=""
16
Martin Roth815c3632022-10-28 21:30:31 -060017# Text STYLE variables
18BOLD="\033[1m"
19RED='\033[38;5;9m'
20GREEN='\033[38;5;2m'
21NO_COLOR='\033[0m'
22
23usage() {
24 cat <<EOF
25The ${PROGNAME} script helps select boards to run test builds on. It searches
26through all of the mainboard Kconfig files for specified identifiers and then
27runs abuild on the mainboards it finds.
28
29 Usage: ${PROGNAME} [options]
30
31Options:
Martin Roth4bd23252023-02-03 13:10:11 -070032 -a | --abuild "<text>" Specify options to pass to abuild
Martin Roth815c3632022-10-28 21:30:31 -060033 -C | --cpus <num> Specify number of CPUs to use (currently ${CPUS})
34 -K | --kconfig <CONFIG> Search for Kconfig option
35 -n | --no_cros Don't run chromeos builds
36 -h | --help Print usage and exit
37 -D | --debug Print debug information. Use -DD to show all commands
38 -V | --version Print the version and exit
39 --nocolor Don't print color codes
40EOF
41}
42
43_echo_color() {
44 local color="$1"
45 local text="$2"
46 local newline="${3:-0}"
47 if [[ ${newline} == "0" ]]; then
48 printf "${color}%s${NO_COLOR}" "${text}"
49 else
50 printf "${color}%s${NO_COLOR}\n" "${text}"
51 fi
52}
53
54_echo_error() {
55 _echo_color "${RED}" "$*" 1 >&2
56}
57
58show_version() {
59 echo
60 _echo_color "${BOLD}${GREEN}" "${PROGNAME} version ${VERSION}"
61 echo
62}
63
64get_real_dir() (
65 cd -- "$1" >/dev/null 2>&1 || exit 1
66 pwd -P
67)
68
69get_args() {
70 local mblist
71 local mainboards=()
72
Martin Roth4bd23252023-02-03 13:10:11 -070073 if ! args="$(getopt -l version,help,debug,nocolor,kconfig:,cpus:,no_cros,abuild: -o a:C:K:nDhV -- "$@")"; then
Martin Roth815c3632022-10-28 21:30:31 -060074 usage
75 exit 1
76 fi
77
78 eval set -- "${args}"
79
80 while true; do
81 case "$1" in
Martin Roth4bd23252023-02-03 13:10:11 -070082 -a | --abuild)
83 shift
84 ABUILD_ARGS=$1
85 ;;
Martin Roth815c3632022-10-28 21:30:31 -060086 -C | --cpus)
87 shift
88 CPUS=$1
89 ;;
90 -K | --kconfig)
91 shift
Fred Reitbergerabce4292023-02-01 08:33:43 -050092 mblist=$(grep -r "$1" src/mainboard | grep Kconfig | sed 's|src/mainboard/||;s|/Kconfig.*||')
Martin Roth815c3632022-10-28 21:30:31 -060093 printf "Adding mainboard for %s\n%s\n" "$1" "${mblist}"
94 echo
95 mapfile -t mainboards <<<"$mblist"
96 UNSORTED+=(${mainboards[@]})
97 ;;
98 -n | no_cros)
99 NO_CROS=1
100 ;;
101 -D | --debug)
102 if [ -n "${VERBOSE}" ]; then
103 set -x
104 else
105 VERBOSE="V=1"
106 fi
107 ;;
108 -h | --help)
109 usage
110 exit 0
111 ;;
112 --nocolor)
113 BOLD=""
114 RED=""
115 GREEN=""
116 NO_COLOR=""
117 ;;
118 -V | --version) exit 0 ;;
119 --)
120 shift
121 break
122 ;;
123 *)
124 _echo_error "Unknown argument '$1'"
125 usage
126 exit 1
127 ;;
128 esac
129 shift
130 done
131
132 if [[ -n $1 ]]; then
133 _echo_error "Unknown command '$1'"
134 echo
135 usage
136 exit 1
137 fi
138}
139
140main() {
141 show_version
142 get_args "$@"
143
144 if [[ ! -f "MAINTAINERS" ]]; then
145 echo "${PWD}"
146 _echo_error "Error: This doesn't look like the coreboot directory."
147 exit 1
148 fi
149
150 # Sort and dedupe list
151 mapfile -t MAINBOARDS <<<"$(printf "%s\n" "${UNSORTED[@]}" | sort -u)"
152
153 if [[ "${#MAINBOARDS[@]}" != "0" ]]; then
154 echo "Using ${CPUS} CPUs to build ${#MAINBOARDS[@]} boards:"
155 printf "%s\n" "${MAINBOARDS[@]}"
156 echo
157 else
158 _echo_error "Error: No mainboards found/specified."
159 exit 1
160 fi
161
162 for board in ${MAINBOARDS[*]}; do
163 rm -rf "./${OUTPUT}"
164
165 # Non-CrOS build
Martin Roth4bd23252023-02-03 13:10:11 -0700166 if ! "${ABUILD}" --exitcode --cpus ${CPUS} --target "${board}" ${ABUILD_ARGS}; then
Martin Roth815c3632022-10-28 21:30:31 -0600167 _echo_error "Error: Non-cros build of ${board} failed."
168 exit 1
169 fi
170
171 # CrOS build
172 if [[ ${NO_CROS} -eq 0 ]]; then
173 rm -rf "./${OUTPUT}"
Martin Roth4bd23252023-02-03 13:10:11 -0700174 if ! "${ABUILD}" --exitcode --cpus ${CPUS} --target "${board}" --chromeos ${ABUILD_ARGS}; then
Martin Roth815c3632022-10-28 21:30:31 -0600175 _echo_error "Error: CrOS build of ${board} failed."
176 exit 1
177 fi
178 fi
179
180 done
181
182 echo
183 echo "Successfully built all boards:"
184 printf "%s\n" "${MAINBOARDS[@]}"
185
186}
187
188main "$@"