Got tired of typing the same sync/clone/build commands for every device, so now everything lives in config.json (codename, vendor, tree repo, fox branch, build target, env vars). The script handles: - syncing fox sources via the official orangefox_sync.sh - cloning/updating the device tree into device/<vendor>/<codename> - exporting env vars from the json and running mka Also supports -s/-c/-b flags to run each step separately. Signed-off-by: cloudy <cloudy.nguyn@outlook.com>
146 lines
3.9 KiB
Shell
146 lines
3.9 KiB
Shell
#!/bin/bash
|
|
# ofox-build.sh
|
|
# quick script to build OrangeFox without typing the same 20 commands every time
|
|
# reads everything from config.json so I dont have to edit the script per device
|
|
#
|
|
# usage: ./ofox-build.sh [config.json]
|
|
# -s sync only
|
|
# -c clone tree only
|
|
# -b build only
|
|
|
|
set -e
|
|
|
|
CONFIG="config.json"
|
|
MODE="all"
|
|
|
|
# arg parsing, nothing fancy
|
|
while getopts "scbh" opt; do
|
|
case $opt in
|
|
s) MODE="sync";;
|
|
c) MODE="clone";;
|
|
b) MODE="build";;
|
|
h) sed -n '2,9p' "$0"; exit 0;;
|
|
esac
|
|
done
|
|
shift $((OPTIND-1))
|
|
[ -n "$1" ] && CONFIG="$1"
|
|
|
|
if ! command -v jq >/dev/null; then
|
|
echo "need jq installed (sudo apt install jq)"
|
|
exit 1
|
|
fi
|
|
|
|
if [ ! -f "$CONFIG" ]; then
|
|
# no config.json? maybe theres a <codename>.json laying around
|
|
FOUND=$(ls *.json 2>/dev/null | head -n1)
|
|
if [ -n "$FOUND" ]; then
|
|
echo "using $FOUND"
|
|
CONFIG="$FOUND"
|
|
else
|
|
echo "cant find $CONFIG (or any .json here)"
|
|
exit 1
|
|
fi
|
|
fi
|
|
|
|
# pull stuff out of the json
|
|
FOX_BRANCH=$(jq -r '.fox.branch' "$CONFIG")
|
|
SYNC_DIR=$(eval echo "$(jq -r '.fox.sync_dir' "$CONFIG")")
|
|
BUILD_DIR=$(eval echo "$(jq -r '.fox.build_dir' "$CONFIG")")
|
|
|
|
CODENAME=$(jq -r '.device.codename' "$CONFIG")
|
|
VENDOR=$(jq -r '.device.vendor' "$CONFIG")
|
|
TREE_REPO=$(jq -r '.device.tree_repo' "$CONFIG")
|
|
TREE_BRANCH=$(jq -r '.device.tree_branch // "main"' "$CONFIG")
|
|
|
|
TARGET=$(jq -r '.build.target // "recoveryimage"' "$CONFIG")
|
|
JOBS=$(jq -r '.build.jobs // 0' "$CONFIG")
|
|
CLEAN=$(jq -r '.build.clean_before_build // false' "$CONFIG")
|
|
CCACHE_ON=$(jq -r '.build.ccache // true' "$CONFIG")
|
|
CCACHE_SIZE=$(jq -r '.build.ccache_size // "50G"' "$CONFIG")
|
|
|
|
# 0 = use all cores
|
|
[ "$JOBS" = "0" ] && JOBS=$(nproc)
|
|
|
|
if [ "$CODENAME" = "null" ] || [ -z "$CODENAME" ]; then
|
|
echo "no codename in config??"
|
|
exit 1
|
|
fi
|
|
|
|
echo "=========================================="
|
|
echo " OrangeFox $FOX_BRANCH for $VENDOR/$CODENAME"
|
|
echo " build dir: $BUILD_DIR"
|
|
echo " jobs: $JOBS"
|
|
echo "=========================================="
|
|
|
|
do_sync() {
|
|
# dont resync if we already have sources, takes forever
|
|
if [ -d "$BUILD_DIR/.repo" ]; then
|
|
echo "sources already there, skipping sync"
|
|
return
|
|
fi
|
|
|
|
echo ">> syncing fox sources, go grab a coffee..."
|
|
mkdir -p "$SYNC_DIR"
|
|
if [ ! -d "$SYNC_DIR/sync" ]; then
|
|
git clone https://gitlab.com/OrangeFox/sync.git "$SYNC_DIR/sync"
|
|
fi
|
|
cd "$SYNC_DIR/sync"
|
|
./orangefox_sync.sh --branch "$FOX_BRANCH" --path "$BUILD_DIR"
|
|
}
|
|
|
|
do_clone() {
|
|
DEST="$BUILD_DIR/device/$VENDOR/$CODENAME"
|
|
echo ">> device tree -> $DEST"
|
|
|
|
if [ -d "$DEST/.git" ]; then
|
|
# already cloned, just update it
|
|
cd "$DEST"
|
|
git fetch origin "$TREE_BRANCH"
|
|
git checkout "$TREE_BRANCH"
|
|
git pull origin "$TREE_BRANCH" || true
|
|
else
|
|
git clone -b "$TREE_BRANCH" "$TREE_REPO" "$DEST"
|
|
fi
|
|
}
|
|
|
|
do_build() {
|
|
cd "$BUILD_DIR"
|
|
|
|
# export whatever is in the env section of the json
|
|
for kv in $(jq -r '.env // {} | to_entries[] | "\(.key)=\(.value)"' "$CONFIG"); do
|
|
export "$kv"
|
|
echo " $kv"
|
|
done
|
|
|
|
if [ "$CCACHE_ON" = "true" ] && command -v ccache >/dev/null; then
|
|
export USE_CCACHE=1
|
|
export CCACHE_EXEC=$(which ccache)
|
|
ccache -M "$CCACHE_SIZE" >/dev/null
|
|
fi
|
|
|
|
export LC_ALL=C
|
|
source build/envsetup.sh
|
|
|
|
[ "$CLEAN" = "true" ] && make clean
|
|
|
|
# newer trees use twrp_ prefix, older ones omni_
|
|
lunch twrp_${CODENAME}-eng 2>/dev/null || lunch omni_${CODENAME}-eng || {
|
|
echo "lunch failed, check the tree makefile name"
|
|
exit 1
|
|
}
|
|
|
|
echo ">> building, this will take a while"
|
|
mka $TARGET -j$JOBS
|
|
|
|
OUT="$BUILD_DIR/out/target/product/$CODENAME"
|
|
echo ""
|
|
echo ">> done! output files:"
|
|
ls -lh "$OUT"/OrangeFox* 2>/dev/null || ls -lh "$OUT"/*.img
|
|
}
|
|
|
|
case $MODE in
|
|
sync) do_sync;;
|
|
clone) do_clone;;
|
|
build) do_build;;
|
|
all) do_sync && do_clone && do_build;;
|
|
esac
|