OreBolt-OS/build.sh

267 lines
11 KiB
Bash
Executable File

#!/bin/bash
# ==============================================================================
# build.sh -- OREBOLT OS v1.7 build orchestrator
# ==============================================================================
# Phases:
# 0 host dep check (pacman)
# 1 toolchain verification (mipsel-linux-musl-*)
# 2 workspace integrity check (17 modules + headers + scripts)
# 3 overlay/ tree creation
# 4 permission fixups on init scripts
# 5 H2 Core v6.5 build (LVGL clone + liblvgl.so + h2_test + 17 modules + mapper)
# 6 OreBolt OS v1.7 build (liborebolt.a + 150-payload matrix)
# 7 artifact verification (MIPS LE ELF check, sizes)
# 8 optional --deploy to SD card
#
# v1.7 changes:
# * 17 .mod binaries + 1 standalone daemon (unchanged count).
# * retro_input_mapper is a standalone uinput gamepad daemon.
# * Documentation and source comments cleaned for consistency.
# ==============================================================================
set -euo pipefail
CROSS_COMPILE="${CROSS_COMPILE:-mipsel-linux-musl-}"
KERNEL_HEADERS="${KERNEL_HEADERS:-/opt/fiio-m3k-linux}"
SD_CARD_MOUNT="${SD_CARD_MOUNT:-/mnt/h2-sd}"
NO_COLOR="${NO_COLOR:-}"
# ANSI color helpers
if [ -z "$NO_COLOR" ]; then
C_RESET="\033[0m"; C_OK="\033[1;32m"; C_WARN="\033[1;33m"
C_ERR="\033[1;31m"; C_INFO="\033[1;36m"
else
C_RESET=""; C_OK=""; C_WARN=""; C_ERR=""; C_INFO=""
fi
log() { echo -e "${C_INFO}[*]${C_RESET} $*"; }
ok() { echo -e "${C_OK}[OK]${C_RESET} $*"; }
warn() { echo -e "${C_WARN}[!]${C_RESET} $*"; }
die() { echo -e "${C_ERR}[-]${C_RESET} $*"; exit 1; }
DEPLOY=0
CLEAN=0
BACKUP_STOCK=0
for arg in "$@"; do
case "$arg" in
--deploy) DEPLOY=1 ;;
--deploy-only) DEPLOY=1; SKIP_BUILD=1 ;;
--backup-stock) BACKUP_STOCK=1 ;;
--clean) CLEAN=1 ;;
--help|-h)
cat <<EOF
OreBolt OS v1.7 build orchestrator
Usage: $0 [--deploy|--deploy-only|--backup-stock|--clean|--help]
Options:
--deploy Build and deploy to SD card
--deploy-only Deploy only (skip build)
--backup-stock Snapshot stock firmware before first deploy
(enables "Restore Hiby Player" in System Tools)
--clean Remove build artifacts
Environment:
CROSS_COMPILE Toolchain prefix (default: mipsel-linux-musl-)
KERNEL_HEADERS FiiO M3K GPL kernel tree (default: /opt/fiio-m3k-linux)
SD_CARD_MOUNT SD card mount point (default: /mnt/h2-sd)
HARDWARE_GPIO Set to 1 to compile real GPIO panic-purge path
NO_COLOR Set to 1 to disable ANSI color
EOF
exit 0 ;;
*) die "unknown arg: $arg" ;;
esac
done
# --- Phase 0: host deps ------------------------------------------------------
log "Phase 0: checking host dependencies..."
for pkg in base-devel git make python3 rsync dosfstools e2fsprogs parted file; do
if ! pacman -Qi "$pkg" >/dev/null 2>&1; then
warn "missing package: $pkg (installing...)"
sudo pacman -S --noconfirm "$pkg" || die "install failed for $pkg"
fi
done
ok "host deps satisfied"
# --- Phase 1: toolchain ------------------------------------------------------
log "Phase 1: verifying cross toolchain..."
for bin in gcc strip ar ranlib; do
if ! command -v "${CROSS_COMPILE}${bin}" >/dev/null 2>&1; then
die "missing toolchain binary: ${CROSS_COMPILE}${bin}"
fi
done
TARGET=$("${CROSS_COMPILE}gcc" -dumpmachine 2>/dev/null || true)
case "$TARGET" in
*mips*) ok "toolchain target: $TARGET" ;;
*) die "compiler target '$TARGET' does not look like MIPS" ;;
esac
# Kernel headers tree presence check
if [ ! -d "$KERNEL_HEADERS" ]; then
die "KERNEL_HEADERS not found at $KERNEL_HEADERS (see HEADERS.md)"
fi
if [ ! -f "$KERNEL_HEADERS/include/uapi/linux/kernel.h" ]; then
die "$KERNEL_HEADERS does not look like a Linux kernel tree"
fi
ok "kernel headers root: $KERNEL_HEADERS"
export KERNEL_HEADERS
# --- Phase 2: workspace integrity -------------------------------------------
log "Phase 2: verifying workspace integrity..."
for f in main.c h2_ui.h log_manager.h lv_conf.h.dist Makefile \
Makefile.h2-core-v6.2 Makefile.orebolt-v1.5 build.sh inject_payloads.sh \
PREREQUISITES.md QUICKSTART.md HEADERS.md LICENSE.md CHANGELOG.md \
ARCHITECTURE.md README.md BUILD_MANIFEST.txt SHA256SUMS; do
[ -f "$f" ] || die "missing required file: $f"
done
# 17 modules + 1 standalone daemon (mapper)
EXPECTED_MODULES=(
vault nettap deploy studio probe vterm pauto extract noise reset
retro retro_input_mapper rfid glitch pwdb proxalarm bitchat
)
for m in "${EXPECTED_MODULES[@]}"; do
# locate the module source -- names don't always match the dir
found=0
for path in modules/orebolt-${m}/${m}.c \
modules/orebolt-${m}/$(echo $m | sed 's/^retro_input_mapper$/retro_input_mapper/').c; do
if [ -f "$path" ]; then found=1; break; fi
done
[ $found -eq 1 ] || die "missing module source for: $m"
done
ok "17 modules present"
# Hardware library sources
for f in src/modules/mod_core_hid.c src/modules/mod_forensics.c \
src/modules/mod_panic_hardware_purge.c src/modules/mod_panic_purge.c \
src/modules/mod_radio_input_multiplex.c src/modules/mod_ui_frame_graphics.c \
src/modules/mod_bitchat_mesh.c src/modules/panic_purge_api.h; do
[ -f "$f" ] || die "missing: $f"
done
# Init scripts
for f in overlay/etc/init.d/S98retro-input overlay/etc/init.d/S99broker \
overlay/etc/init.d/bt_input_daemon.sh; do
[ -f "$f" ] || die "missing: $f"
done
ok "workspace integrity OK"
if [ "$CLEAN" = "1" ]; then
log "Cleaning build artifacts..."
make clean KERNEL_HEADERS="$KERNEL_HEADERS" || true
exit 0
fi
# --- Phase 3: overlay tree ---------------------------------------------------
log "Phase 3: creating overlay/ tree..."
mkdir -p overlay/usr/lib overlay/usr/bin overlay/apps \
overlay/data/payloads/linux overlay/data/payloads/macos \
overlay/data/payloads/windows overlay/data/vault/payloads \
overlay/data/forensics_bin overlay/data/vterm/freedos/bin \
overlay/etc/init.d
ok "overlay tree ready"
# --- Phase 4: permissions ----------------------------------------------------
log "Phase 4: fixing script permissions..."
chmod +x overlay/etc/init.d/S98retro-input overlay/etc/init.d/S99broker \
overlay/etc/init.d/bt_input_daemon.sh \
overlay/usr/bin/enable_vault_usb.sh overlay/usr/bin/enable_vault_ble.sh \
inject_payloads.sh build.sh 2>/dev/null || true
ok "permissions set"
# --- Phase 5: H2 Core v6.4 ---------------------------------------------------
log "Phase 5: building H2 Core Platform v6.5..."
# LVGL clone fallback (PREREQUISITES §8 troubleshooting path baked in)
if [ ! -d lvgl/src ]; then
log "cloning LVGL v8.3.11 + lv_drivers v8.3.0..."
git clone --depth 1 -b v8.3.11 https://github.com/lvgl/lvgl.git || \
die "LVGL clone failed (see PREREQUISITES §8 for offline fallback)"
git clone --depth 1 -b v8.3.0 https://github.com/lvgl/lv_drivers.git
[ -f lv_conf.h ] || cp lv_conf.h.dist lv_conf.h
[ -f lv_drv_conf.h ] || cp lv_drivers/lv_drv_conf_template.h lv_drv_conf.h
sed -i 's/#if 0/#if 1/' lv_drv_conf.h
sed -i 's/USE_FBDEV 0/USE_FBDEV 1/' lv_drv_conf.h
sed -i 's/USE_EVDEV 0/USE_EVDEV 1/' lv_drv_conf.h
fi
make -f Makefile.h2-core-v6.2 all KERNEL_HEADERS="$KERNEL_HEADERS"
ok "H2 Core v6.5 built"
# --- Phase 6: OreBolt OS v1.7 (liborebolt.a + payloads) -----------------------------------
log "Phase 6: building OreBolt OS v1.7..."
make -f Makefile.orebolt-v1.5 all \
HARDWARE_GPIO="${HARDWARE_GPIO:-0}" \
KERNEL_HEADERS="$KERNEL_HEADERS"
ok "OreBolt OS v1.7 built"
# --- Phase 7: artifact verification -----------------------------------------
log "Phase 7: verifying artifacts..."
verify_mips() {
local f=$1
[ -f "$f" ] || die "missing artifact: $f"
local info
info=$(file "$f")
case "$info" in
*MIPS*LSB*) ok "$(basename $f): MIPS LE ELF" ;;
*) die "BAD: $f -- $info" ;;
esac
}
for f in overlay/usr/bin/h2_test overlay/usr/bin/retro_input_mapper \
overlay/usr/lib/liblvgl.so liborebolt.a; do
verify_mips "$f"
done
for m in "${EXPECTED_MODULES[@]}"; do
verify_mips "overlay/apps/${m}.mod"
done
# bitchat AGPL marker check
if ! strings overlay/apps/bitchat.mod | grep -q "AGPL_BITCHAT"; then
die "bitchat.mod missing AGPL_BITCHAT marker (license violation)"
fi
ok "bitchat AGPL marker present"
# --- Phase 8: deploy ---------------------------------------------------------
if [ "$DEPLOY" = "1" ]; then
[ -d "$SD_CARD_MOUNT" ] || die "SD card mount point missing: $SD_CARD_MOUNT"
# 8a: backup stock firmware (first deploy only)
if [ "$BACKUP_STOCK" = "1" ]; then
log "Phase 8a: backing up stock firmware..."
STOCK_DIR="$SD_CARD_MOUNT/data/stock_backup"
if [ -d "$STOCK_DIR" ]; then
warn "stock backup already exists at $STOCK_DIR (skipping)"
else
mkdir -p "$STOCK_DIR/usr/bin" "$STOCK_DIR/usr/lib" \
"$STOCK_DIR/etc/init.d"
# Snapshot stock binaries (includes Hiby Player)
cp -a "$SD_CARD_MOUNT/usr/bin/"* "$STOCK_DIR/usr/bin/" 2>/dev/null || true
cp -a "$SD_CARD_MOUNT/usr/lib/"* "$STOCK_DIR/usr/lib/" 2>/dev/null || true
# Snapshot stock init configuration
cp -a "$SD_CARD_MOUNT/etc/inittab" "$STOCK_DIR/etc/" 2>/dev/null || true
cp -a "$SD_CARD_MOUNT/etc/init.d/"* "$STOCK_DIR/etc/init.d/" 2>/dev/null || true
# Snapshot any other known stock paths
cp -a "$SD_CARD_MOUNT/res" "$STOCK_DIR/res" 2>/dev/null || true
cp -a "$SD_CARD_MOUNT/setting" "$STOCK_DIR/setting" 2>/dev/null || true
sync
ok "stock firmware backed up to $STOCK_DIR"
ok "Hiby Player restore is now available in System Tools"
fi
fi
# 8b: deploy OreBolt OS
log "Phase 8b: deploying OreBolt OS to $SD_CARD_MOUNT..."
mkdir -p "$SD_CARD_MOUNT/apps" "$SD_CARD_MOUNT/usr/lib" \
"$SD_CARD_MOUNT/usr/bin" "$SD_CARD_MOUNT/etc/init.d" \
"$SD_CARD_MOUNT/data/payloads"
cp -v overlay/usr/lib/liblvgl.so "$SD_CARD_MOUNT/usr/lib/"
cp -v overlay/usr/bin/h2_test "$SD_CARD_MOUNT/usr/bin/"
cp -v overlay/usr/bin/retro_input_mapper "$SD_CARD_MOUNT/usr/bin/"
cp -v overlay/apps/*.mod "$SD_CARD_MOUNT/apps/"
cp -rv overlay/etc/init.d/* "$SD_CARD_MOUNT/etc/init.d/" 2>/dev/null || true
cp -rv overlay/data/payloads "$SD_CARD_MOUNT/data/" 2>/dev/null || true
cp -v liborebolt.a "$SD_CARD_MOUNT/" 2>/dev/null || true
sync
ok "OreBolt OS deployment complete"
fi
ok "OREBOLT OS v1.7 BUILD COMPLETE"