feat: multi-device build with per-device targets
Rewrite build.sh to support per-device target/subtarget selection. Adds Asus RT-AX53U (ramips/mt7621), GL-MT6000, upgrades to OpenWrt 25.12.0-rc4, and auto-detects tar.zst vs tar.xz for Image Builder download. Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
121
scripts/build.sh
121
scripts/build.sh
@@ -2,41 +2,59 @@
|
||||
# Parahub Mesh Firmware Builder
|
||||
# Uses OpenWrt Image Builder to create custom firmware with mesh packages.
|
||||
#
|
||||
# Usage: ./scripts/build.sh <profile>
|
||||
# Example: ./scripts/build.sh glinet_gl-axt1800
|
||||
# Usage: ./scripts/build.sh <device>
|
||||
# Example: ./scripts/build.sh axt1800
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
|
||||
PROJECT_DIR="$(dirname "$SCRIPT_DIR")"
|
||||
|
||||
OPENWRT_VERSION="${OPENWRT_VERSION:-25.12.0-rc4}"
|
||||
|
||||
# ============================================================================
|
||||
# Configuration
|
||||
# Device Database (device → target/subtarget + Image Builder profile)
|
||||
# ============================================================================
|
||||
|
||||
OPENWRT_VERSION="${OPENWRT_VERSION:-23.05.5}"
|
||||
OPENWRT_TARGET="${OPENWRT_TARGET:-mediatek/filogic}"
|
||||
BUILDER_URL="https://downloads.openwrt.org/releases/${OPENWRT_VERSION}/targets/${OPENWRT_TARGET}/openwrt-imagebuilder-${OPENWRT_VERSION}-${OPENWRT_TARGET//\//-}.Linux-x86_64.tar.xz"
|
||||
BUILDER_DIR="${PROJECT_DIR}/imagebuilder"
|
||||
|
||||
# Profile mapping (friendly name → Image Builder profile)
|
||||
declare -A PROFILES=(
|
||||
["axt1800"]="glinet_gl-axt1800"
|
||||
["mt3000"]="glinet_gl-mt3000"
|
||||
["ax6s"]="xiaomi_redmi-router-ax6s"
|
||||
)
|
||||
device_config() {
|
||||
local device="$1"
|
||||
case "$device" in
|
||||
axt1800)
|
||||
OPENWRT_TARGET="qualcommax/ipq60xx"
|
||||
PROFILE="glinet_gl-axt1800"
|
||||
;;
|
||||
mt3000)
|
||||
OPENWRT_TARGET="mediatek/filogic"
|
||||
PROFILE="glinet_gl-mt3000"
|
||||
;;
|
||||
mt6000)
|
||||
OPENWRT_TARGET="mediatek/filogic"
|
||||
PROFILE="glinet_gl-mt6000"
|
||||
;;
|
||||
ax6s)
|
||||
OPENWRT_TARGET="mediatek/filogic"
|
||||
PROFILE="xiaomi_redmi-router-ax6s"
|
||||
;;
|
||||
ax53u)
|
||||
OPENWRT_TARGET="ramips/mt7621"
|
||||
PROFILE="asus_rt-ax53u"
|
||||
;;
|
||||
*)
|
||||
return 1
|
||||
;;
|
||||
esac
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
# Packages
|
||||
# ============================================================================
|
||||
|
||||
# Core mesh packages (always included)
|
||||
PACKAGES_CORE=(
|
||||
# batman-adv mesh
|
||||
kmod-batman-adv
|
||||
batctl-full
|
||||
|
||||
# 802.11s mesh support
|
||||
# 802.11s mesh support (replace basic wpad)
|
||||
wpad-mesh-mbedtls
|
||||
-wpad-basic-mbedtls
|
||||
|
||||
@@ -44,12 +62,11 @@ PACKAGES_CORE=(
|
||||
sqm-scripts
|
||||
kmod-sched-cake
|
||||
|
||||
# Utilities
|
||||
# Management
|
||||
luci
|
||||
luci-app-sqm
|
||||
)
|
||||
|
||||
# Full package set
|
||||
PACKAGES_FULL=(
|
||||
"${PACKAGES_CORE[@]}"
|
||||
|
||||
@@ -65,49 +82,68 @@ PACKAGES_FULL=(
|
||||
# ============================================================================
|
||||
|
||||
usage() {
|
||||
echo "Usage: $0 <profile>"
|
||||
echo "Usage: $0 <device>"
|
||||
echo ""
|
||||
echo "Profiles:"
|
||||
for key in "${!PROFILES[@]}"; do
|
||||
echo " ${key} → ${PROFILES[$key]}"
|
||||
done
|
||||
echo "Devices:"
|
||||
echo " axt1800 GL.iNet GL-AXT1800 (Slate AX) qualcommax/ipq60xx"
|
||||
echo " mt3000 GL.iNet GL-MT3000 (Beryl AX) mediatek/filogic"
|
||||
echo " mt6000 GL.iNet GL-MT6000 (Flint 2) mediatek/filogic"
|
||||
echo " ax6s Xiaomi Redmi AX6S mediatek/filogic"
|
||||
echo " ax53u Asus RT-AX53U ramips/mt7621"
|
||||
echo ""
|
||||
echo "OpenWrt version: ${OPENWRT_VERSION} (override with OPENWRT_VERSION env var)"
|
||||
echo ""
|
||||
echo "Environment variables:"
|
||||
echo " OPENWRT_VERSION OpenWrt release (default: ${OPENWRT_VERSION})"
|
||||
echo " OPENWRT_TARGET Target platform (default: ${OPENWRT_TARGET})"
|
||||
echo " PACKAGES_EXTRA Additional packages (space-separated)"
|
||||
exit 1
|
||||
}
|
||||
|
||||
builder_dir() {
|
||||
echo "${PROJECT_DIR}/imagebuilder-${OPENWRT_VERSION}-${OPENWRT_TARGET//\//-}"
|
||||
}
|
||||
|
||||
download_builder() {
|
||||
if [ -d "$BUILDER_DIR" ]; then
|
||||
echo "Image Builder already downloaded, skipping..."
|
||||
local dir
|
||||
dir="$(builder_dir)"
|
||||
|
||||
if [ -d "$dir" ]; then
|
||||
echo "Image Builder already downloaded at ${dir##*/}, skipping..."
|
||||
return
|
||||
fi
|
||||
|
||||
echo "Downloading OpenWrt Image Builder ${OPENWRT_VERSION}..."
|
||||
mkdir -p "$BUILDER_DIR"
|
||||
wget -q --show-progress -O- "$BUILDER_URL" | tar -xJ --strip-components=1 -C "$BUILDER_DIR"
|
||||
# OpenWrt 25.x uses .tar.zst, older uses .tar.xz
|
||||
local base_url="https://downloads.openwrt.org/releases/${OPENWRT_VERSION}/targets/${OPENWRT_TARGET}/openwrt-imagebuilder-${OPENWRT_VERSION}-${OPENWRT_TARGET//\//-}.Linux-x86_64"
|
||||
echo "Downloading OpenWrt Image Builder ${OPENWRT_VERSION} for ${OPENWRT_TARGET}..."
|
||||
mkdir -p "$dir"
|
||||
|
||||
if wget -q --spider "${base_url}.tar.zst" 2>/dev/null; then
|
||||
wget -q --show-progress -O- "${base_url}.tar.zst" | zstd -d | tar -x --strip-components=1 -C "$dir"
|
||||
else
|
||||
wget -q --show-progress -O- "${base_url}.tar.xz" | tar -xJ --strip-components=1 -C "$dir"
|
||||
fi
|
||||
}
|
||||
|
||||
build_firmware() {
|
||||
local profile="$1"
|
||||
local dir
|
||||
dir="$(builder_dir)"
|
||||
local packages="${PACKAGES_FULL[*]} ${PACKAGES_EXTRA:-}"
|
||||
|
||||
echo "Building firmware for profile: ${profile}"
|
||||
echo "Building firmware for profile: ${PROFILE}"
|
||||
echo "Packages: ${packages}"
|
||||
echo "Custom files: ${PROJECT_DIR}/files"
|
||||
|
||||
make -C "$BUILDER_DIR" image \
|
||||
PROFILE="$profile" \
|
||||
make -C "$dir" image \
|
||||
PROFILE="$PROFILE" \
|
||||
PACKAGES="$packages" \
|
||||
FILES="${PROJECT_DIR}/files" \
|
||||
BIN_DIR="${PROJECT_DIR}/output"
|
||||
|
||||
echo ""
|
||||
echo "Build complete! Firmware images:"
|
||||
ls -lh "${PROJECT_DIR}/output/"*.bin 2>/dev/null || echo "(no .bin files found)"
|
||||
ls -lh "${PROJECT_DIR}/output/"*.img* 2>/dev/null || echo "(no .img files found)"
|
||||
ls -lh "${PROJECT_DIR}/output/"*.bin 2>/dev/null || true
|
||||
ls -lh "${PROJECT_DIR}/output/"*.img* 2>/dev/null || true
|
||||
ls -lh "${PROJECT_DIR}/output/"*.itb 2>/dev/null || true
|
||||
}
|
||||
|
||||
# ============================================================================
|
||||
@@ -118,21 +154,20 @@ if [ $# -lt 1 ]; then
|
||||
usage
|
||||
fi
|
||||
|
||||
INPUT_PROFILE="$1"
|
||||
INPUT="$1"
|
||||
|
||||
# Resolve profile name
|
||||
if [ -n "${PROFILES[$INPUT_PROFILE]+x}" ]; then
|
||||
PROFILE="${PROFILES[$INPUT_PROFILE]}"
|
||||
else
|
||||
# Assume it's a raw Image Builder profile name
|
||||
PROFILE="$INPUT_PROFILE"
|
||||
if ! device_config "$INPUT"; then
|
||||
echo "Error: Unknown device '${INPUT}'"
|
||||
echo ""
|
||||
usage
|
||||
fi
|
||||
|
||||
echo "=== Parahub Mesh Firmware Builder ==="
|
||||
echo "Device: ${INPUT}"
|
||||
echo "OpenWrt: ${OPENWRT_VERSION}"
|
||||
echo "Target: ${OPENWRT_TARGET}"
|
||||
echo "Profile: ${PROFILE}"
|
||||
echo ""
|
||||
|
||||
download_builder
|
||||
build_firmware "$PROFILE"
|
||||
build_firmware
|
||||
|
||||
Reference in New Issue
Block a user