267 lines
11 KiB
Bash
Executable File
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"
|