Buildman has been around for 3 years now. It has had a lot of use and testing. Perhaps it is time to remove MAKEALL. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Tom Rini <trini@konsulko.com>master
parent
c8d7393b73
commit
c8a3777c51
@ -1,850 +0,0 @@ |
||||
#!/bin/bash |
||||
# Tool mainly for U-Boot Quality Assurance: build one or more board |
||||
# configurations with minimal verbosity, showing only warnings and |
||||
# errors. |
||||
# |
||||
# SPDX-License-Identifier: GPL-2.0+ |
||||
|
||||
usage() |
||||
{ |
||||
# if exiting with 0, write to stdout, else write to stderr |
||||
local ret=${1:-0} |
||||
[ "${ret}" -eq 1 ] && exec 1>&2 |
||||
cat <<-EOF |
||||
Usage: MAKEALL [options] [--] [boards-to-build] |
||||
|
||||
Options: |
||||
-a ARCH, --arch ARCH Build all boards with arch ARCH |
||||
-c CPU, --cpu CPU Build all boards with cpu CPU |
||||
-v VENDOR, --vendor VENDOR Build all boards with vendor VENDOR |
||||
-s SOC, --soc SOC Build all boards with soc SOC |
||||
-b BOARD, --board BOARD Build all boards with board name BOARD |
||||
-l, --list List all targets to be built |
||||
-m, --maintainers List all targets and maintainer email |
||||
-M, --mails List all targets and all affilated emails |
||||
-C, --check Enable build checking |
||||
-n, --continue Continue (skip boards already built) |
||||
-r, --rebuild-errors Rebuild any boards that errored |
||||
-h, --help This help output |
||||
|
||||
Selections by these options are logically ANDed; if the same option |
||||
is used repeatedly, such selections are ORed. So "-v FOO -v BAR" |
||||
will select all configurations where the vendor is either FOO or |
||||
BAR. Any additional arguments specified on the command line are |
||||
always build additionally. See the boards.cfg file for more info. |
||||
|
||||
If no boards are specified, then the default is "powerpc". |
||||
|
||||
Environment variables: |
||||
BUILD_NCPUS number of parallel make jobs (default: auto) |
||||
CROSS_COMPILE cross-compiler toolchain prefix (default: "") |
||||
CROSS_COMPILE_<ARCH> cross-compiler toolchain prefix for |
||||
architecture "ARCH". Substitute "ARCH" for any |
||||
supported architecture (default: "") |
||||
MAKEALL_LOGDIR output all logs to here (default: ./LOG/) |
||||
BUILD_DIR output build directory (default: ./) |
||||
BUILD_NBUILDS number of parallel targets (default: 1) |
||||
|
||||
Examples: |
||||
- build all Power Architecture boards: |
||||
MAKEALL -a powerpc |
||||
MAKEALL --arch powerpc |
||||
MAKEALL powerpc |
||||
- build all PowerPC boards manufactured by vendor "esd": |
||||
MAKEALL -a powerpc -v esd |
||||
- build all PowerPC boards manufactured either by "keymile" or "siemens": |
||||
MAKEALL -a powerpc -v keymile -v siemens |
||||
- build all Freescale boards with MPC83xx CPUs, plus all 4xx boards: |
||||
MAKEALL -c mpc83xx -v freescale 4xx |
||||
EOF |
||||
exit ${ret} |
||||
} |
||||
|
||||
deprecation() { |
||||
echo "** Note: MAKEALL is deprecated - please use buildman instead" |
||||
echo "** See tools/buildman/README for details" |
||||
echo |
||||
} |
||||
|
||||
deprecation |
||||
|
||||
SHORT_OPTS="ha:c:v:s:b:lmMCnr" |
||||
LONG_OPTS="help,arch:,cpu:,vendor:,soc:,board:,list,maintainers,mails,check,continue,rebuild-errors" |
||||
|
||||
# Option processing based on util-linux-2.13/getopt-parse.bash |
||||
|
||||
# Note that we use `"$@"' to let each command-line parameter expand to a |
||||
# separate word. The quotes around `$@' are essential! |
||||
# We need TEMP as the `eval set --' would nuke the return value of |
||||
# getopt. |
||||
TEMP=`getopt -o ${SHORT_OPTS} --long ${LONG_OPTS} \ |
||||
-n 'MAKEALL' -- "$@"` |
||||
|
||||
[ $? != 0 ] && usage 1 |
||||
|
||||
# Note the quotes around `$TEMP': they are essential! |
||||
eval set -- "$TEMP" |
||||
|
||||
SELECTED='' |
||||
ONLY_LIST='' |
||||
PRINT_MAINTS='' |
||||
MAINTAINERS_ONLY='' |
||||
CONTINUE='' |
||||
REBUILD_ERRORS='' |
||||
|
||||
while true ; do |
||||
case "$1" in |
||||
-a|--arch) |
||||
# echo "Option ARCH: argument \`$2'" |
||||
if [ "$opt_a" ] ; then |
||||
opt_a="${opt_a%)} || \$2 == \"$2\")" |
||||
else |
||||
opt_a="(\$2 == \"$2\")" |
||||
fi |
||||
SELECTED='y' |
||||
shift 2 ;; |
||||
-c|--cpu) |
||||
# echo "Option CPU: argument \`$2'" |
||||
if [ "$opt_c" ] ; then |
||||
opt_c="${opt_c%)} || \$3 == \"$2\" || \$3 ~ /$2:/)" |
||||
else |
||||
opt_c="(\$3 == \"$2\" || \$3 ~ /$2:/)" |
||||
fi |
||||
SELECTED='y' |
||||
shift 2 ;; |
||||
-s|--soc) |
||||
# echo "Option SoC: argument \`$2'" |
||||
if [ "$opt_s" ] ; then |
||||
opt_s="${opt_s%)} || \$4 == \"$2\" || \$4 ~ /$2/)" |
||||
else |
||||
opt_s="(\$4 == \"$2\" || \$4 ~ /$2/)" |
||||
fi |
||||
SELECTED='y' |
||||
shift 2 ;; |
||||
-v|--vendor) |
||||
# echo "Option VENDOR: argument \`$2'" |
||||
if [ "$opt_v" ] ; then |
||||
opt_v="${opt_v%)} || \$5 == \"$2\")" |
||||
else |
||||
opt_v="(\$5 == \"$2\")" |
||||
fi |
||||
SELECTED='y' |
||||
shift 2 ;; |
||||
-b|--board) |
||||
# echo "Option BOARD: argument \`$2'" |
||||
if [ "$opt_b" ] ; then |
||||
opt_b="${opt_b%)} || \$6 == \"$2\" || \$7 == \"$2\")" |
||||
else |
||||
# We need to check the 7th field too |
||||
# for boards whose 6th field is "-" |
||||
opt_b="(\$6 == \"$2\" || \$7 == \"$2\")" |
||||
fi |
||||
SELECTED='y' |
||||
shift 2 ;; |
||||
-C|--check) |
||||
CHECK='C=1' |
||||
shift ;; |
||||
-n|--continue) |
||||
CONTINUE='y' |
||||
shift ;; |
||||
-r|--rebuild-errors) |
||||
REBUILD_ERRORS='y' |
||||
shift ;; |
||||
-l|--list) |
||||
ONLY_LIST='y' |
||||
shift ;; |
||||
-m|--maintainers) |
||||
ONLY_LIST='y' |
||||
PRINT_MAINTS='y' |
||||
MAINTAINERS_ONLY='y' |
||||
shift ;; |
||||
-M|--mails) |
||||
ONLY_LIST='y' |
||||
PRINT_MAINTS='y' |
||||
shift ;; |
||||
-h|--help) |
||||
usage ;; |
||||
--) |
||||
shift ; break ;; |
||||
*) |
||||
echo "Internal error!" >&2 ; exit 1 ;; |
||||
esac |
||||
done |
||||
|
||||
GNU_MAKE=$(scripts/show-gnu-make) || { |
||||
echo "GNU Make not found" >&2 |
||||
exit 1 |
||||
} |
||||
|
||||
# echo "Remaining arguments:" |
||||
# for arg do echo '--> '"\`$arg'" ; done |
||||
|
||||
tools/genboardscfg.py || { |
||||
echo "Failed to generate boards.cfg" >&2 |
||||
exit 1 |
||||
} |
||||
|
||||
FILTER="\$1 !~ /^#/" |
||||
[ "$opt_a" ] && FILTER="${FILTER} && $opt_a" |
||||
[ "$opt_c" ] && FILTER="${FILTER} && $opt_c" |
||||
[ "$opt_s" ] && FILTER="${FILTER} && $opt_s" |
||||
[ "$opt_v" ] && FILTER="${FILTER} && $opt_v" |
||||
[ "$opt_b" ] && FILTER="${FILTER} && $opt_b" |
||||
|
||||
if [ "$SELECTED" ] ; then |
||||
SELECTED=$(awk '('"$FILTER"') { print $7 }' boards.cfg) |
||||
|
||||
# Make sure some boards from boards.cfg are actually found |
||||
if [ -z "$SELECTED" ] ; then |
||||
echo "Error: No boards selected, invalid arguments" |
||||
exit 1 |
||||
fi |
||||
fi |
||||
|
||||
######################################################################### |
||||
|
||||
# Print statistics when we exit |
||||
trap exit 1 2 3 15 |
||||
trap print_stats 0 |
||||
|
||||
# Determine number of CPU cores if no default was set |
||||
: ${BUILD_NCPUS:="`getconf _NPROCESSORS_ONLN`"} |
||||
|
||||
if [ "$BUILD_NCPUS" -gt 1 ] |
||||
then |
||||
JOBS="-j $((BUILD_NCPUS + 1))" |
||||
else |
||||
JOBS="" |
||||
fi |
||||
|
||||
if [ "${MAKEALL_LOGDIR}" ] ; then |
||||
LOG_DIR=${MAKEALL_LOGDIR} |
||||
else |
||||
LOG_DIR="LOG" |
||||
fi |
||||
|
||||
: ${BUILD_NBUILDS:=1} |
||||
BUILD_MANY=0 |
||||
|
||||
if [ "${BUILD_NBUILDS}" -gt 1 ] ; then |
||||
BUILD_MANY=1 |
||||
: ${BUILD_DIR:=./build} |
||||
mkdir -p "${BUILD_DIR}/ERR" |
||||
find "${BUILD_DIR}/ERR/" -type f -exec rm -f {} + |
||||
fi |
||||
|
||||
: ${BUILD_DIR:=.} |
||||
|
||||
OUTPUT_PREFIX="${BUILD_DIR}" |
||||
|
||||
[ -d ${LOG_DIR} ] || mkdir "${LOG_DIR}" || exit 1 |
||||
if [ "$CONTINUE" != 'y' -a "$REBUILD_ERRORS" != 'y' ] ; then |
||||
find "${LOG_DIR}/" -type f -exec rm -f {} + |
||||
fi |
||||
|
||||
LIST="" |
||||
|
||||
# Keep track of the number of builds and errors |
||||
ERR_CNT=0 |
||||
ERR_LIST="" |
||||
WRN_CNT=0 |
||||
WRN_LIST="" |
||||
TOTAL_CNT=0 |
||||
SKIP_CNT=0 |
||||
CURRENT_CNT=0 |
||||
OLDEST_IDX=1 |
||||
RC=0 |
||||
|
||||
# Helper funcs for parsing boards.cfg |
||||
targets_by_field() |
||||
{ |
||||
field=$1 |
||||
regexp=$2 |
||||
|
||||
awk '($1 !~ /^#/ && $'"$field"' ~ /^'"$regexp"'$/) { print $7 }' \ |
||||
boards.cfg |
||||
} |
||||
|
||||
targets_by_arch() { targets_by_field 2 "$@" ; } |
||||
targets_by_cpu() { targets_by_field 3 "$@" ; targets_by_field 3 "$@:.*" ; } |
||||
targets_by_soc() { targets_by_field 4 "$@" ; } |
||||
|
||||
######################################################################### |
||||
## MPC5xx Systems |
||||
######################################################################### |
||||
|
||||
LIST_5xx="$(targets_by_cpu mpc5xx)" |
||||
|
||||
######################################################################### |
||||
## MPC5xxx Systems |
||||
######################################################################### |
||||
|
||||
LIST_5xxx="$(targets_by_cpu mpc5xxx)" |
||||
|
||||
######################################################################### |
||||
## MPC512x Systems |
||||
######################################################################### |
||||
|
||||
LIST_512x="$(targets_by_cpu mpc512x)" |
||||
|
||||
######################################################################### |
||||
## MPC8xx Systems |
||||
######################################################################### |
||||
|
||||
LIST_8xx="$(targets_by_cpu mpc8xx)" |
||||
|
||||
######################################################################### |
||||
## PPC4xx Systems |
||||
######################################################################### |
||||
|
||||
LIST_4xx="$(targets_by_cpu ppc4xx)" |
||||
|
||||
######################################################################### |
||||
## MPC8260 Systems (includes 8250, 8255 etc.) |
||||
######################################################################### |
||||
|
||||
LIST_8260="$(targets_by_cpu mpc8260)" |
||||
|
||||
######################################################################### |
||||
## MPC83xx Systems (includes 8349, etc.) |
||||
######################################################################### |
||||
|
||||
LIST_83xx="$(targets_by_cpu mpc83xx)" |
||||
|
||||
######################################################################### |
||||
## MPC85xx Systems (includes 8540, 8560 etc.) |
||||
######################################################################### |
||||
|
||||
LIST_85xx="$(targets_by_cpu mpc85xx)" |
||||
|
||||
######################################################################### |
||||
## MPC86xx Systems |
||||
######################################################################### |
||||
|
||||
LIST_86xx="$(targets_by_cpu mpc86xx)" |
||||
|
||||
######################################################################### |
||||
## PowerPC groups |
||||
######################################################################### |
||||
|
||||
LIST_TSEC=" \ |
||||
${LIST_83xx} \ |
||||
${LIST_85xx} \ |
||||
${LIST_86xx} \ |
||||
" |
||||
|
||||
LIST_powerpc=" \ |
||||
${LIST_5xx} \ |
||||
${LIST_512x} \ |
||||
${LIST_5xxx} \ |
||||
${LIST_8xx} \ |
||||
${LIST_824x} \ |
||||
${LIST_8260} \ |
||||
${LIST_83xx} \ |
||||
${LIST_85xx} \ |
||||
${LIST_86xx} \ |
||||
${LIST_4xx} \ |
||||
" |
||||
|
||||
# Alias "ppc" -> "powerpc" to not break compatibility with older scripts |
||||
# still using "ppc" instead of "powerpc" |
||||
LIST_ppc=" \ |
||||
${LIST_powerpc} \ |
||||
" |
||||
|
||||
######################################################################### |
||||
## StrongARM Systems |
||||
######################################################################### |
||||
|
||||
LIST_SA="$(targets_by_cpu sa1100)" |
||||
|
||||
######################################################################### |
||||
## ARM7 Systems |
||||
######################################################################### |
||||
|
||||
LIST_ARM7="$(targets_by_cpu arm720t)" |
||||
|
||||
######################################################################### |
||||
## ARM9 Systems |
||||
######################################################################### |
||||
|
||||
LIST_ARM9="$(targets_by_cpu arm920t) \ |
||||
$(targets_by_cpu arm926ejs) \ |
||||
$(targets_by_cpu arm946es) \ |
||||
" |
||||
|
||||
######################################################################### |
||||
## ARM11 Systems |
||||
######################################################################### |
||||
LIST_ARM11="$(targets_by_cpu arm1136) \ |
||||
$(targets_by_cpu arm1176) \ |
||||
" |
||||
|
||||
######################################################################### |
||||
## ARMV7 Systems |
||||
######################################################################### |
||||
|
||||
LIST_ARMV7="$(targets_by_cpu armv7)" |
||||
|
||||
######################################################################### |
||||
## ARMV8 Systems |
||||
######################################################################### |
||||
|
||||
LIST_ARMV8="$(targets_by_cpu armv8)" |
||||
|
||||
######################################################################### |
||||
## AT91 Systems |
||||
######################################################################### |
||||
|
||||
LIST_at91="$(targets_by_soc at91)" |
||||
|
||||
######################################################################### |
||||
## Xscale Systems |
||||
######################################################################### |
||||
|
||||
LIST_pxa="$(targets_by_cpu pxa)" |
||||
|
||||
######################################################################### |
||||
## SPEAr Systems |
||||
######################################################################### |
||||
|
||||
LIST_spear="$(targets_by_soc spear)" |
||||
|
||||
######################################################################### |
||||
## ARM groups |
||||
######################################################################### |
||||
|
||||
LIST_arm="$(targets_by_arch arm | \ |
||||
for ARMV8_TARGET in $LIST_ARMV8; \ |
||||
do sed "/$ARMV8_TARGET/d"; \ |
||||
done) \ |
||||
" |
||||
|
||||
######################################################################### |
||||
## MIPS Systems (default = big endian) |
||||
######################################################################### |
||||
|
||||
LIST_mips="$(targets_by_arch mips)" |
||||
|
||||
######################################################################### |
||||
## OpenRISC Systems |
||||
######################################################################### |
||||
|
||||
LIST_openrisc="$(targets_by_arch openrisc)" |
||||
|
||||
######################################################################### |
||||
## x86 Systems |
||||
######################################################################### |
||||
|
||||
LIST_x86="$(targets_by_arch x86)" |
||||
|
||||
######################################################################### |
||||
## Nios-II Systems |
||||
######################################################################### |
||||
|
||||
LIST_nios2="$(targets_by_arch nios2)" |
||||
|
||||
######################################################################### |
||||
## MicroBlaze Systems |
||||
######################################################################### |
||||
|
||||
LIST_microblaze="$(targets_by_arch microblaze)" |
||||
|
||||
######################################################################### |
||||
## ColdFire Systems |
||||
######################################################################### |
||||
|
||||
LIST_m68k="$(targets_by_arch m68k)" |
||||
LIST_coldfire=${LIST_m68k} |
||||
|
||||
######################################################################### |
||||
## AVR32 Systems |
||||
######################################################################### |
||||
|
||||
LIST_avr32="$(targets_by_arch avr32)" |
||||
|
||||
######################################################################### |
||||
## Blackfin Systems |
||||
######################################################################### |
||||
|
||||
LIST_blackfin="$(targets_by_arch blackfin)" |
||||
|
||||
######################################################################### |
||||
## SH Systems |
||||
######################################################################### |
||||
|
||||
LIST_sh2="$(targets_by_cpu sh2)" |
||||
LIST_sh3="$(targets_by_cpu sh3)" |
||||
LIST_sh4="$(targets_by_cpu sh4)" |
||||
|
||||
LIST_sh="$(targets_by_arch sh)" |
||||
|
||||
######################################################################### |
||||
## SPARC Systems |
||||
######################################################################### |
||||
|
||||
LIST_sparc="$(targets_by_arch sparc)" |
||||
|
||||
######################################################################### |
||||
## NDS32 Systems |
||||
######################################################################### |
||||
|
||||
LIST_nds32="$(targets_by_arch nds32)" |
||||
|
||||
######################################################################### |
||||
## ARC Systems |
||||
######################################################################### |
||||
|
||||
LIST_arc="$(targets_by_arch arc)" |
||||
|
||||
#----------------------------------------------------------------------- |
||||
|
||||
get_target_location() { |
||||
local target=$1 |
||||
local BOARD_NAME="" |
||||
local CONFIG_NAME="" |
||||
local board="" |
||||
local vendor="" |
||||
|
||||
# Automatic mode |
||||
local line=`awk '\$7 == "'"$target"'" { print \$0 }' boards.cfg` |
||||
if [ -z "${line}" ] ; then echo "" ; return ; fi |
||||
|
||||
set ${line} |
||||
|
||||
CONFIG_NAME="${7%_defconfig}" |
||||
|
||||
[ "${BOARD_NAME}" ] || BOARD_NAME="${7%_defconfig}" |
||||
|
||||
if [ $# -gt 5 ]; then |
||||
if [ "$6" = "-" ] ; then |
||||
board=${BOARD_NAME} |
||||
else |
||||
board="$6" |
||||
fi |
||||
fi |
||||
|
||||
[ $# -gt 4 ] && [ "$5" != "-" ] && vendor="$5" |
||||
[ $# -gt 6 ] && [ "$8" != "-" ] && { |
||||
tmp="${8%:*}" |
||||
if [ "$tmp" ] ; then |
||||
CONFIG_NAME="$tmp" |
||||
fi |
||||
} |
||||
|
||||
# Assign board directory to BOARDIR variable |
||||
if [ "${vendor}" == "-" ] ; then |
||||
BOARDDIR=${board} |
||||
else |
||||
BOARDDIR=${vendor}/${board} |
||||
fi |
||||
|
||||
echo "${CONFIG_NAME}:${BOARDDIR}:${BOARD_NAME}" |
||||
} |
||||
|
||||
get_target_maintainers() { |
||||
local name=`echo $1 | cut -d : -f 3` |
||||
|
||||
local line=`awk '\$7 == "'"$target"'" { print \$0 }' boards.cfg` |
||||
if [ -z "${line}" ]; then |
||||
echo "" |
||||
return ; |
||||
fi |
||||
|
||||
local mails=`echo ${line} | cut -d ' ' -f 9- | sed -e 's/[^<]*<//' -e 's/>.*</ /' -e 's/>[^>]*$//'` |
||||
[ "$mails" == "-" ] && mails="" |
||||
echo "$mails" |
||||
} |
||||
|
||||
get_target_arch() { |
||||
local target=$1 |
||||
|
||||
awk '$7 == "'$target'" { print $2 }' boards.cfg |
||||
} |
||||
|
||||
list_target() { |
||||
if [ "$PRINT_MAINTS" != 'y' ] ; then |
||||
echo "$1" |
||||
return |
||||
fi |
||||
|
||||
echo -n "$1:" |
||||
|
||||
local loc=`get_target_location $1` |
||||
|
||||
if [ -z "${loc}" ] ; then echo "ERROR" ; return ; fi |
||||
|
||||
local maintainers_result=`get_target_maintainers ${loc} | tr " " "\n"` |
||||
|
||||
if [ "$MAINTAINERS_ONLY" != 'y' ] ; then |
||||
|
||||
local dir=`echo ${loc} | cut -d ":" -f 2` |
||||
local cfg=`echo ${loc} | cut -d ":" -f 1` |
||||
local git_result=`git log --format=%aE board/${dir} \ |
||||
include/configs/${cfg}.h | grep "@"` |
||||
local git_result_recent=`echo ${git_result} | tr " " "\n" | \ |
||||
head -n 3` |
||||
local git_result_top=`echo ${git_result} | tr " " "\n" | \ |
||||
sort | uniq -c | sort -nr | head -n 3 | \ |
||||
sed "s/^ \+[0-9]\+ \+//"` |
||||
|
||||
echo -e "$git_result_recent\n$git_result_top\n$maintainers_result" | \ |
||||
sort -u | tr "\n" " " | sed "s/ $//" ; |
||||
else |
||||
echo -e "$maintainers_result" | sort -u | tr "\n" " " | \ |
||||
sed "s/ $//" ; |
||||
fi |
||||
|
||||
echo "" |
||||
} |
||||
|
||||
# Each finished build will have a file called ${donep}${n}, |
||||
# where n is the index of the build. Each build |
||||
# we've already noted as finished will have ${skipp}${n}. |
||||
# The code managing the build process will use this information |
||||
# to ensure that only BUILD_NBUILDS builds are in flight at once |
||||
donep="${LOG_DIR}/._done_" |
||||
skipp="${LOG_DIR}/._skip_" |
||||
|
||||
build_target_killed() { |
||||
echo "Aborted $target build." |
||||
# Remove the logs for this board since it was aborted |
||||
rm -f ${LOG_DIR}/$target.MAKELOG ${LOG_DIR}/$target.ERR |
||||
exit |
||||
} |
||||
|
||||
build_target() { |
||||
target=$1 |
||||
build_idx=$2 |
||||
|
||||
if [ "$ONLY_LIST" == 'y' ] ; then |
||||
list_target ${target} |
||||
return |
||||
fi |
||||
|
||||
if [ $BUILD_MANY == 1 ] ; then |
||||
output_dir="${OUTPUT_PREFIX}/${target}" |
||||
mkdir -p "${output_dir}" |
||||
trap build_target_killed TERM |
||||
else |
||||
output_dir="${OUTPUT_PREFIX}" |
||||
fi |
||||
|
||||
target_arch=$(get_target_arch ${target}) |
||||
eval cross_toolchain=\$CROSS_COMPILE_`echo $target_arch | tr '[:lower:]' '[:upper:]'` |
||||
if [ "${cross_toolchain}" ] ; then |
||||
MAKE="$GNU_MAKE CROSS_COMPILE=${cross_toolchain}" |
||||
elif [ "${CROSS_COMPILE}" ] ; then |
||||
MAKE="$GNU_MAKE CROSS_COMPILE=${CROSS_COMPILE}" |
||||
else |
||||
MAKE=$GNU_MAKE |
||||
fi |
||||
|
||||
if [ "${output_dir}" != "." ] ; then |
||||
MAKE="${MAKE} O=${output_dir}" |
||||
fi |
||||
|
||||
${MAKE} mrproper >/dev/null |
||||
|
||||
echo "Building ${target} board..." |
||||
${MAKE} -s ${target}_defconfig >/dev/null |
||||
|
||||
${MAKE} ${JOBS} ${CHECK} all \ |
||||
>${LOG_DIR}/$target.MAKELOG 2> ${LOG_DIR}/$target.ERR |
||||
|
||||
# Check for 'make' errors |
||||
if [ ${PIPESTATUS[0]} -ne 0 ] ; then |
||||
RC=1 |
||||
fi |
||||
|
||||
OBJS=${output_dir}/u-boot |
||||
if [ -e ${output_dir}/spl/u-boot-spl ]; then |
||||
OBJS="${OBJS} ${output_dir}/spl/u-boot-spl" |
||||
fi |
||||
|
||||
${CROSS_COMPILE}size ${OBJS} | tee -a ${LOG_DIR}/$target.MAKELOG |
||||
|
||||
if [ $BUILD_MANY == 1 ] ; then |
||||
trap - TERM |
||||
|
||||
${MAKE} -s clean |
||||
|
||||
if [ -s ${LOG_DIR}/${target}.ERR ] ; then |
||||
cp ${LOG_DIR}/${target}.ERR ${OUTPUT_PREFIX}/ERR/${target} |
||||
else |
||||
rm ${LOG_DIR}/${target}.ERR |
||||
fi |
||||
else |
||||
if [ -s ${LOG_DIR}/${target}.ERR ] ; then |
||||
if grep -iw error ${LOG_DIR}/${target}.ERR ; then |
||||
: $(( ERR_CNT += 1 )) |
||||
ERR_LIST="${ERR_LIST} $target" |
||||
else |
||||
: $(( WRN_CNT += 1 )) |
||||
WRN_LIST="${WRN_LIST} $target" |
||||
fi |
||||
else |
||||
rm ${LOG_DIR}/${target}.ERR |
||||
fi |
||||
fi |
||||
|
||||
[ -e "${LOG_DIR}/${target}.ERR" ] && cat "${LOG_DIR}/${target}.ERR" |
||||
|
||||
touch "${donep}${build_idx}" |
||||
} |
||||
|
||||
manage_builds() { |
||||
search_idx=${OLDEST_IDX} |
||||
if [ "$ONLY_LIST" == 'y' ] ; then return ; fi |
||||
|
||||
while true; do |
||||
if [ -e "${donep}${search_idx}" ] ; then |
||||
: $(( CURRENT_CNT-- )) |
||||
[ ${OLDEST_IDX} -eq ${search_idx} ] && |
||||
: $(( OLDEST_IDX++ )) |
||||
|
||||
# Only want to count it once |
||||
rm -f "${donep}${search_idx}" |
||||
touch "${skipp}${search_idx}" |
||||
elif [ -e "${skipp}${search_idx}" ] ; then |
||||
[ ${OLDEST_IDX} -eq ${search_idx} ] && |
||||
: $(( OLDEST_IDX++ )) |
||||
fi |
||||
: $(( search_idx++ )) |
||||
if [ ${search_idx} -gt ${TOTAL_CNT} ] ; then |
||||
if [ ${CURRENT_CNT} -ge ${BUILD_NBUILDS} ] ; then |
||||
search_idx=${OLDEST_IDX} |
||||
sleep 1 |
||||
else |
||||
break |
||||
fi |
||||
fi |
||||
done |
||||
} |
||||
|
||||
build_targets() { |
||||
for t in "$@" ; do |
||||
# If a LIST_xxx var exists, use it. But avoid variable |
||||
# expansion in the eval when a board name contains certain |
||||
# characters that the shell interprets. |
||||
case ${t} in |
||||
*[-+=]*) list= ;; |
||||
*) list=$(eval echo '${LIST_'$t'}') ;; |
||||
esac |
||||
if [ -n "${list}" ] ; then |
||||
build_targets ${list} |
||||
else |
||||
: $((TOTAL_CNT += 1)) |
||||
: $((CURRENT_CNT += 1)) |
||||
rm -f "${donep}${TOTAL_CNT}" |
||||
rm -f "${skipp}${TOTAL_CNT}" |
||||
if [ "$CONTINUE" = 'y' -a -e ${LOG_DIR}/$t.MAKELOG ] ; then |
||||
: $((SKIP_CNT += 1)) |
||||
touch "${donep}${TOTAL_CNT}" |
||||
elif [ "$REBUILD_ERRORS" = 'y' -a ! -e ${LOG_DIR}/$t.ERR ] ; then |
||||
: $((SKIP_CNT += 1)) |
||||
touch "${donep}${TOTAL_CNT}" |
||||
else |
||||
if [ $BUILD_MANY == 1 ] ; then |
||||
build_target ${t} ${TOTAL_CNT} & |
||||
else |
||||
CUR_TGT="${t}" |
||||
build_target ${t} ${TOTAL_CNT} |
||||
CUR_TGT='' |
||||
fi |
||||
fi |
||||
fi |
||||
|
||||
# We maintain a running count of all the builds we have done. |
||||
# Each finished build will have a file called ${donep}${n}, |
||||
# where n is the index of the build. Each build |
||||
# we've already noted as finished will have ${skipp}${n}. |
||||
# We track the current index via TOTAL_CNT, and the oldest |
||||
# index. When we exceed the maximum number of parallel builds, |
||||
# We look from oldest to current for builds that have completed, |
||||
# and update the current count and oldest index as appropriate. |
||||
# If we've gone through the entire list, wait a second, and |
||||
# reprocess the entire list until we find a build that has |
||||
# completed |
||||
if [ ${CURRENT_CNT} -ge ${BUILD_NBUILDS} ] ; then |
||||
manage_builds |
||||
fi |
||||
done |
||||
} |
||||
|
||||
#----------------------------------------------------------------------- |
||||
|
||||
kill_children() { |
||||
local OS=$(uname -s) |
||||
local children="" |
||||
case "${OS}" in |
||||
"Darwin") |
||||
# Mac OS X is known to have BSD style ps |
||||
local pgid=$(ps -p $$ -o pgid | sed -e "/PGID/d") |
||||
children=$(ps -g $pgid -o pid | sed -e "/PID\|$$\|$pgid/d") |
||||
;; |
||||
*) |
||||
# everything else tries the GNU style |
||||
local pgid=$(ps -p $$ --no-headers -o "%r" | tr -d ' ') |
||||
children=$(pgrep -g $pgid | sed -e "/$$\|$pgid/d") |
||||
;; |
||||
esac |
||||
|
||||
kill $children 2> /dev/null |
||||
wait $children 2> /dev/null |
||||
|
||||
exit |
||||
} |
||||
|
||||
print_stats() { |
||||
if [ "$ONLY_LIST" == 'y' ] ; then return ; fi |
||||
|
||||
# Only count boards that completed |
||||
: $((TOTAL_CNT = `find ${skipp}* 2> /dev/null | wc -l`)) |
||||
|
||||
rm -f ${donep}* ${skipp}* |
||||
|
||||
if [ $BUILD_MANY == 1 ] && [ -e "${OUTPUT_PREFIX}/ERR" ] ; then |
||||
ERR_LIST=`grep -riwl error ${OUTPUT_PREFIX}/ERR/` |
||||
ERR_LIST=`for f in $ERR_LIST ; do echo -n " $(basename $f)" ; done` |
||||
ERR_CNT=`echo $ERR_LIST | wc -w | awk '{print $1}'` |
||||
WRN_LIST=`grep -riwL error ${OUTPUT_PREFIX}/ERR/` |
||||
WRN_LIST=`for f in $WRN_LIST ; do echo -n " $(basename $f)" ; done` |
||||
WRN_CNT=`echo $WRN_LIST | wc -w | awk '{print $1}'` |
||||
else |
||||
# Remove the logs for any board that was interrupted |
||||
rm -f ${LOG_DIR}/${CUR_TGT}.MAKELOG ${LOG_DIR}/${CUR_TGT}.ERR |
||||
fi |
||||
|
||||
: $((TOTAL_CNT -= ${SKIP_CNT})) |
||||
echo "" |
||||
echo "--------------------- SUMMARY ----------------------------" |
||||
if [ "$CONTINUE" = 'y' -o "$REBUILD_ERRORS" = 'y' ] ; then |
||||
echo "Boards skipped: ${SKIP_CNT}" |
||||
fi |
||||
echo "Boards compiled: ${TOTAL_CNT}" |
||||
if [ ${ERR_CNT} -gt 0 ] ; then |
||||
echo "Boards with errors: ${ERR_CNT} (${ERR_LIST} )" |
||||
fi |
||||
if [ ${WRN_CNT} -gt 0 ] ; then |
||||
echo "Boards with warnings but no errors: ${WRN_CNT} (${WRN_LIST} )" |
||||
fi |
||||
echo "----------------------------------------------------------" |
||||
|
||||
if [ $BUILD_MANY == 1 ] ; then |
||||
kill_children |
||||
fi |
||||
|
||||
deprecation |
||||
|
||||
exit $RC |
||||
} |
||||
|
||||
#----------------------------------------------------------------------- |
||||
|
||||
# Build target groups selected by options, plus any command line args |
||||
set -- ${SELECTED} "$@" |
||||
# run PowerPC by default |
||||
[ $# = 0 ] && set -- powerpc |
||||
build_targets "$@" |
||||
wait |
Loading…
Reference in new issue