From ee18dcab315fa32693dad4eb6b5d217e29841ee3 Mon Sep 17 00:00:00 2001
From: Mark Qvist <mark@unsigned.io>
Date: Wed, 27 Nov 2024 13:14:46 +0100
Subject: [PATCH] Preparation for Windows build

---
 main.py                |  1 +
 sbapp/main.py          |  3 ++
 sbapp/sideband/core.py |  8 +++--
 sideband.spec          | 67 ++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 76 insertions(+), 3 deletions(-)
 create mode 100644 main.py
 create mode 100644 sideband.spec

diff --git a/main.py b/main.py
new file mode 100644
index 0000000..8518858
--- /dev/null
+++ b/main.py
@@ -0,0 +1 @@
+import sbapp.main
\ No newline at end of file
diff --git a/sbapp/main.py b/sbapp/main.py
index a8446c2..aa7ca6c 100644
--- a/sbapp/main.py
+++ b/sbapp/main.py
@@ -6118,3 +6118,6 @@ def run():
 
 if __name__ == "__main__":
     run()
+
+if __name__ == "sbapp.main":
+    run()
\ No newline at end of file
diff --git a/sbapp/sideband/core.py b/sbapp/sideband/core.py
index 137dc8d..48ce9ee 100644
--- a/sbapp/sideband/core.py
+++ b/sbapp/sideband/core.py
@@ -178,19 +178,21 @@ class SidebandCore():
         self.cache_dir       = self.app_dir+"/cache"
         
         self.rns_configdir = None
+
+        core_path          = os.path.abspath(__file__)
+        if "core.pyc" in core_path:
+            core_path      = core_path.replace("core.pyc", "core.py")
+
         if RNS.vendor.platformutils.is_android():
             self.app_dir = android_app_dir+"/io.unsigned.sideband/files/"
             self.cache_dir = self.app_dir+"/cache"
             self.rns_configdir = self.app_dir+"/app_storage/reticulum"
             self.asset_dir     = self.app_dir+"/app/assets"
         elif RNS.vendor.platformutils.is_darwin():
-            core_path          = os.path.abspath(__file__)
             self.asset_dir     = core_path.replace("/sideband/core.py", "/assets")
         elif RNS.vendor.platformutils.get_platform() == "linux":
-            core_path          = os.path.abspath(__file__)
             self.asset_dir     = core_path.replace("/sideband/core.py", "/assets")
         elif RNS.vendor.platformutils.is_windows():
-            core_path          = os.path.abspath(__file__)
             self.asset_dir     = core_path.replace("\\sideband\\core.py", "\\assets")
         else:
             self.asset_dir     = plyer.storagepath.get_application_dir()+"/sbapp/assets"
diff --git a/sideband.spec b/sideband.spec
new file mode 100644
index 0000000..eb01ad4
--- /dev/null
+++ b/sideband.spec
@@ -0,0 +1,67 @@
+# -*- mode: python ; coding: utf-8 -*-
+
+from kivy_deps import sdl2, glew
+
+a = Analysis(
+    ['main.py'],
+    pathex=[],
+    binaries=[],
+    datas=[],
+    hiddenimports=[],
+    hookspath=[],
+    hooksconfig={},
+    runtime_hooks=[],
+    excludes=[],
+    noarchive=False,
+    optimize=0,
+)
+pyz = PYZ(a.pure)
+
+def extra_datas(mydir):
+    def rec_glob(p, files):
+        import os
+        import glob
+        for d in glob.glob(p):
+            if os.path.isfile(d):
+                files.append(d)
+            rec_glob("%s/*" % d, files)
+    files = []
+    rec_glob("%s/*" % mydir, files)
+    extra_datas = []
+    for f in files:
+        extra_datas.append((f, f, 'DATA'))
+
+    return extra_datas
+
+a.datas += extra_datas('sbapp')
+a.datas += extra_datas('RNS')
+a.datas += extra_datas('LXMF')
+
+exe = EXE(
+    pyz,
+    a.scripts,
+    [],
+    exclude_binaries=True,
+    name='main',
+    debug=False,
+    bootloader_ignore_signals=False,
+    strip=False,
+    upx=True,
+    console=True,
+    disable_windowed_traceback=False,
+    argv_emulation=False,
+    target_arch=None,
+    codesign_identity=None,
+    entitlements_file=None,
+)
+
+coll = COLLECT(
+    exe,
+    a.binaries,
+    a.datas,
+    *[Tree(p) for p in (sdl2.dep_bins + glew.dep_bins)],
+    strip=False,
+    upx=True,
+    upx_exclude=[],
+    name='main',
+)