build: add auto-build script for OrangeFox with json config

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>
This commit is contained in:
Cloudy Nguyen 2026-07-19 14:44:07 +07:00
commit 3f1216779e

146
ofox-build.sh Normal file
View file

@ -0,0 +1,146 @@
#!/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