From 2cf073e7d84b078dcd2b3bc088209f9d23dc34c5 Mon Sep 17 00:00:00 2001 From: Georg Brandl Date: Thu, 23 Feb 2023 13:47:50 +0100 Subject: [PATCH] installer: add config for frappy gui exe Change-Id: I1abc325f685f8e95fac281b419be3defcc1e4485 Reviewed-on: https://forge.frm2.tum.de/review/c/secop/frappy/+/30508 Tested-by: Jenkins Automated Tests Reviewed-by: Georg Brandl --- installer/README | 3 +++ installer/frappy-gui.spec | 33 +++++++++++++++++++++++++++++ installer/utils.py | 43 ++++++++++++++++++++++++++++++++++++++ requirements-gui.txt | 1 + requirements-installer.txt | 1 + 5 files changed, 81 insertions(+) create mode 100644 installer/README create mode 100644 installer/frappy-gui.spec create mode 100644 installer/utils.py create mode 100644 requirements-installer.txt diff --git a/installer/README b/installer/README new file mode 100644 index 0000000..e73349b --- /dev/null +++ b/installer/README @@ -0,0 +1,3 @@ +To build the exe file, invoke: + +pyinstaller frappy-gui.spec diff --git a/installer/frappy-gui.spec b/installer/frappy-gui.spec new file mode 100644 index 0000000..f385903 --- /dev/null +++ b/installer/frappy-gui.spec @@ -0,0 +1,33 @@ +# -*- mode: python -*- + +import sys +from os import path + +sys.path.insert(0, path.abspath('.')) + +from utils import rootdir, find_uis, find_modules + +binscript = path.join(rootdir, 'bin', 'frappy-gui') + + +a = Analysis([binscript], + pathex=[rootdir], + binaries=[], + datas=find_uis() + [ + (path.join(rootdir, 'frappy', 'RELEASE-VERSION'), 'frappy')], + hiddenimports=find_modules('frappy', 'gui'), + hookspath=[], + excludes=['matplotlib'], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=None) +pyz = PYZ(a.pure, a.zipped_data, cipher=None) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + name='frappy-gui', + strip=False, + debug=False, + console=False) diff --git a/installer/utils.py b/installer/utils.py new file mode 100644 index 0000000..de2b80d --- /dev/null +++ b/installer/utils.py @@ -0,0 +1,43 @@ +# -*- coding: utf-8 -*- + +import os +import subprocess +import sys +from os import path + +rootdir = path.abspath('..') +guidirs = [path.join('frappy', 'gui')] + +# Make sure to generate the version file. +os.environ['PYTHONPATH'] = os.environ.get('PYTHONPATH', '') + path.pathsep + rootdir +subprocess.check_call([sys.executable, + path.join(rootdir, 'frappy', 'version.py')]) + + +# Include all .ui files for the main GUI module. +def find_uis(): + res = [] + for guidir in guidirs: + for root, _dirs, files in os.walk(path.join(rootdir, guidir)): + if any(uifile for uifile in files if uifile.endswith('.ui')): + res.append((path.join(root, '*.ui'), + path.join(guidir, + root[len(path.join(rootdir, guidir)) + 1:]))) + return res + + +# Include all modules found in a certain package -- they may not be +# automatically found because of dynamic importing via the guiconfig file +# and custom widgets in .ui files. +def find_modules(*modules): + res = [] + startdir = path.join(rootdir, *modules) + startmod = '.'.join(modules) + '.' + for root, _dirs, files in os.walk(startdir): + modpath = root[len(startdir) + 1:].replace(path.sep, '.') + if modpath: + modpath += '.' + for mod in files: + if mod.endswith('.py'): + res.append(startmod + modpath + mod[:-3]) + return res diff --git a/requirements-gui.txt b/requirements-gui.txt index b9431b7..8838ff3 100644 --- a/requirements-gui.txt +++ b/requirements-gui.txt @@ -1,2 +1,3 @@ +mlzlog PyQt5 pyqtgraph diff --git a/requirements-installer.txt b/requirements-installer.txt new file mode 100644 index 0000000..8ea5ca5 --- /dev/null +++ b/requirements-installer.txt @@ -0,0 +1 @@ +-r requirements-gui.txt