maneshtrader/scripts/build_standalone_app.sh

68 lines
2.6 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
PYTHON_BIN="$ROOT_DIR/.venv/bin/python"
APP_NAME="ManeshTrader"
ICON_PATH="$ROOT_DIR/assets/icon/${APP_NAME}.icns"
if [[ ! -x "$PYTHON_BIN" ]]; then
echo "Missing virtual environment. Run ./run.sh --setup-only first." >&2
exit 1
fi
if [[ ! -f "$ICON_PATH" ]]; then
"$PYTHON_BIN" "$ROOT_DIR/scripts/generate_app_icon.py"
ICONSET_DIR="$ROOT_DIR/assets/icon/${APP_NAME}.iconset"
mkdir -p "$ICONSET_DIR"
sips -z 16 16 "$ROOT_DIR/assets/icon/${APP_NAME}.png" --out "$ICONSET_DIR/icon_16x16.png" >/dev/null
sips -z 32 32 "$ROOT_DIR/assets/icon/${APP_NAME}.png" --out "$ICONSET_DIR/icon_16x16@2x.png" >/dev/null
sips -z 32 32 "$ROOT_DIR/assets/icon/${APP_NAME}.png" --out "$ICONSET_DIR/icon_32x32.png" >/dev/null
sips -z 64 64 "$ROOT_DIR/assets/icon/${APP_NAME}.png" --out "$ICONSET_DIR/icon_32x32@2x.png" >/dev/null
sips -z 128 128 "$ROOT_DIR/assets/icon/${APP_NAME}.png" --out "$ICONSET_DIR/icon_128x128.png" >/dev/null
sips -z 256 256 "$ROOT_DIR/assets/icon/${APP_NAME}.png" --out "$ICONSET_DIR/icon_128x128@2x.png" >/dev/null
sips -z 256 256 "$ROOT_DIR/assets/icon/${APP_NAME}.png" --out "$ICONSET_DIR/icon_256x256.png" >/dev/null
sips -z 512 512 "$ROOT_DIR/assets/icon/${APP_NAME}.png" --out "$ICONSET_DIR/icon_256x256@2x.png" >/dev/null
sips -z 512 512 "$ROOT_DIR/assets/icon/${APP_NAME}.png" --out "$ICONSET_DIR/icon_512x512.png" >/dev/null
cp "$ROOT_DIR/assets/icon/${APP_NAME}.png" "$ICONSET_DIR/icon_512x512@2x.png"
iconutil -c icns "$ICONSET_DIR" -o "$ICON_PATH"
fi
"$PYTHON_BIN" -m pip install -q pyinstaller
TS="$(date +%Y%m%d-%H%M%S)"
OUT_ROOT="$ROOT_DIR/dist-standalone/$TS"
DIST_PATH="$OUT_ROOT/dist"
WORK_PATH="$OUT_ROOT/build"
SPEC_PATH="$OUT_ROOT/spec"
mkdir -p "$DIST_PATH" "$WORK_PATH" "$SPEC_PATH"
"$PYTHON_BIN" -m PyInstaller \
--noconfirm \
--windowed \
--name "$APP_NAME" \
--icon "$ICON_PATH" \
--distpath "$DIST_PATH" \
--workpath "$WORK_PATH" \
--specpath "$SPEC_PATH" \
--add-data "$ROOT_DIR/app.py:." \
--add-data "$ROOT_DIR/manesh_trader:manesh_trader" \
--add-data "$ROOT_DIR/ONBOARDING.md:." \
--collect-all streamlit \
--collect-all streamlit_autorefresh \
--hidden-import yfinance \
--hidden-import pandas \
--collect-all plotly \
"$ROOT_DIR/desktop_launcher.py"
APP_BUNDLE="$DIST_PATH/${APP_NAME}.app"
if [[ ! -d "$APP_BUNDLE" ]]; then
echo "Build failed: ${APP_BUNDLE} not found" >&2
exit 1
fi
echo "Standalone app created: $APP_BUNDLE"
echo "To build DMG from this app:"
echo "APP_BUNDLE_PATH=\"$APP_BUNDLE\" ./scripts/create_installer_dmg.sh"