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