diff --git a/.github/workflows/build-macos.yml b/.github/workflows/build-macos.yml index 263a9d4..a0b16e2 100644 --- a/.github/workflows/build-macos.yml +++ b/.github/workflows/build-macos.yml @@ -206,66 +206,73 @@ jobs: echo "Processing App Bundle at: $app_path" # Determine Lib directory (standard location vs customized) - # We look for 'os.py' or 'ytsage' folder to be sure - lib_dir=$(find "$app_path/Contents" -type d -name "ytsage" | head -n1 | xargs dirname) + # We look for all 'lib' directories that contain 'PySide6' or 'ytsage' to be thorough + # resulting in potentially multiple lib dirs to clean (e.g. MacOS/lib and Resources/lib) + lib_dirs=$(find "$app_path/Contents" -type d -name "lib" | while read -r d; do if [ -d "$d/ytsage" ] || [ -d "$d/PySide6" ]; then echo "$d"; fi; done) - if [ -z "$lib_dir" ]; then - # Fallback standard cx_Freeze locations - if [ -d "$app_path/Contents/MacOS/lib" ]; then - lib_dir="$app_path/Contents/MacOS/lib" - elif [ -d "$app_path/Contents/Resources/lib" ]; then - lib_dir="$app_path/Contents/Resources/lib" - fi + if [ -z "$lib_dirs" ]; then + echo "Warning: No valid Library directory found. Skipping deep trim." fi - echo "Detected Lib Directory: $lib_dir" - - if [ -d "$lib_dir" ]; then - # 1. Remove screenshots - rm -rf "$lib_dir/assets/branding/screenshots" - echo "Removed screenshots folder" + for lib_dir in $lib_dirs; do + echo "Processing Lib Directory: $lib_dir" - # 2. Remove unused Qt translations - rm -rf "$lib_dir/PySide6/translations" - echo "Removed Qt translations" - - # 3. Remove unused Qt plugins - plugins_dir="$lib_dir/PySide6/plugins" - for plugin in designer pdf svg sql help qml quick webengine bluetooth opengl printsupport test xml; do - if [ -d "$plugins_dir/$plugin" ]; then - rm -rf "$plugins_dir/$plugin" - echo "Removed plugin folder: $plugin" - fi - done - - # 3.1. Explicitly remove specific input contexts and image formats - rm -rf "$plugins_dir/platforminputcontexts" - # Note: macOS libs usually have .dylib extension or no extension in bundles, or .so for python modules - # We try removing common variants - rm -f "$plugins_dir/imageformats/libqpdf.dylib" "$plugins_dir/imageformats/libqsvg.dylib" - rm -f "$plugins_dir/imageformats/qpdf.dylib" "$plugins_dir/imageformats/qsvg.dylib" - rm -f "$plugins_dir/iconengines/libqsvgicon.dylib" "$plugins_dir/iconengines/qsvgicon.dylib" - - # 4. Remove any duplicate or unnecessary Qt Libraries (DLLs/dylibs) - # Targeting root lib and PySide6 internal lib - # Patterns match both .so, .dylib, and .framework style naming - echo "Removing bloat Qt libraries..." - find "$lib_dir" -name "Qt6Web*" -delete - find "$lib_dir" -name "Qt6Pdf*" -delete - find "$lib_dir" -name "Qt6Qml*" -delete - find "$lib_dir" -name "Qt6Quick*" -delete - find "$lib_dir" -name "Qt6VirtualKeyboard*" -delete - find "$lib_dir" -name "Qt6OpenGL*" -delete - - # 5. Remove build tools and unused python modules - for tool in setuptools wheel pkg_resources _distutils_hack curses _pyrepl; do - rm -rf "$lib_dir/$tool" - echo "Removed build tool/module: $tool" - done - - else - echo "Warning: Library directory could not be precisely determined. Skipping deep trim." - fi + # 1. Remove screenshots + rm -rf "$lib_dir/assets/branding/screenshots" + echo "Removed screenshots folder" + + # 2. Remove unused Qt translations (Path varies: PySide6/translations or PySide6/Qt/translations) + rm -rf "$lib_dir/PySide6/translations" + rm -rf "$lib_dir/PySide6/Qt/translations" + echo "Removed Qt translations" + + # 3. Remove unused Qt plugins + # Path varies: PySide6/plugins or PySide6/Qt/plugins + for plugins_base in "$lib_dir/PySide6/plugins" "$lib_dir/PySide6/Qt/plugins"; do + if [ -d "$plugins_base" ]; then + for plugin in designer pdf svg sql help qml quick webengine bluetooth opengl printsupport test xml; do + if [ -d "$plugins_base/$plugin" ]; then + rm -rf "$plugins_base/$plugin" + echo "Removed plugin folder: $plugin from $plugins_base" + fi + done + + # 3.1. Explicitly remove specific input contexts and image formats + rm -rf "$plugins_base/platforminputcontexts" + rm -f "$plugins_base/imageformats/libqpdf.dylib" "$plugins_base/imageformats/libqsvg.dylib" + rm -f "$plugins_base/imageformats/libqpdf.so" "$plugins_base/imageformats/libqsvg.so" # just in case + rm -f "$plugins_base/iconengines/libqsvgicon.dylib" + fi + done + + # 4. Remove any duplicate or unnecessary Qt Libraries (DLLs/dylibs/frameworks) + # On macOS, these often appear as files with no extension (e.g. 'QtQml') or .dylib + # We remove both variants and also the 'Qt6' prefixed ones just in case + echo "Removing bloat Qt libraries..." + + # Standard patterns (Linux/Windows style) + find "$lib_dir" -name "*Qt6Web*" -delete + find "$lib_dir" -name "*Qt6Pdf*" -delete + find "$lib_dir" -name "*Qt6Qml*" -delete + find "$lib_dir" -name "*Qt6Quick*" -delete + find "$lib_dir" -name "*Qt6VirtualKeyboard*" -delete + find "$lib_dir" -name "*Qt6OpenGL*" -delete + find "$lib_dir" -name "*Qt6DBus*" -delete + + # macOS Framework style (No '6' in name usually, e.g. QtQml, QtQuick) + # Be careful not to delete QtQuickWidgets if used (though usually safe if Quick is gone) + # We use known specific lists to avoid over-deleting + for bloat in QtQml QtQmlMeta QtQmlModels QtQmlWorkerScript QtQuick QtQuickControls2 QtQuickTemplates2 QtWebEngine QtWebEngineCore QtVirtualKeyboard QtVirtualKeyboardQml QtOpenGL QtOpenGLWidgets QtPdf QtPdfWidgets QtDBus; do + find "$lib_dir" -maxdepth 1 -name "$bloat" -delete + find "$lib_dir" -maxdepth 1 -name "${bloat}.*" -delete # Matches versions or extensions + done + + # 5. Remove build tools and unused python modules + for tool in setuptools wheel pkg_resources _distutils_hack curses _pyrepl; do + rm -rf "$lib_dir/$tool" + echo "Removed build tool/module: $tool" + done + done else echo "Error: Could not find .app bundle to trim!"