191 lines
3.5 KiB
Bash
191 lines
3.5 KiB
Bash
#!/bin/bash
|
|
|
|
[ -z "$DEBUG" ] || set -x
|
|
|
|
# Make sure that we are sourced and called inside of RK build scripts.
|
|
if [ "$BASH_SOURCE" = "$0" -o -z "$RK_SESSION" ];then
|
|
echo "$(realpath "$0") is not supposed to be executed directly"
|
|
exit 1
|
|
fi
|
|
|
|
err_handler()
|
|
{
|
|
ret=${1:-$?}
|
|
[ "$ret" -eq 0 ] && return
|
|
|
|
echo "ERROR: Running $0 - ${2:-${FUNCNAME[1]}} failed!"
|
|
echo "ERROR: exit code $ret from line ${BASH_LINENO[0]}:"
|
|
echo " ${3:-$BASH_COMMAND}"
|
|
echo "ERROR: call stack:"
|
|
for i in $(seq 1 $((${#FUNCNAME[@]} - 1))); do
|
|
SOURCE="${BASH_SOURCE[$i]}"
|
|
LINE=${BASH_LINENO[$(( $i - 1 ))]}
|
|
echo " $(basename "$SOURCE"): ${FUNCNAME[$i]}($LINE)"
|
|
done
|
|
exit $ret
|
|
}
|
|
trap 'err_handler' ERR
|
|
set -eE
|
|
|
|
run_command()
|
|
{
|
|
if [ "$DRY_RUN" ]; then
|
|
echo "$@"
|
|
else
|
|
echo "+ $@"
|
|
$@
|
|
fi
|
|
}
|
|
|
|
try_func()
|
|
{
|
|
type $1 >/dev/null 2>/dev/null || return 0
|
|
|
|
# Don't log these hooks
|
|
case "${1%_hook}" in
|
|
init | pre_build)
|
|
$@
|
|
return 0
|
|
;;
|
|
esac
|
|
|
|
if [ "$DRY_RUN" ]; then
|
|
DRY_FUNC=$1_dry
|
|
type $DRY_FUNC >/dev/null 2>/dev/null || return 0
|
|
|
|
shift
|
|
$DRY_FUNC $@
|
|
return 0
|
|
fi
|
|
|
|
LOG_FILE="$(start_log ${LOG_FILE_NAME%%_*} $LOG_FILE_NAME)"
|
|
echo -e "# run func: $@\n" >> "$LOG_FILE"
|
|
$@ 2>&1 | tee -a "$LOG_FILE"
|
|
|
|
FUNC_RET=${PIPESTATUS[0]}
|
|
if [ $FUNC_RET -ne 0 ]; then
|
|
err_handler $FUNC_RET "${FUNCNAME[0]} $*" "$@"
|
|
exit $FUNC_RET
|
|
fi
|
|
}
|
|
|
|
try_hook()
|
|
{
|
|
FUNC=$1
|
|
shift
|
|
CMDS="$1"
|
|
shift
|
|
|
|
if echo "$CMDS" | grep -qE "^default( |$)"; then
|
|
OPTS="default $@"
|
|
else
|
|
OPTS="$@ default"
|
|
fi
|
|
|
|
type $FUNC >/dev/null 2>/dev/null || return 0
|
|
|
|
for opt in $OPTS; do
|
|
IS_DRY_RUN=$(echo $opt | grep -E ":cmds(:|$)" || true)
|
|
for cmd in $CMDS; do
|
|
# NOTE: There might be patterns in commands
|
|
ARGS="$(echo $opt | grep -E "^$cmd(:|$)" | \
|
|
tr ':' ' ' || true)"
|
|
[ "$ARGS" ] || continue
|
|
|
|
DRY_RUN=${DRY_RUN:-${IS_DRY_RUN:+1}} \
|
|
try_func $FUNC $ARGS
|
|
done
|
|
done
|
|
}
|
|
|
|
make_usage()
|
|
{
|
|
usage_hook | grep "^[a-z]" | grep -v "^[a-z0-9_.-]*:" | \
|
|
sed 's/\(^[a-z0-9_.-]*\).*\t\(.*$\)/\1@\2/' | \
|
|
while read LINE; do
|
|
TARGET=$(echo $LINE | grep -o "^[a-z0-9_.-]*")
|
|
USAGE=$(echo $LINE | grep -oE "[^@]*$" || true)
|
|
printf " %-22s - %s\n" "$TARGET" "$USAGE"
|
|
done
|
|
}
|
|
|
|
make_targets()
|
|
{
|
|
make_usage | cut -d' ' -f3
|
|
}
|
|
|
|
normalized_usage()
|
|
{
|
|
usage_hook | sed -e 's/\[:/ \[/g' -e 's/:/ /g'
|
|
}
|
|
|
|
usage()
|
|
{
|
|
echo "Usage: $0 [OPTIONS]"
|
|
normalized_usage
|
|
echo -e "clean \tcleanup"
|
|
echo -e "help \tusage"
|
|
exit 1
|
|
}
|
|
|
|
cd "$SDK_DIR"
|
|
|
|
LOG_FILE_NAME="$(basename "${0%.sh}")-$1_$(date +"%F_%H-%M-%S")"
|
|
|
|
case "$1" in
|
|
help | h | -h | --help | \?) usage ;;
|
|
make-targets) make_targets; exit 0 ;;
|
|
make-usage) make_usage; exit 0 ;;
|
|
usage) usage_hook; exit 0 ;;
|
|
support-cmds)
|
|
shift
|
|
{
|
|
ALL_CMDS="$INIT_CMDS $PRE_BUILD_CMDS $BUILD_CMDS \
|
|
$POST_BUILD_CMDS"
|
|
for stage in ${@:-all}; do
|
|
case $stage in
|
|
init) echo "$INIT_CMDS" ;;
|
|
pre-build) echo "$PRE_BUILD_CMDS" ;;
|
|
build) echo "$BUILD_CMDS" ;;
|
|
post-build) echo "$POST_BUILD_CMDS" ;;
|
|
all) echo "$ALL_CMDS" ;;
|
|
esac
|
|
done
|
|
} | xargs -n 1 | grep -v "^default$" | xargs || true
|
|
exit 0
|
|
;;
|
|
clean)
|
|
try_func clean_hook
|
|
exit 0
|
|
;;
|
|
init)
|
|
shift
|
|
try_hook init_hook "$INIT_CMDS" $@
|
|
exit 0
|
|
;;
|
|
pre-build)
|
|
shift
|
|
try_hook pre_build_hook "$PRE_BUILD_CMDS" $@
|
|
exit 0
|
|
;;
|
|
build)
|
|
shift
|
|
try_hook build_hook "$BUILD_CMDS" $@
|
|
exit 0
|
|
;;
|
|
post-build)
|
|
shift
|
|
try_hook post_build_hook "$POST_BUILD_CMDS" $@
|
|
exit 0
|
|
;;
|
|
esac
|
|
|
|
if [ "$DRY_RUN" ]; then
|
|
echo "Environment 'DRY_RUN' ignored!"
|
|
unset DRY_RUN
|
|
fi
|
|
|
|
if [ "$2" = cmds ]; then
|
|
export DRY_RUN=1
|
|
fi
|