1*4882a593Smuzhiyun#!/bin/bash 2*4882a593Smuzhiyun 3*4882a593Smuzhiyun[ -z "$DEBUG" ] || set -x 4*4882a593Smuzhiyun 5*4882a593Smuzhiyun# Make sure that we are sourced and called inside of RK build scripts. 6*4882a593Smuzhiyunif [ "$BASH_SOURCE" = "$0" -o -z "$RK_SESSION" ];then 7*4882a593Smuzhiyun echo "$(realpath "$0") is not supposed to be executed directly" 8*4882a593Smuzhiyun exit 1 9*4882a593Smuzhiyunfi 10*4882a593Smuzhiyun 11*4882a593Smuzhiyunerr_handler() 12*4882a593Smuzhiyun{ 13*4882a593Smuzhiyun ret=${1:-$?} 14*4882a593Smuzhiyun [ "$ret" -eq 0 ] && return 15*4882a593Smuzhiyun 16*4882a593Smuzhiyun echo "ERROR: Running $0 - ${2:-${FUNCNAME[1]}} failed!" 17*4882a593Smuzhiyun echo "ERROR: exit code $ret from line ${BASH_LINENO[0]}:" 18*4882a593Smuzhiyun echo " ${3:-$BASH_COMMAND}" 19*4882a593Smuzhiyun echo "ERROR: call stack:" 20*4882a593Smuzhiyun for i in $(seq 1 $((${#FUNCNAME[@]} - 1))); do 21*4882a593Smuzhiyun SOURCE="${BASH_SOURCE[$i]}" 22*4882a593Smuzhiyun LINE=${BASH_LINENO[$(( $i - 1 ))]} 23*4882a593Smuzhiyun echo " $(basename "$SOURCE"): ${FUNCNAME[$i]}($LINE)" 24*4882a593Smuzhiyun done 25*4882a593Smuzhiyun exit $ret 26*4882a593Smuzhiyun} 27*4882a593Smuzhiyuntrap 'err_handler' ERR 28*4882a593Smuzhiyunset -eE 29*4882a593Smuzhiyun 30*4882a593Smuzhiyunrun_command() 31*4882a593Smuzhiyun{ 32*4882a593Smuzhiyun if [ "$DRY_RUN" ]; then 33*4882a593Smuzhiyun echo "$@" 34*4882a593Smuzhiyun else 35*4882a593Smuzhiyun echo "+ $@" 36*4882a593Smuzhiyun $@ 37*4882a593Smuzhiyun fi 38*4882a593Smuzhiyun} 39*4882a593Smuzhiyun 40*4882a593Smuzhiyuntry_func() 41*4882a593Smuzhiyun{ 42*4882a593Smuzhiyun type $1 >/dev/null 2>/dev/null || return 0 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun # Don't log these hooks 45*4882a593Smuzhiyun case "${1%_hook}" in 46*4882a593Smuzhiyun init | pre_build) 47*4882a593Smuzhiyun $@ 48*4882a593Smuzhiyun return 0 49*4882a593Smuzhiyun ;; 50*4882a593Smuzhiyun esac 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun if [ "$DRY_RUN" ]; then 53*4882a593Smuzhiyun DRY_FUNC=$1_dry 54*4882a593Smuzhiyun type $DRY_FUNC >/dev/null 2>/dev/null || return 0 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun shift 57*4882a593Smuzhiyun $DRY_FUNC $@ 58*4882a593Smuzhiyun return 0 59*4882a593Smuzhiyun fi 60*4882a593Smuzhiyun 61*4882a593Smuzhiyun LOG_FILE="$(start_log ${LOG_FILE_NAME%%_*} $LOG_FILE_NAME)" 62*4882a593Smuzhiyun echo -e "# run func: $@\n" >> "$LOG_FILE" 63*4882a593Smuzhiyun $@ 2>&1 | tee -a "$LOG_FILE" 64*4882a593Smuzhiyun 65*4882a593Smuzhiyun FUNC_RET=${PIPESTATUS[0]} 66*4882a593Smuzhiyun if [ $FUNC_RET -ne 0 ]; then 67*4882a593Smuzhiyun err_handler $FUNC_RET "${FUNCNAME[0]} $*" "$@" 68*4882a593Smuzhiyun exit $FUNC_RET 69*4882a593Smuzhiyun fi 70*4882a593Smuzhiyun} 71*4882a593Smuzhiyun 72*4882a593Smuzhiyuntry_hook() 73*4882a593Smuzhiyun{ 74*4882a593Smuzhiyun FUNC=$1 75*4882a593Smuzhiyun shift 76*4882a593Smuzhiyun CMDS="$1" 77*4882a593Smuzhiyun shift 78*4882a593Smuzhiyun 79*4882a593Smuzhiyun if echo "$CMDS" | grep -qE "^default( |$)"; then 80*4882a593Smuzhiyun OPTS="default $@" 81*4882a593Smuzhiyun else 82*4882a593Smuzhiyun OPTS="$@ default" 83*4882a593Smuzhiyun fi 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun type $FUNC >/dev/null 2>/dev/null || return 0 86*4882a593Smuzhiyun 87*4882a593Smuzhiyun for opt in $OPTS; do 88*4882a593Smuzhiyun IS_DRY_RUN=$(echo $opt | grep -E ":cmds(:|$)" || true) 89*4882a593Smuzhiyun for cmd in $CMDS; do 90*4882a593Smuzhiyun # NOTE: There might be patterns in commands 91*4882a593Smuzhiyun ARGS="$(echo $opt | grep -E "^$cmd(:|$)" | \ 92*4882a593Smuzhiyun tr ':' ' ' || true)" 93*4882a593Smuzhiyun [ "$ARGS" ] || continue 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun DRY_RUN=${DRY_RUN:-${IS_DRY_RUN:+1}} \ 96*4882a593Smuzhiyun try_func $FUNC $ARGS 97*4882a593Smuzhiyun done 98*4882a593Smuzhiyun done 99*4882a593Smuzhiyun} 100*4882a593Smuzhiyun 101*4882a593Smuzhiyunmake_usage() 102*4882a593Smuzhiyun{ 103*4882a593Smuzhiyun usage_hook | grep "^[a-z]" | grep -v "^[a-z0-9_.-]*:" | \ 104*4882a593Smuzhiyun sed 's/\(^[a-z0-9_.-]*\).*\t\(.*$\)/\1@\2/' | \ 105*4882a593Smuzhiyun while read LINE; do 106*4882a593Smuzhiyun TARGET=$(echo $LINE | grep -o "^[a-z0-9_.-]*") 107*4882a593Smuzhiyun USAGE=$(echo $LINE | grep -oE "[^@]*$" || true) 108*4882a593Smuzhiyun printf " %-22s - %s\n" "$TARGET" "$USAGE" 109*4882a593Smuzhiyun done 110*4882a593Smuzhiyun} 111*4882a593Smuzhiyun 112*4882a593Smuzhiyunmake_targets() 113*4882a593Smuzhiyun{ 114*4882a593Smuzhiyun make_usage | cut -d' ' -f3 115*4882a593Smuzhiyun} 116*4882a593Smuzhiyun 117*4882a593Smuzhiyunnormalized_usage() 118*4882a593Smuzhiyun{ 119*4882a593Smuzhiyun usage_hook | sed -e 's/\[:/ \[/g' -e 's/:/ /g' 120*4882a593Smuzhiyun} 121*4882a593Smuzhiyun 122*4882a593Smuzhiyunusage() 123*4882a593Smuzhiyun{ 124*4882a593Smuzhiyun echo "Usage: $0 [OPTIONS]" 125*4882a593Smuzhiyun normalized_usage 126*4882a593Smuzhiyun echo -e "clean \tcleanup" 127*4882a593Smuzhiyun echo -e "help \tusage" 128*4882a593Smuzhiyun exit 1 129*4882a593Smuzhiyun} 130*4882a593Smuzhiyun 131*4882a593Smuzhiyuncd "$SDK_DIR" 132*4882a593Smuzhiyun 133*4882a593SmuzhiyunLOG_FILE_NAME="$(basename "${0%.sh}")-$1_$(date +"%F_%H-%M-%S")" 134*4882a593Smuzhiyun 135*4882a593Smuzhiyuncase "$1" in 136*4882a593Smuzhiyun help | h | -h | --help | \?) usage ;; 137*4882a593Smuzhiyun make-targets) make_targets; exit 0 ;; 138*4882a593Smuzhiyun make-usage) make_usage; exit 0 ;; 139*4882a593Smuzhiyun usage) usage_hook; exit 0 ;; 140*4882a593Smuzhiyun support-cmds) 141*4882a593Smuzhiyun shift 142*4882a593Smuzhiyun { 143*4882a593Smuzhiyun ALL_CMDS="$INIT_CMDS $PRE_BUILD_CMDS $BUILD_CMDS \ 144*4882a593Smuzhiyun $POST_BUILD_CMDS" 145*4882a593Smuzhiyun for stage in ${@:-all}; do 146*4882a593Smuzhiyun case $stage in 147*4882a593Smuzhiyun init) echo "$INIT_CMDS" ;; 148*4882a593Smuzhiyun pre-build) echo "$PRE_BUILD_CMDS" ;; 149*4882a593Smuzhiyun build) echo "$BUILD_CMDS" ;; 150*4882a593Smuzhiyun post-build) echo "$POST_BUILD_CMDS" ;; 151*4882a593Smuzhiyun all) echo "$ALL_CMDS" ;; 152*4882a593Smuzhiyun esac 153*4882a593Smuzhiyun done 154*4882a593Smuzhiyun } | xargs -n 1 | grep -v "^default$" | xargs || true 155*4882a593Smuzhiyun exit 0 156*4882a593Smuzhiyun ;; 157*4882a593Smuzhiyun clean) 158*4882a593Smuzhiyun try_func clean_hook 159*4882a593Smuzhiyun exit 0 160*4882a593Smuzhiyun ;; 161*4882a593Smuzhiyun init) 162*4882a593Smuzhiyun shift 163*4882a593Smuzhiyun try_hook init_hook "$INIT_CMDS" $@ 164*4882a593Smuzhiyun exit 0 165*4882a593Smuzhiyun ;; 166*4882a593Smuzhiyun pre-build) 167*4882a593Smuzhiyun shift 168*4882a593Smuzhiyun try_hook pre_build_hook "$PRE_BUILD_CMDS" $@ 169*4882a593Smuzhiyun exit 0 170*4882a593Smuzhiyun ;; 171*4882a593Smuzhiyun build) 172*4882a593Smuzhiyun shift 173*4882a593Smuzhiyun try_hook build_hook "$BUILD_CMDS" $@ 174*4882a593Smuzhiyun exit 0 175*4882a593Smuzhiyun ;; 176*4882a593Smuzhiyun post-build) 177*4882a593Smuzhiyun shift 178*4882a593Smuzhiyun try_hook post_build_hook "$POST_BUILD_CMDS" $@ 179*4882a593Smuzhiyun exit 0 180*4882a593Smuzhiyun ;; 181*4882a593Smuzhiyunesac 182*4882a593Smuzhiyun 183*4882a593Smuzhiyunif [ "$DRY_RUN" ]; then 184*4882a593Smuzhiyun echo "Environment 'DRY_RUN' ignored!" 185*4882a593Smuzhiyun unset DRY_RUN 186*4882a593Smuzhiyunfi 187*4882a593Smuzhiyun 188*4882a593Smuzhiyunif [ "$2" = cmds ]; then 189*4882a593Smuzhiyun export DRY_RUN=1 190*4882a593Smuzhiyunfi 191