| #!/bin/sh |
| |
| # Print statistics when we exit |
| trap exit 1 2 3 15 |
| trap stats 0 |
| |
| # Keep track of the number of builds and errors |
| nb_errors=0 |
| errors_list="" |
| nb_defconfigs=0 |
| ret=0 |
| |
| here=$(pwd) |
| |
| time_start=$(date +%s) |
| |
| filename=`basename $0` |
| |
| is_print_stats=1 |
| |
| #----------------------------------------------------------------------- |
| |
| usage() { |
| is_print_stats=0 |
| echo "Usage: ${filename} [OPTION]..." |
| echo "Barebox MAKEALL tools." |
| echo "" |
| echo "it's allow you to compile specific defconfig or ARCH or all" |
| echo "as" |
| echo "" |
| echo "CROSS_COMPILE=arm-linux- ARCH=arm ./MAKEALL at91sam9263ek_defconfig" |
| echo "CROSS_COMPILE=arm-linux- ARCH=arm ./MAKEALL" |
| echo "" |
| echo "The cross-compiler can be specify via" |
| echo " CROSS_COMPILE default" |
| echo " CROSS_COMPILE_<arch> arch default" |
| echo " CROSS_COMPILE_<target> deconfig specifc" |
| echo "" |
| echo "it will be evaluated in the invert order" |
| echo "" |
| echo "or via config" |
| echo "" |
| echo "you can specify it via env CONFIG or option -c (overwrite env)" |
| echo "" |
| echo "CONFIG=./MAKEALL.cfg ARCH=arm ./MAKEALL at91sam9263ek_defconfig" |
| echo "CONFIG=./MAKEALL.cfg ARCH=arm ./MAKEALL" |
| echo "" |
| echo "and for all" |
| echo "" |
| echo "CONFIG=./MAKEALL.cfg ./MAKEALL" |
| echo "" |
| echo "you can specify via env or option" |
| echo "env option" |
| echo "ARCH -a arch" |
| echo "CONFIG -c config" |
| echo "JOBS -j jobs" |
| echo "BUILDDIR -O build dir" |
| echo "LOGDIR -l log dir" |
| echo "" |
| } |
| |
| stats() { |
| [ ${is_print_stats} -lt 1 ] && return |
| |
| echo "" |
| echo "--------------------- SUMMARY ----------------------------" |
| echo "defconfigs compiled: ${nb_defconfigs}" |
| time_stop=$(date +%s) |
| time_diff=$((${time_stop} - ${time_start})) |
| printf "compiled in %4is\n" ${time_diff} |
| if [ ${nb_errors} -gt 0 ] ; then |
| echo "defcongids with warnings or errors: ${nb_errors} (${errors_list} )" |
| fi |
| echo "----------------------------------------------------------" |
| |
| exit ${ret} |
| } |
| |
| check_pipe_status() { |
| for i in "${PIPESTATUS[@]}" |
| do |
| [ $i -gt 0 ] && return 1 |
| done |
| return 0 |
| } |
| |
| do_build_target() { |
| local arch=$1 |
| local target=$2 |
| local target_time_start=$(date +%s) |
| local log_report="${LOGDIR}/${target}/report.log" |
| local log_err="${LOGDIR}/${target}/errors.log" |
| |
| rm -rf "${BUILDDIR}" |
| mkdir -p "${BUILDDIR}" |
| mkdir -p "${LOGDIR}/${target}" |
| printf "Building ${arch} ${target} \n" >&2 | tee -a "${log_report}" |
| |
| cross_compile=`eval echo '$CROSS_COMPILE_'${target}` |
| cross_compile_set=`eval echo '${CROSS_COMPILE_'${target}'+set}'` |
| if [ "${cross_compile_set}" = "" ] |
| then |
| cross_compile=`eval echo '$CROSS_COMPILE_'${arch}` |
| cross_compile_set=`eval echo '${CROSS_COMPILE_'${arch}'+set}'` |
| if [ "${cross_compile_set}" = "" ] |
| then |
| cross_compile=${CROSS_COMPILE} |
| fi |
| fi |
| |
| MAKE="make -C ${here} CROSS_COMPILE=${cross_compile} ARCH=${arch} O=${BUILDDIR}" |
| ${MAKE} -j${JOBS} ${target} 2>&1 > "${log_report}" | tee "${log_err}" |
| |
| printf "Configure: " | tee -a "${log_report}" |
| check_pipe_status |
| if [ "$?" = "0" ]; then |
| printf "OK \n" | tee -a "${log_report}" |
| |
| ${MAKE} -j${JOBS} -s 2>&1 >> "${log_report}" | tee -a "${log_err}" |
| |
| printf "Compile: " ${target} | tee -a "${log_report}" |
| |
| check_pipe_status |
| if [ "$?" = "0" ]; then |
| printf "OK \n" | tee -a "${log_report}" |
| ${cross_compile}size ${BUILDDIR}/barebox | tee -a "${log_report}" |
| else |
| printf "FAILED \n" | tee -a "${log_report}" |
| ret=1 |
| fi |
| else |
| printf "FAILED \n" | tee -a "${log_report}" |
| printf "Compile: ------ \n" | tee -a "${log_report}" |
| ret=1 |
| fi |
| |
| if [ -s "${log_err}" ] ; then |
| nb_errors=$((nb_errors + 1)) |
| errors_list="${errors_list} ${target}" |
| else |
| rm "${log_err}" |
| fi |
| |
| nb_defconfigs=$((nb_defconfigs + 1)) |
| |
| target_time_stop=$(date +%s) |
| target_time_diff=$((${target_time_stop} - ${target_time_start})) |
| printf "Compiled in %4is\n" ${target_time_diff} | tee -a "${log_report}" |
| } |
| |
| do_build() { |
| local arch=$1 |
| |
| for i in arch/${arch}/configs/*_defconfig |
| do |
| local target=$(basename $i) |
| |
| do_build_target ${arch} ${target} |
| done |
| } |
| |
| do_build_all() { |
| local build_target=0 |
| |
| for i in arch/* |
| do |
| local arch=$(basename $i) |
| |
| if [ -d $i ] |
| then |
| do_build ${arch} |
| build_target=$((build_target + 1)) |
| fi |
| done |
| |
| return $build_target |
| } |
| |
| while getopts "hc:j:O:l:a:" Option |
| do |
| case $Option in |
| a ) |
| ARCH=${OPTARG} |
| ;; |
| c ) |
| CONFIG=${OPTARG} |
| ;; |
| j ) |
| JOBS=${OPTARG} |
| ;; |
| l ) |
| LOGDIR=${OPTARG} |
| ;; |
| O ) |
| BUILDDIR=${OPTARG} |
| ;; |
| h ) |
| usage |
| exit 0 |
| ;; |
| esac |
| done |
| |
| shift $((OPTIND - 1)) |
| |
| if [ ! "${JOBS}" ] ; then |
| #linux, BSD, MacOS |
| nb_cpu=`getconf _NPROCESSORS_ONLN` |
| |
| if [ $? -gt 0 ] |
| then |
| nb_cpu=1 |
| fi |
| |
| JOBS=$((${nb_cpu} * 2)) |
| fi |
| |
| if [ ! "${LOGDIR}" ] |
| then |
| LOGDIR="log" |
| fi |
| |
| if [ ! "${BUILDDIR}" ] |
| then |
| BUILDDIR="makeall_builddir" |
| fi |
| |
| if [ "${CONFIG}" ] |
| then |
| basedir=`dirname ${CONFIG}` |
| |
| if [ ! "${basedir}" ] || [ "${basedir}" = "." ] |
| then |
| CONFIG="./${CONFIG}" |
| fi |
| |
| source "${CONFIG}" |
| fi |
| |
| [ -d "${LOGDIR}" ] || mkdir ${LOGDIR} || exit 1 |
| |
| if [ ! "${CONFIG}" ] && [ ! "${CROSS_COMPILE+set}" ] |
| then |
| echo "You need to specify a CONFIG or a CROSS_COMPILE" |
| usage |
| exit 1 |
| fi |
| |
| if [ ! "${ARCH}" ] || [ ! -d arch/${ARCH} ] |
| then |
| do_build_all |
| if [ $? -eq 0 ] |
| then |
| echo "You need to specify the ARCH or CROSS_COMPILE_<arch> or CROSS_COMPILE_<target> in your config file" |
| usage |
| exit 1 |
| fi |
| exit 0 |
| fi |
| |
| if [ $# -eq 0 ] |
| then |
| do_build ${ARCH} |
| else |
| do_build_target ${ARCH} $1 |
| fi |