This build system uses PyInstaller for cross-platform builds of QuickEDL.
✅ Separate builds for all architectures:
- Windows x64 (.exe in .zip)
- macOS Intel x86_64 (.app in .dmg)
- macOS Apple Silicon arm64 (.app in .dmg)
✅ Proper macOS app bundles:
- Complete
QuickEDL.appwith Info.plist - Native file access permissions
- Correct icons and metadata
✅ Automatic packaging:
- Windows: .exe packaged in .zip
- macOS: .app packaged in .dmg
✅ Flexible builds:
- Local builds (current architecture only)
- GitHub workflow (all architectures)
pip install pyinstaller
pip install -r dependencies.txtpython build.pyThis automatically creates:
- Windows:
dist/quickedl_{VERSION}_winx64.zip - macOS Intel:
dist/quickedl_{VERSION}_macOS_x86_64.dmg - macOS ARM64:
dist/quickedl_{VERSION}_macOS_arm64.dmg
The build script automatically checks:
- ✅ Executable was created
- ✅ Architecture is correct (macOS)
- ✅ App bundle structure (macOS)
- ✅ Info.plist present (macOS)
The workflow is only triggered manually:
- GitHub Repository → Actions Tab
- "Build QuickEDL Executables" → "Run workflow"
The workflow creates in parallel:
- Windows:
windows-latestrunner - macOS Intel:
macos-13runner (Intel) - macOS Apple Silicon:
macos-14runner (ARM64)
- Artifacts: All builds are stored as artifacts
- Release: Automatic release creation with all builds
dist/
├── quickedl.exe # Main executable file
└── quickedl_{VERSION}_winx64.zip # Packaged distribution
dist/
├── QuickEDL.app/ # App Bundle
│ ├── Contents/
│ │ ├── Info.plist # App metadata
│ │ ├── MacOS/quickedl # Executable file
│ │ └── Resources/ # Icons and resources
└── quickedl_{VERSION}_macOS_{ARCH}.dmg # Packaged distribution
The quickedl.spec file contains:
- Hidden Imports: ttkbootstrap, PIL, yaml, tkinter
- Data Files: resources/ folder with icons
- Excludes: Unnecessary packages (matplotlib, numpy, etc.)
- Icon:
resources/icon_win.ico - Console: Hidden (
console=False) - Output: Single .exe file
- Icon:
resources/icon_mac.icns - Bundle: Complete .app structure
- Info.plist: Permissions and metadata
- Bundle ID:
com.punkerschaf.quickedl
- Automatic detection of current architecture
- Environment variables for architecture-specific builds
- Intel Runner (
macos-13): Explicitly x86_64 - ARM64 Runner (
macos-14): Explicitly arm64 - Environment variables set target architecture
# Check dependencies
pip list | grep -E "(pyinstaller|ttkbootstrap|pyyaml|pillow)"
# Test PyInstaller directly
pyinstaller quickedl.spec --clean --noconfirm# Check app bundle
file dist/QuickEDL.app/Contents/MacOS/quickedl
lipo -info dist/QuickEDL.app/Contents/MacOS/quickedl
# Check Info.plist
plutil -p dist/QuickEDL.app/Contents/Info.plist- PyInstaller should automatically include all DLLs
- If issues occur: Add
--hidden-importin the .spec file
| Feature | PyInstaller | cx_Freeze |
|---|---|---|
| macOS App Bundles | ✅ Complete | |
| Info.plist Integration | ✅ Native | ❌ Manual |
| Cross-Platform | ✅ Excellent | ✅ Good |
| Architecture Control | ✅ Easy | |
| Bundle Size | ✅ Optimized | ✅ Optimized |
| Configuration | ✅ .spec file | ❌ setup.py |