196 lines
4.2 KiB
Bash
Raw Permalink Normal View History

2025-05-10 21:49:39 +08:00
#!/bin/bash -e
if [ -z "$BASH_SOURCE" ];then
echo "Not in bash, switching to it..."
"$(find . -maxdepth 3 -name envsetup.sh | head -n 1 || echo /bin/bash)"
fi
choose_board()
{
echo
echo "Pick a board:"
echo ""
echo ${RK_BOARD_ARRAY[@]} | xargs -n 1 | sed "=" | sed "N;s/\n/. /"
local INDEX
while true; do
read -p "Which would you like? [1]: " INDEX
INDEX=$((${INDEX:-1} - 1))
if echo $INDEX | grep -vq [^0-9]; then
RK_BOARD="${RK_BOARD_ARRAY[$INDEX]}"
[ -z "$RK_BOARD" ] || break
fi
echo
echo "Choice not available. Please try again."
echo
done
}
setup_board()
{
export BUILDROOT_OUTPUT_DIR="$BUILDROOT_DIR/output/$RK_BOARD"
BMAKE="make -C $BUILDROOT_DIR O=$BUILDROOT_OUTPUT_DIR"
if [ $RK_BOARD_ARRAY_LEN -eq 0 ]; then
echo "Continue without defconfig..."
${BMAKE} olddefconfig &>/dev/null
return 0
fi
${BMAKE} "${RK_BOARD}_defconfig"
CONFIG="$BUILDROOT_OUTPUT_DIR/.config"
cp "$CONFIG" "$CONFIG.new"
mv "$CONFIG.old" "$CONFIG" &>/dev/null || return 0
${BMAKE} olddefconfig &>/dev/null
if ! diff "$CONFIG" "$CONFIG.new"; then
read -t 10 -p "Found old config, override it? (y/n):" YES
[ "$YES" = "n" ] || cp "$CONFIG.new" "$CONFIG"
fi
}
bpkg()
{
case "${1:-dir}" in
dir)
if [ -n "$2" ]; then
find "$BUILDROOT_OUTPUT_DIR/build/" -maxdepth 1 \
-type d -name "*$2*" | head -n 1 || \
echo "no pkg build dir for $2." >&2
else
echo $(realpath "$PWD") | \
grep -oE ".*/output/[^/]*/build/[^/]*" || \
echo "not in a pkg build dir." >&2
fi
;;
*)
bpkg dir $1
;;
esac
}
bpkg_run()
{
DIR=$(bpkg dir $2)
[ -d "$DIR" ] || return 1
for stage in $1; do
case "$stage" in
reconfig) bpkg_run "configure build install deploy" $2 ;;
rebuild) bpkg_run "build install deploy" $2 ;;
reinstall) bpkg_run "install deploy" $2 ;;
reconfig-update)
bpkg_run "configure build install update" $2 ;;
rebuild-update) bpkg_run "build install update" $2 ;;
reinstall-update) bpkg_run "install update" $2 ;;
configure|build|deploy|update)
SCRIPT="$DIR/.$stage.sh"
[ -x "$SCRIPT" ] || return 1
"$SCRIPT" || return 1
;;
install)
SCRIPT="$DIR/.staging_install.sh"
if [ -x "$SCRIPT" ]; then
"$SCRIPT" || return 1
fi
SCRIPT="$DIR/.target_install.sh"
if [ -x "$SCRIPT" ]; then
"$SCRIPT" || return 1
SCRIPT="$DIR/.image_install.sh"
if [ -x "$SCRIPT" ]; then
"$SCRIPT" || return 1
fi
continue
fi
SCRIPT="$DIR/.host_install.sh"
if [ -x "$SCRIPT" ]; then
"$SCRIPT" || return 1
continue
fi
return 1
;;
*)
echo "Unknown stage: $stage"
return 1
;;
esac
done
}
main()
{
SCRIPTS_DIR="$(dirname "$(realpath "$BASH_SOURCE")")"
BUILDROOT_DIR="$(dirname "$SCRIPTS_DIR")"
TOP_DIR="$(dirname "$BUILDROOT_DIR")"
echo "Top of tree: $TOP_DIR"
RK_BOARD_ARRAY=(
$(cd "$BUILDROOT_DIR/configs/"; ls rockchip_* | \
grep "$(basename "$1")" | sed "s/_defconfig$//" | sort)
)
RK_BOARD_ARRAY_LEN=${#RK_BOARD_ARRAY[@]}
case $RK_BOARD_ARRAY_LEN in
0)
# Try existing output without defconfig
BOARD="$(echo "$1" | \
sed "s#^\(output/\|\)rockchip_\([^/]*\).*#\2#")"
RK_BOARD="${BOARD:+rockchip_$BOARD}"
CONFIG="$BUILDROOT_DIR/output/$RK_BOARD/.config"
if [ ! -f "$CONFIG" ]; then
unset RK_BOARD
echo "No available configs${1:+" for: $1"}"
return
fi
;;
1)
RK_BOARD=${RK_BOARD_ARRAY[0]}
;;
*)
if [ "$1" = ${RK_BOARD_ARRAY[0]} ]; then
# Prefer exact-match
RK_BOARD="$1"
else
choose_board
fi
;;
esac
setup_board
# Set alias
alias croot='cd "$TOP_DIR"'
alias broot='cd "$BUILDROOT_DIR"'
alias bmake='make -C "$BUILDROOT_OUTPUT_DIR"'
alias bconfig='bpkg_run configure'
alias bbuild='bpkg_run build'
alias binstall='bpkg_run install'
alias bdeploy='bpkg_run deploy'
alias bupdate='bpkg_run update'
alias breconfig='bpkg_run reconfig'
alias brebuild='bpkg_run rebuild'
alias breinstall='bpkg_run reinstall'
alias breconfig-update='bpkg_run reconfig-update'
alias brebuild-update='bpkg_run rebuild-update'
alias breinstall-update='bpkg_run reinstall-update'
}
main "$@"
if [ "$BASH_SOURCE" == "$0" ];then
# This script is executed directly
/bin/bash
fi