84 lines
2.7 KiB
Bash
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 "---"
|