1*4882a593Smuzhiyun#!/bin/bash -e 2*4882a593Smuzhiyun 3*4882a593SmuzhiyunNAME=$(basename $0) 4*4882a593SmuzhiyunNAME=${NAME%.sh} 5*4882a593Smuzhiyun 6*4882a593Smuzhiyun# Print available options for this module 7*4882a593Smuzhiyunusage_hook() 8*4882a593Smuzhiyun{ 9*4882a593Smuzhiyun echo -e "dummy \tbuild dummy" 10*4882a593Smuzhiyun echo -e "A \tbuild dummy A" 11*4882a593Smuzhiyun echo -e "B \tbuild dummy B" 12*4882a593Smuzhiyun echo -e "C \tbuild dummy C" 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun# Test: 15*4882a593Smuzhiyun# ./build.sh shell 16*4882a593Smuzhiyun# ./device/rockchip/common/build-hooks/example.sh -h 17*4882a593Smuzhiyun# Output: 18*4882a593Smuzhiyun# Usage: ./device/rockchip/common/build-hooks/example.sh [OPTIONS] 19*4882a593Smuzhiyun# dummy build dummy 20*4882a593Smuzhiyun# A build dummy A 21*4882a593Smuzhiyun# B build dummy B 22*4882a593Smuzhiyun# C build dummy C 23*4882a593Smuzhiyun# clean cleanup 24*4882a593Smuzhiyun# help usage 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun# Test: 28*4882a593Smuzhiyun# ./build.sh -h 29*4882a593Smuzhiyun# Output: 30*4882a593Smuzhiyun# Usage: build.sh [OPTIONS] 31*4882a593Smuzhiyun# Available options: 32*4882a593Smuzhiyun# dummy build dummy 33*4882a593Smuzhiyun# A build dummy A 34*4882a593Smuzhiyun# B build dummy B 35*4882a593Smuzhiyun# C build dummy C 36*4882a593Smuzhiyun} 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun# Cleanup hook for "./build.sh cleanall" 39*4882a593Smuzhiyunclean_hook() 40*4882a593Smuzhiyun{ 41*4882a593Smuzhiyun echo "cleanup $NAME" 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun# Test: 44*4882a593Smuzhiyun# ./build.sh cleanall 45*4882a593Smuzhiyun# Output: 46*4882a593Smuzhiyun# ... 47*4882a593Smuzhiyun# cleanup example 48*4882a593Smuzhiyun} 49*4882a593Smuzhiyun 50*4882a593Smuzhiyun# Build stages: 51*4882a593Smuzhiyun# init (preparing SDK configs, etc.) 52*4882a593Smuzhiyun# (inherit configs) 53*4882a593Smuzhiyun# pre-build (submodule configuring, etc.) 54*4882a593Smuzhiyun# build (building, etc.) 55*4882a593Smuzhiyun# post-build (firmware packing, etc.) 56*4882a593Smuzhiyun# 57*4882a593Smuzhiyun# <STAGE>_CMDS: 58*4882a593Smuzhiyun# call "<stage>_hook <command> [args]" when commands matched 59*4882a593Smuzhiyun# "default" command means unconditional match. 60*4882a593Smuzhiyun# args are parsed from command:arg1:arg2... 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun# Call init_hook() in init stage for "dummy" command and call it again 63*4882a593Smuzhiyun# unconditionally 64*4882a593SmuzhiyunINIT_CMDS="dummy default" 65*4882a593Smuzhiyuninit_hook() 66*4882a593Smuzhiyun{ 67*4882a593Smuzhiyun echo "init hook for $0 - $@" 68*4882a593Smuzhiyun finish_build init-$NAME $@ 69*4882a593Smuzhiyun 70*4882a593Smuzhiyun# Test: 71*4882a593Smuzhiyun# ./build.sh dummy 72*4882a593Smuzhiyun# Output: 73*4882a593Smuzhiyun# ... 74*4882a593Smuzhiyun# init hook for /XXX/device/rockchip/common/build-hooks/example.sh - dummy 75*4882a593Smuzhiyun# Running example.sh - init-example dummy succeeded. 76*4882a593Smuzhiyun# init hook for /XXX/device/rockchip/common/build-hooks/example.sh - default 77*4882a593Smuzhiyun# Running example.sh - init-example default succeeded. 78*4882a593Smuzhiyun} 79*4882a593Smuzhiyun 80*4882a593Smuzhiyun# Call pre_build_hook() in pre-build stage unconditionally and call it again 81*4882a593Smuzhiyun# for "A" command 82*4882a593SmuzhiyunPRE_BUILD_CMDS="default A" 83*4882a593Smuzhiyunpre_build_hook() 84*4882a593Smuzhiyun{ 85*4882a593Smuzhiyun echo "pre-build hook for $0 - $@" 86*4882a593Smuzhiyun finish_build pre-build-$NAME $@ 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun# Test: 89*4882a593Smuzhiyun# ./build.sh A 90*4882a593Smuzhiyun# Output: 91*4882a593Smuzhiyun# ... 92*4882a593Smuzhiyun# pre-build hook for /XXX/device/rockchip/common/build-hooks/example.sh - default 93*4882a593Smuzhiyun# Running example.sh - pre-build-example default succeeded. 94*4882a593Smuzhiyun# pre-build hook for /XXX/device/rockchip/common/build-hooks/example.sh - A 95*4882a593Smuzhiyun# Running example.sh - pre-build-example A succeeded. 96*4882a593Smuzhiyun} 97*4882a593Smuzhiyun 98*4882a593Smuzhiyun# Call build_hook() in build stage for "B" and "C" commands 99*4882a593SmuzhiyunBUILD_CMDS="B C" 100*4882a593Smuzhiyunbuild_hook() 101*4882a593Smuzhiyun{ 102*4882a593Smuzhiyun echo "build hook for $0 - $@" 103*4882a593Smuzhiyun finish_build build-$NAME $@ 104*4882a593Smuzhiyun 105*4882a593Smuzhiyun# Test: 106*4882a593Smuzhiyun# ./build.sh C B 107*4882a593Smuzhiyun# Output: 108*4882a593Smuzhiyun# ... 109*4882a593Smuzhiyun# build hook for /XXX/device/rockchip/common/build-hooks/example.sh - C 110*4882a593Smuzhiyun# Running example.sh - build-example C succeeded. 111*4882a593Smuzhiyun# build hook for /XXX/device/rockchip/common/build-hooks/example.sh - B 112*4882a593Smuzhiyun# Running example.sh - build-example B succeeded. 113*4882a593Smuzhiyun} 114*4882a593Smuzhiyun 115*4882a593Smuzhiyun# Call post_build_hook() in post-build stage for "A" "C" and "B" commands 116*4882a593SmuzhiyunPOST_BUILD_CMDS="A C B" 117*4882a593Smuzhiyunpost_build_hook() 118*4882a593Smuzhiyun{ 119*4882a593Smuzhiyun echo "post-build hook for $0 - $@" 120*4882a593Smuzhiyun finish_build post-build-$NAME $@ 121*4882a593Smuzhiyun 122*4882a593Smuzhiyun# Test: 123*4882a593Smuzhiyun# ./build.sh A:arg1:arg2 124*4882a593Smuzhiyun# Output: 125*4882a593Smuzhiyun# ... 126*4882a593Smuzhiyun# post-build hook for /XXX/device/rockchip/common/build-hooks/example.sh - A arg1 arg2 127*4882a593Smuzhiyun# Running example.sh - post-build-example A arg1 arg2 succeeded. 128*4882a593Smuzhiyun} 129*4882a593Smuzhiyun 130*4882a593Smuzhiyun# 1: Inherit initial checks 131*4882a593Smuzhiyun# Make sure that it's been executed inside of build.sh, or after 132*4882a593Smuzhiyun# "./build.sh shell" for developing. 133*4882a593Smuzhiyun# 2: Call build hooks when needed 134*4882a593Smuzhiyunsource "${BUILD_HELPER:-$(dirname "$(realpath "$0")")/../build-hooks/build-helper}" 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun# Test: 137*4882a593Smuzhiyun# ./device/rockchip/common/build-hooks/example.sh 138*4882a593Smuzhiyun# Output: 139*4882a593Smuzhiyun# /XXX/device/rockchip/common/build-hooks/example.sh.in is not supposed to be executed directly 140*4882a593Smuzhiyun 141*4882a593Smuzhiyun# Reaching here when executed directly(not from hook triggers) 142*4882a593Smuzhiyun 143*4882a593Smuzhiyunecho "$0 is executed directly${@:+ with $@}." 144*4882a593Smuzhiyun 145*4882a593Smuzhiyun# Do something 146*4882a593Smuzhiyun 147*4882a593Smuzhiyun# Test: 148*4882a593Smuzhiyun# ./build.sh shell 149*4882a593Smuzhiyun# ./device/rockchip/common/build-hooks/example.sh 150*4882a593Smuzhiyun# Output: 151*4882a593Smuzhiyun# ... 152*4882a593Smuzhiyun# ./device/rockchip/common/build-hooks/example.sh is executed directly. 153