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