xref: /OK3568_Linux_fs/device/rockchip/common/build-hooks/build-helper (revision 4882a59341e53eb6f0b4789bf948001014eff981)
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