#!/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 </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"