33 lines
1.4 KiB
Bash
33 lines
1.4 KiB
Bash
|
|
#!/usr/bin/env bash
|
||
|
|
# Build the PyInstaller single-binary for the OTA (plan Phase 1 packaging).
|
||
|
|
# Output: dist/archy-reticulum-daemon — drop next to /usr/local/bin/archipelago.
|
||
|
|
set -euo pipefail
|
||
|
|
cd "$(dirname "${BASH_SOURCE[0]}")"
|
||
|
|
|
||
|
|
if [ ! -d .venv ]; then
|
||
|
|
python3 -m venv .venv
|
||
|
|
fi
|
||
|
|
.venv/bin/pip install -q -r requirements.txt -r requirements-build.txt
|
||
|
|
|
||
|
|
rm -rf build dist archy-reticulum-daemon.spec
|
||
|
|
|
||
|
|
# --collect-submodules: RNS/LXMF load most of their own internals dynamically
|
||
|
|
# (interface drivers, transport backends), which PyInstaller's static import
|
||
|
|
# analysis can't see from a plain `import RNS`.
|
||
|
|
#
|
||
|
|
# -d noarchive is NOT optional: RNS.Interfaces/__init__.py builds its
|
||
|
|
# `__all__` by glob-ing *.py/*.pyc next to its own `__file__` at import time
|
||
|
|
# (`from RNS.Interfaces import *` in Reticulum.py relies on that). PyInstaller
|
||
|
|
# normally zips pure-Python modules into an in-binary PYZ archive, so
|
||
|
|
# `__file__` doesn't point at a real directory and the glob comes back empty
|
||
|
|
# -> `NameError: name 'Interface' is not defined` at RNS.Reticulum() bring-up.
|
||
|
|
# noarchive keeps modules as loose .pyc files on disk so the glob still works.
|
||
|
|
.venv/bin/pyinstaller --onefile --name archy-reticulum-daemon --clean --noconfirm \
|
||
|
|
--collect-submodules RNS \
|
||
|
|
--collect-submodules LXMF \
|
||
|
|
--collect-data RNS \
|
||
|
|
-d noarchive \
|
||
|
|
reticulum_daemon.py
|
||
|
|
|
||
|
|
echo "Built dist/archy-reticulum-daemon ($(du -h dist/archy-reticulum-daemon | cut -f1))"
|