diff options
| author | Kaufmann <Kau@avh.de> | 2025-10-09 18:53:47 +0200 |
|---|---|---|
| committer | Kaufmann <Kau@avh.de> | 2025-10-09 18:53:47 +0200 |
| commit | 647feb7b6b0c8cc140fcc9bbe64eb6a497597de3 (patch) | |
| tree | 93fca00faa104862a7834ea0c931fa43787f732c /azrechner-trimmed.spec | |
| parent | 65ca85889cdf54e3b0093f73fab6a7793141f3cf (diff) | |
- made the filtering spec file Windows compatible
- added a spec file with a more extensive filtering method (not necessary, output of AI when mistakenly stating that the old filtering does not work for windows)
Diffstat (limited to 'azrechner-trimmed.spec')
| -rw-r--r-- | azrechner-trimmed.spec | 109 |
1 files changed, 71 insertions, 38 deletions
diff --git a/azrechner-trimmed.spec b/azrechner-trimmed.spec index 51261b5..d42a1b1 100644 --- a/azrechner-trimmed.spec +++ b/azrechner-trimmed.spec @@ -1,9 +1,11 @@ # calendar_gui.spec # -*- mode: python ; coding: utf-8 -*- import os +import sys +from pathlib import Path from PyInstaller.utils.hooks import collect_all -# Collect reportlab barcode data as you already did +# Collect reportlab barcode data (same as before) datas = [] binaries = [] hiddenimports = [] @@ -20,46 +22,79 @@ a = Analysis( hookspath=[], hooksconfig={}, runtime_hooks=[], - excludes=['scipy'], # keep your existing excludes + excludes=['scipy','numpy'], # keep your existing excludes noarchive=False, optimize=0, ) -# ---- Helper: drop specific native libs / plugin files we listed ---- -# IMPORTANT: do NOT drop essential Qt runtime libs needed for your platform. -ESSENTIAL_QT_NAMES = [ - 'libQt5Core.so', 'libQt5Gui.so', 'libQt5Widgets.so', 'libQt5XcbQpa.so', - 'libpython3.12.so', 'libstdc++.so.6', 'libc.so.6' -] - -DROP_PATTERNS = [ - # Pillow image codec libs you identified - 'libavif-', 'libwebp-', 'liblcms2-', - 'libsharpyuv', 'libwebpdemux', 'libwebpmux', - - # Qt optional subsystems you listed (Quick, Qml, QmlModels, Svg, WebSockets) - 'libQt5Quick.so', 'libQt5Qml.so', 'libQt5QmlModels.so', - 'libQt5Svg.so', 'libQt5WebSockets.so', 'libQt5EglFSDeviceIntegration.so', - -] - -def should_drop_path(path_str): - s = str(path_str) - # never drop critical essentials +# Platform-aware essential names & drop patterns +IS_WINDOWS = sys.platform.startswith('win') +IS_MAC = sys.platform == 'darwin' +IS_UNIX = not IS_WINDOWS and not IS_MAC + +# Lowercase names will be used for case-insensitive matching +if IS_WINDOWS: + ESSENTIAL_QT_NAMES = [ + 'qt5core.dll', 'qt5gui.dll', 'qt5widgets.dll', + # the platform plugin folder & plugin name on Windows + os.path.join('platforms', 'qwindows.dll'), + # Python runtime dlls that are critical + f'python{sys.version_info.major}{sys.version_info.minor}.dll', # e.g. python312.dll + ] + DROP_PATTERNS = [ + # Qt optional DLLs you listed (Windows names) + 'Qt5Quick.dll', 'qt5qml.dll', 'qt5qmlmodels.dll', + 'qt5svg.dll', 'qt5websockets.dll', 'qt5eglfsdeviceintegration.dll', + # Pillow / image codec dll patterns (windows) + 'libavif', 'libwebp', 'lcms2', 'sharpyuv', 'openjp2', 'webpdemux', 'webpmux', + # qml/translations directories + ] + STRIP_ON_BUILD = False +else: + # Linux / other UNIX + ESSENTIAL_QT_NAMES = [ + 'libQt5Core.so', 'libQt5Gui.so', 'libQt5Widgets.so', 'libQt5XcbQpa.so', + 'libpython{major}.{minor}.so'.format(major=sys.version_info.major, minor=sys.version_info.minor), + 'libstdc++.so.6', 'libc.so.6' + ] + DROP_PATTERNS = [ + # Pillow image codecs & windows variants too + 'libavif-', 'libwebp-', 'liblcms2-', 'libsharpyuv', 'libopenjp2', + # Qt optional subsystems you listed + 'libQt5Quick.so', 'libQt5Qml.so', 'libQt5QmlModels.so', + 'libQt5Svg.so', 'libQt5WebSockets.so', 'libQt5EglFSDeviceIntegration.so', + ] + STRIP_ON_BUILD = True + +# Normalize patterns to lowercase for case-insensitive comparisons +ESSENTIAL_QT_NAMES = [p.lower() for p in ESSENTIAL_QT_NAMES] +DROP_PATTERNS = [p.lower() for p in DROP_PATTERNS] + + +def should_drop_path(path_obj): + """ + Return True when the path (string or Path) should be dropped from binaries/datas. + Uses case-insensitive substring matching and avoids dropping essential runtime libs. + """ + s = str(path_obj) + s_lower = s.lower().replace('\\', '/') + # never drop critical essentials (match if any essential substring is contained) for ess in ESSENTIAL_QT_NAMES: - if ess in s: + if ess in s_lower: return False # drop if pattern matches for p in DROP_PATTERNS: - if p in s: + if p in s_lower: return True - # also drop QML/translations directories - if '/qml/' in s or '\\qml\\' in s: + # drop QML/translations directories if present + if '/qml/' in s_lower or '/translations/' in s_lower: return True - if '/translations/' in s or '\\translations\\' in s: + # Also drop "pillow.libs" link targets if they match the patterns above + if 'pillow.libs' in s_lower and any(p in s_lower for p in DROP_PATTERNS): return True return False + # ---------- robust filtering for a.binaries / a.datas ---------- def _entry_src(obj): """ @@ -67,18 +102,17 @@ def _entry_src(obj): PyInstaller entries may be (src, dest) or (src, dest, type) etc. """ try: - # sequence-like entries (tuple/list) return obj[0] except Exception: - # fallback: maybe it's already a path-like object return obj + filtered_binaries = [] for entry in a.binaries: src = _entry_src(entry) if should_drop_path(src): - # drop it - # print("Dropping binary:", src) # uncomment for debugging + # drop this binary entry + # print("Dropping binary:", src) continue filtered_binaries.append(entry) a.binaries = filtered_binaries @@ -87,7 +121,7 @@ filtered_datas = [] for entry in a.datas: src = _entry_src(entry) if should_drop_path(src): - # print("Dropping data:", src) # uncomment for debugging + # print("Dropping data:", src) continue filtered_datas.append(entry) a.datas = filtered_datas @@ -105,7 +139,7 @@ exe = EXE( name='azrechner', debug=False, bootloader_ignore_signals=False, - strip=True, # on Linux: strip Python bootstrap (saves some MB) + strip=STRIP_ON_BUILD, # only strip on unix-like systems upx=True, console=False, ) @@ -115,10 +149,9 @@ coll = COLLECT( a.binaries, a.zipfiles, a.datas, - strip=True, # strip shared objects where safe + strip=STRIP_ON_BUILD, # only strip on unix-like systems upx=True, - upx_exclude=[], # leave empty; PyInstaller will avoid known-bad files + # if you know specific DLLs that break with UPX you can list them here + upx_exclude=[], name='azrechner-trimmed', ) - - |
