summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCirno the Strongest <1447794+CirnoT@users.noreply.github.com>2022-01-21 23:03:02 +0100
committerCalum Lind <calumlind+deluge@gmail.com>2022-01-23 16:04:33 +0000
commite75ef7e31f3a8befd6365acbf8b7ebbb774bb5e5 (patch)
tree0e3335c67ddcba1d9c5dfea72181079b8b32b821
parent4f87612a0f5503a9b824c37c59a75416aefc601d (diff)
downloaddeluge-e75ef7e31f3a8befd6365acbf8b7ebbb774bb5e5.tar.gz
deluge-e75ef7e31f3a8befd6365acbf8b7ebbb774bb5e5.tar.bz2
deluge-e75ef7e31f3a8befd6365acbf8b7ebbb774bb5e5.zip
[Packaging] Simplify PyInstaller spec file
This makes the process of editing the file much more pleasant and removes duplicate code. Fixed collecting twisted package which brings both build speed improvements but also decreases package size, as it stops PyInstaller from bundling tests (actually, some tests might even execute during import and break build if they're designed to throw!) used by PyInstaller Closes: https://github.com/deluge-torrent/deluge/pull/342
-rw-r--r--packaging/win/delugewin.spec490
1 files changed, 184 insertions, 306 deletions
diff --git a/packaging/win/delugewin.spec b/packaging/win/delugewin.spec
index 4fafff049..f79f041b1 100644
--- a/packaging/win/delugewin.spec
+++ b/packaging/win/delugewin.spec
@@ -1,322 +1,200 @@
-
# -*- mode: python ; coding: utf-8 -*-
import os
import sys
import deluge.common
-from PyInstaller.compat import is_win
-from PyInstaller.utils.hooks import collect_all, copy_metadata
+from PyInstaller.utils.hooks import collect_all, collect_submodules, copy_metadata
datas = []
binaries = []
hiddenimports = ['pygame']
-runtime_hooks_gtk = [os.path.join(SPECPATH, 'pyi_rth_gtk_csd.py')]
# Collect Meta Data
datas += copy_metadata('deluge', recursive=True)
datas += copy_metadata('service-identity', recursive=True)
# Add Deluge Hidden Imports
-tmp_ret = collect_all('deluge')
-hiddenimports += tmp_ret[2]
-
-#Add Hidden Imports for Plugins
-tmp_ret2 = collect_all('twisted')
-hiddenimports += tmp_ret2[2]
+hiddenimports += collect_submodules('deluge')
+
+# Add stdlib as Hidden Imports.
+# This is filtered list that excludes some common examples or stuff not useful in plugins (such as tty, mailbox, turtledemo etc.).
+# It is safe to assume that 90% of that list would already be included anyway.
+stdlib = [
+ 'string',
+ 're',
+ 'unicodedata',
+ 'struct',
+ 'codecs',
+ 'datetime',
+ 'zoneinfo',
+ 'calendar',
+ 'collections',
+ 'array',
+ 'weakref',
+ 'types',
+ 'copy',
+ 'enum',
+ 'numbers',
+ 'math',
+ 'cmath',
+ 'decimal',
+ 'fractions',
+ 'random',
+ 'statistics',
+ 'itertools',
+ 'functools',
+ 'operator',
+ 'pathlib',
+ 'fileinput',
+ 'stat',
+ 'tempfile',
+ 'glob',
+ 'fnmatch',
+ 'shutil',
+ 'pickle',
+ 'copyreg',
+ 'shelve',
+ 'marshal',
+ 'dom',
+ 'sqlite3',
+ 'zlib',
+ 'gzip',
+ 'bz2',
+ 'lzma',
+ 'csv',
+ 'hashlib',
+ 'hmac',
+ 'secrets',
+ 'os',
+ 'io',
+ 'time',
+ 'logging',
+ 'platform',
+ 'errno',
+ 'queue',
+ 'socket',
+ 'ssl',
+ 'email',
+ 'json',
+ 'mimetypes',
+ 'base64',
+ 'binhex',
+ 'binascii',
+ 'quopri',
+ 'uu',
+ 'html',
+ 'xml',
+ 'urllib',
+ 'http',
+ 'ftplib',
+ 'smtplib',
+ 'uuid',
+ 'xmlrpc.client',
+ 'ipaddress',
+ 'locale',
+ 'sys',
+]
+for module in stdlib:
+ hiddenimports += collect_submodules(module, filter=lambda name: 'test' not in name)
+
+# Add Hidden Imports for Plugins
+hiddenimports += collect_submodules('twisted', filter=lambda name: 'test' not in name)
datas += copy_metadata('twisted', recursive=True)
-# Get build_version from installed deluge.
-build_version = deluge.common.get_version()
-
-#Copy UI/Plugin files to where pyinstaller expects
-datas += [ ('../../deluge/ui', 'deluge/ui'),
- ('../../deluge/plugins', 'deluge/plugins') ]
-
-
-block_cipher = None
-
-
-a = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-console-script.py'],
- pathex=[],
- binaries=binaries,
- datas=datas,
- hiddenimports=hiddenimports,
- hookspath=[],
- hooksconfig={},
- runtime_hooks=[],
- excludes=[],
- win_no_prefer_redirects=False,
- win_private_assemblies=False,
- cipher=block_cipher,
- noarchive=False)
-pyz = PYZ(a.pure, a.zipped_data,
- cipher=block_cipher)
-exe = EXE(pyz,
- a.scripts,
- [],
- exclude_binaries=True,
- name='deluge-console',
- debug=False,
- bootloader_ignore_signals=False,
- strip=False,
- upx=True,
- icon='../../deluge/ui/data/pixmaps/deluge.ico',
- console=True,
- disable_windowed_traceback=False,
- target_arch=None,
- codesign_identity=None,
- entitlements_file=None )
-
-b = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-gtk-script.pyw'],
- pathex=[],
- binaries=binaries,
- datas=datas,
- hiddenimports=hiddenimports,
- hookspath=[],
- hooksconfig={},
- runtime_hooks=runtime_hooks_gtk,
- excludes=[],
- win_no_prefer_redirects=False,
- win_private_assemblies=False,
- cipher=block_cipher,
- noarchive=False)
-pyzb = PYZ(b.pure, b.zipped_data,
- cipher=block_cipher)
-exeb = EXE(pyzb,
- b.scripts,
- [],
- exclude_binaries=True,
- name='deluge-gtk',
- debug=False,
- bootloader_ignore_signals=False,
- strip=False,
- upx=True,
- icon='../../deluge/ui/data/pixmaps/deluge.ico',
- console=False,
- disable_windowed_traceback=False,
- target_arch=None,
- codesign_identity=None,
- entitlements_file=None )
-
-c = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluged-script.py'],
- pathex=[],
- binaries=binaries,
- datas=datas,
- hiddenimports=hiddenimports,
- hookspath=[],
- hooksconfig={},
- runtime_hooks=[],
- excludes=[],
- win_no_prefer_redirects=False,
- win_private_assemblies=False,
- cipher=block_cipher,
- noarchive=False)
-pyzc = PYZ(c.pure, c.zipped_data,
- cipher=block_cipher)
-
-exec = EXE(pyzc,
- c.scripts,
- [],
- exclude_binaries=True,
- name='deluged',
- debug=False,
- bootloader_ignore_signals=False,
- strip=False,
- upx=True,
- icon='../../deluge/ui/data/pixmaps/deluge.ico',
- console=False,
- disable_windowed_traceback=False,
- target_arch=None,
- codesign_identity=None,
- entitlements_file=None )
-
-d = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluged-debug-script.py'],
- pathex=[],
- binaries=binaries,
- datas=datas,
- hiddenimports=hiddenimports,
- hookspath=[],
- hooksconfig={},
- runtime_hooks=[],
- excludes=[],
- win_no_prefer_redirects=False,
- win_private_assemblies=False,
- cipher=block_cipher,
- noarchive=False)
-pyzd = PYZ(d.pure, d.zipped_data,
- cipher=block_cipher)
-exed = EXE(pyzd,
- d.scripts,
- [],
- exclude_binaries=True,
- name='deluged-debug',
- debug=False,
- bootloader_ignore_signals=False,
- strip=False,
- upx=True,
- icon='../../deluge/ui/data/pixmaps/deluge.ico',
- console=True,
- disable_windowed_traceback=False,
- target_arch=None,
- codesign_identity=None,
- entitlements_file=None )
-
-e = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-debug-script.py'],
- pathex=[],
- binaries=binaries,
- datas=datas,
- hiddenimports=hiddenimports,
- hookspath=[],
- hooksconfig={},
- runtime_hooks=runtime_hooks_gtk,
- excludes=[],
- win_no_prefer_redirects=False,
- win_private_assemblies=False,
- cipher=block_cipher,
- noarchive=False)
-pyze = PYZ(e.pure, e.zipped_data,
- cipher=block_cipher)
-exee = EXE(pyze,
- e.scripts,
- [],
- exclude_binaries=True,
- name='deluge-debug',
- debug=False,
- bootloader_ignore_signals=False,
- strip=False,
- upx=True,
- icon='../../deluge/ui/data/pixmaps/deluge.ico',
- console=True,
- disable_windowed_traceback=False,
- target_arch=None,
- codesign_identity=None,
- entitlements_file=None )
-
-f = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-script.pyw'],
- pathex=[],
- binaries=binaries,
- datas=datas,
- hiddenimports=hiddenimports,
- hookspath=[],
- hooksconfig={},
- runtime_hooks=runtime_hooks_gtk,
- excludes=[],
- win_no_prefer_redirects=False,
- win_private_assemblies=False,
- cipher=block_cipher,
- noarchive=False)
-pyzf = PYZ(f.pure, f.zipped_data,
- cipher=block_cipher)
-exef = EXE(pyzf,
- f.scripts,
- [],
- exclude_binaries=True,
- name='deluge',
- debug=False,
- bootloader_ignore_signals=False,
- strip=False,
- upx=True,
- icon='../../deluge/ui/data/pixmaps/deluge.ico',
- console=False,
- disable_windowed_traceback=False,
- target_arch=None,
- codesign_identity=None,
- entitlements_file=None )
-
-g = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-web-debug-script.py'],
- pathex=[],
- binaries=binaries,
- datas=datas,
- hiddenimports=hiddenimports,
- hookspath=[],
- hooksconfig={},
- runtime_hooks=[],
- excludes=[],
- win_no_prefer_redirects=False,
- win_private_assemblies=False,
- cipher=block_cipher,
- noarchive=False)
-pyzg = PYZ(g.pure, g.zipped_data,
- cipher=block_cipher)
-exeg = EXE(pyzg,
- g.scripts,
- [],
- exclude_binaries=True,
- name='deluge-web-debug',
- debug=False,
- bootloader_ignore_signals=False,
- strip=False,
- upx=True,
- icon='../../deluge/ui/data/pixmaps/deluge.ico',
- console=True,
- disable_windowed_traceback=False,
- target_arch=None,
- codesign_identity=None,
- entitlements_file=None )
-
-h = Analysis([os.path.abspath(os.path.join(HOMEPATH,os.pardir,os.pardir)) + '\Scripts\deluge-web-script.py'],
- pathex=[],
- binaries=binaries,
- datas=datas,
- hiddenimports=hiddenimports,
- hookspath=[],
- hooksconfig={},
- runtime_hooks=[],
- excludes=[],
- win_no_prefer_redirects=False,
- win_private_assemblies=False,
- cipher=block_cipher,
- noarchive=False)
-pyzh = PYZ(h.pure, h.zipped_data,
- cipher=block_cipher)
-exeh = EXE(pyzh,
- h.scripts,
- [],
- exclude_binaries=True,
- name='deluge-web',
- debug=False,
- bootloader_ignore_signals=False,
- strip=False,
- upx=True,
- icon='../../deluge/ui/data/pixmaps/deluge.ico',
- console=False,
- disable_windowed_traceback=False,
- target_arch=None,
- codesign_identity=None,
- entitlements_file=None )
-
-coll = COLLECT(exe,
- a.binaries,
- a.zipfiles,
- a.datas,
- exeb,
- b.binaries,
- b.zipfiles,
- b.datas,
- exec,
- c.binaries,
- c.zipfiles,
- c.datas,
- exed,
- d.binaries,
- d.zipfiles,
- d.datas,
- exee,
- e.binaries,
- e.zipfiles,
- e.datas,
- exef,
- f.binaries,
- f.zipfiles,
- f.datas,
- exeg,
- g.binaries,
- g.zipfiles,
- g.datas,
- exeh,
- h.binaries,
- h.zipfiles,
- h.datas,
- strip=False,
- upx=True,
- upx_exclude=[],
- name='Deluge')
+# Copy UI/Plugin files to where pyinstaller expects
+datas += [('../../deluge/ui', 'deluge/ui'), ('../../deluge/plugins', 'deluge/plugins')]
+
+# List of executables to produce
+executables = {
+ 'deluge-script.pyw': {
+ 'name': 'deluge',
+ 'console': False,
+ 'gtk': True,
+ },
+ 'deluge-gtk-script.pyw': {
+ 'name': 'deluge-gtk',
+ 'console': False,
+ 'gtk': True,
+ },
+ 'deluge-debug-script.py': {
+ 'name': 'deluge-debug',
+ 'console': True,
+ 'gtk': True,
+ },
+ 'deluge-console-script.py': {
+ 'name': 'deluge-console',
+ 'console': True,
+ 'gtk': False,
+ },
+ 'deluged-script.py': {
+ 'name': 'deluged',
+ 'console': False,
+ 'gtk': False,
+ },
+ 'deluged-debug-script.py': {
+ 'name': 'deluged-debug',
+ 'console': True,
+ 'gtk': False,
+ },
+ 'deluge-web-debug-script.py': {
+ 'name': 'deluge-web-debug',
+ 'console': False,
+ 'gtk': False,
+ },
+ 'deluge-web-script.py': {
+ 'name': 'deluge-web',
+ 'console': True,
+ 'gtk': False,
+ },
+}
+
+analysis = {}
+exe = {}
+coll = []
+
+# Perform analysis
+for e, d in executables.items():
+ runtime_hooks = []
+ if d['gtk']:
+ runtime_hooks += [os.path.join(SPECPATH, 'pyi_rth_gtk_csd.py')]
+
+ analysis[e] = Analysis(
+ [os.path.abspath(os.path.join(HOMEPATH, os.pardir, os.pardir, 'Scripts', e))],
+ pathex=[],
+ binaries=binaries,
+ datas=datas,
+ hiddenimports=hiddenimports,
+ hookspath=[],
+ hooksconfig={},
+ runtime_hooks=runtime_hooks,
+ excludes=[],
+ win_no_prefer_redirects=False,
+ win_private_assemblies=False,
+ cipher=None,
+ noarchive=False,
+ )
+
+# Executable
+for e, d in executables.items():
+ exe[e] = EXE(
+ PYZ(analysis[e].pure, analysis[e].zipped_data, cipher=None),
+ analysis[e].scripts,
+ [],
+ exclude_binaries=True,
+ name=d['name'],
+ debug=False,
+ bootloader_ignore_signals=False,
+ strip=False,
+ upx=True,
+ icon='../../deluge/ui/data/pixmaps/deluge.ico',
+ console=d['console'],
+ disable_windowed_traceback=False,
+ target_arch=None,
+ codesign_identity=None,
+ entitlements_file=None,
+ )
+
+# Collect
+for e, d in executables.items():
+ coll += exe[e], analysis[e].binaries, analysis[e].zipfiles, analysis[e].datas
+
+COLLECT(*coll, strip=False, upx=True, upx_exclude=[], name='Deluge')