firmware-base/scripts/bundle-uploader.sh

84 lines
2.7 KiB
Bash

#!/bin/bash
#
# Creates a standalone Windows executable for the uploader utility.
#
# This script uses PyInstaller to bundle the 'upload_littlefs.py' script and its
# dependencies into a single .exe file. This allows running the uploader on
# Windows without a full Python environment.
#
# It bundles 'esptool.exe' and 'mklittlefs.exe' directly into the executable.
#
# PREREQUISITES:
# - Python must be installed and accessible from the shell.
# - PyInstaller must be installed (`pip install pyinstaller`).
# - 'mklittlefs.exe' and 'esptool.exe' must be placed in the 'scripts/' directory.
#
# USAGE:
# 1. Run this script: ./scripts/bundle-uploader.sh
# 2. Place firmware files into the generated 'dist/' directory.
# 3. Run 'dist/cassandra-uploader.exe' to upload.
set -e
echo "--- Bundling Full Uploader for Windows ---"
# --- Configuration ---
TARGET_SCRIPT="scripts/upload_littlefs.py"
EXE_NAME="cassandra-uploader"
# List of binaries to bundle. Assumes they are in the 'scripts' folder.
# The ':.' part places them in the root of the bundle's temporary directory.
BINARIES_TO_ADD=(
"scripts/mklittlefs.exe:."
"scripts/esptool.exe:."
)
# --- Pre-flight Checks ---
if ! command -v pyinstaller &> /dev/null; then
echo "❌ Error: PyInstaller is not installed or not in your PATH."
echo "Please install it by running: pip install pyinstaller"
exit 1
fi
for binary_path in "${BINARIES_TO_ADD[@]}"; do
# Strip the ':.' suffix for the check
actual_path="${binary_path%:.*}"
if [ ! -f "$actual_path" ]; then
echo "❌ Error: Required binary '$actual_path' was not found."
echo "Please ensure it is in the 'scripts' directory."
exit 1
fi
done
echo "✅ Pre-flight checks passed. Starting PyInstaller..."
# --- Build PyInstaller Command ---
PYINSTALLER_CMD=(
"pyinstaller"
"--noconfirm"
"--onefile"
"--name" "$EXE_NAME"
# Add hidden imports for pyserial to ensure port detection works in the bundle.
"--hidden-import=serial.tools.list_ports"
"--hidden-import=serial.tools.list_ports_windows"
)
for binary in "${BINARIES_TO_ADD[@]}"; do
PYINSTALLER_CMD+=("--add-binary" "$binary")
done
PYINSTALLER_CMD+=("$TARGET_SCRIPT")
# --- Run PyInstaller ---
echo "Running command: ${PYINSTALLER_CMD[*]}"
"${PYINSTALLER_CMD[@]}"
echo ""
echo "---"
echo "✅ Success! Bundled executable created at: dist/$EXE_NAME.exe"
echo ""
echo "➡️ NEXT STEPS:"
echo " 1. Copy your firmware files ('firmware.bin', etc.) into the 'dist/' folder."
echo " 2. Ensure 'pm-fw-cli.exe' and 'assets/network.json' are present in 'dist/' for --restore feature."
echo " 3. Run 'dist/$EXE_NAME.exe' to upload everything to your device."
echo "---"