This guide documents the implementation of dual macOS architecture support (Intel x86_64 and Apple Silicon arm64) with centralized version management for the Log Viewer application.
-
Dual Architecture Support: Two separate macOS apps are now built
- Intel x86_64 optimized for Intel-based Macs
- Apple Silicon arm64 optimized for M1/M2/M3 Macs
-
Architecture-Specific Naming: All build artifacts include architecture suffix
LogViewer-{VERSION}-macOS-x86_64.dmgLogViewer-{VERSION}-macOS-arm64.dmg
-
Centralized Version Management: All builds read from
rpmbuild/SOURCES/Build_Version- Single source of truth:
VERSION=3.2.0(current version) - Automatically propagates to all build artifacts
- Single source of truth:
-
Enhanced GitHub Actions: New workflow supports parallel dual builds
- ARM64 builds on
macos-latest(Apple Silicon) - x86_64 builds on
macos-13(Intel) - Automatic release creation with both architectures
- ARM64 builds on
rpmbuild/SOURCES/log_viewer_macos_x86_64.spec- Intel x86_64 build configurationrpmbuild/SOURCES/log_viewer_macos_arm64.spec- Apple Silicon arm64 build configuration
rpmbuild/SOURCES/Build_App_MacOS_x86_64.sh- Intel x86_64 app builderrpmbuild/SOURCES/Build_App_MacOS_arm64.sh- Apple Silicon arm64 app builderrpmbuild/SOURCES/Create_DMG_MacOS_x86_64.sh- Intel x86_64 DMG creatorrpmbuild/SOURCES/Create_DMG_MacOS_arm64.sh- Apple Silicon arm64 DMG creator
rpmbuild/SOURCES/Build_All_MacOS_Dual.sh- Builds both architecturesrpmbuild/SOURCES/generate_version_info.py- Dynamic version info generator
.github/workflows/macos_build_dual.yml- Dual architecture CI/CD workflow
rpmbuild/SOURCES/Build_App_MacOS.sh- Updated to read from Build_Versionrpmbuild/SOURCES/Create_DMG_MacOS.sh- Updated for dynamic versioningrpmbuild/SOURCES/Build_App.sh- Updated for version managementrpmbuild/SOURCES/log_viewer_macos.spec- Updated with version function
rpmbuild/SOURCES/version_info.txt- Now auto-generated from Build_Versionrpmbuild/SOURCES/Build_Version- Central version configuration
cd rpmbuild/SOURCES
./Build_All_MacOS_Dual.sh# Intel x86_64 only
./Build_All_MacOS_Dual.sh --x86_64-only
# Apple Silicon arm64 only
./Build_All_MacOS_Dual.sh --arm64-only# Intel x86_64
./Build_App_MacOS_x86_64.sh
./Create_DMG_MacOS_x86_64.sh
# Apple Silicon arm64
./Build_App_MacOS_arm64.sh
./Create_DMG_MacOS_arm64.sh# Clean build (removes all artifacts)
./Build_All_MacOS_Dual.sh --clean
# Skip testing phase
./Build_All_MacOS_Dual.sh --skip-tests
# Combined options
./Build_All_MacOS_Dual.sh --clean --arm64-only --skip-testsSimply edit rpmbuild/SOURCES/Build_Version:
echo "VERSION=3.2.0" > rpmbuild/SOURCES/Build_VersionAll build methods will automatically use the new version.
rpmbuild/SOURCES/
โโโ dist_x86_64/
โ โโโ Log Viewer.app # Intel x86_64 app bundle
โโโ dist_arm64/
โ โโโ Log Viewer.app # Apple Silicon arm64 app bundle
โโโ LogViewer-3.2.0-macOS-x86_64.dmg
โโโ LogViewer-3.2.0-macOS-arm64.dmg
โโโ version_info.txt # Auto-generated for Windows builds
- App Bundles:
Log Viewer.app(stored in architecture-specific directories) - DMG Files:
LogViewer-{VERSION}-macOS-{ARCH}.dmg - Architecture Values:
x86_64,arm64
The new workflow (.github/workflows/macos_build_dual.yml) automatically:
-
Triggers on:
- Push to
mainorFIX--3.0.5branches - Pull requests to
main - Manual dispatch
- Git tags starting with
v*
- Push to
-
Parallel Jobs:
build-macos-arm64: Runs onmacos-latest(Apple Silicon)build-macos-x86_64: Runs onmacos-13(Intel)
-
Artifacts Created:
- App bundles for both architectures
- DMG files for both architectures
- Retention: 30 days
-
Release Creation (on tags):
- Downloads both DMG files
- Creates draft release with both architectures
- Includes detailed architecture guidance
- Version Detection: Automatically reads from
Build_Versionfile - Architecture Verification: Checks binary architecture with
lipo -info - Testing: Mounts/unmounts DMGs and launches apps
- Cross-Compatibility Notes: Explains Rosetta 2 support
# Intel x86_64
target_arch='x86_64'
# Apple Silicon arm64
target_arch='arm64'- Intel builds: Use
macos-13runners or Intel Macs - ARM64 builds: Use
macos-latestrunners or Apple Silicon Macs - Cross-compilation: Not currently supported
All build scripts include:
- App bundle structure verification
- Binary architecture confirmation
- DMG mount/unmount testing
- Application launch testing
# Check architecture of built binary
lipo -info "dist_x86_64/Log Viewer.app/Contents/MacOS/log_viewer"
lipo -info "dist_arm64/Log Viewer.app/Contents/MacOS/log_viewer"
# Test DMG mounting
hdiutil attach "LogViewer-3.2.0-macOS-x86_64.dmg"
hdiutil attach "LogViewer-3.2.0-macOS-arm64.dmg"- Intel Mac users: Download
LogViewer-{VERSION}-macOS-x86_64.dmg - Apple Silicon users: Download
LogViewer-{VERSION}-macOS-arm64.dmg - Either version works on both: Rosetta 2 provides compatibility
- Legacy scripts still work:
Build_App_MacOS.shandCreate_DMG_MacOS.shupdated with versioning - New scripts available: Architecture-specific build options
- CI/CD enhanced: Parallel builds reduce total build time
- Intel Macs: x86_64 version runs natively
- Apple Silicon: arm64 version runs natively
- Cross-platform: Rosetta 2 translation (slight performance impact)
- Parallel CI builds: Both architectures build simultaneously
- Selective building: Choose specific architecture for faster local builds
- Incremental builds: Architecture-specific directories prevent conflicts
Issue: "Source file LogViewer-X.X.X.exe does not exist" during installer creation
Root Cause: Version mismatch between Build_Version file and Inno Setup installer script
Fix Applied:
- Enhanced
update_inno_version.pywith improved regex patternLogViewer.*\.exe - Corrected GitHub Actions workflow timing to call version scripts before building
- Now handles automatic upgrades from any previous version
Issue: "Invalid workflow file" with YAML syntax errors
Root Cause: Incorrect indentation in automated_comprehensive_release.yml
Fix Applied:
- Corrected step indentation and YAML structure
- All workflows now validate successfully
- Automated release process works reliably
Change: Updated all email addresses from tmichett@redhat.com to travis@michettetech.com
Scope: 29 files updated across entire codebase including scripts, documentation, and workflows
# Check Build_Version file
cat rpmbuild/SOURCES/Build_Version
# Regenerate version_info.txt for Windows
cd rpmbuild/SOURCES
python3 generate_version_info.py# Verify target architecture in PyInstaller spec
grep "target_arch" rpmbuild/SOURCES/log_viewer_macos_*.spec
# Check actual binary architecture
lipo -info "dist_*/Log Viewer.app/Contents/MacOS/log_viewer"# Clean all build artifacts
cd rpmbuild/SOURCES
./Build_All_MacOS_Dual.sh --clean
# Check Python and PyInstaller versions
python --version
pip show pyinstaller# Get help for any script
./Build_All_MacOS_Dual.sh --help
./Build_App_MacOS_x86_64.sh --help- Universal Binaries: Single app supporting both architectures
- Code Signing: Automated signing for distribution
- Notarization: Apple notarization for enhanced security
- Windows Architecture: Similar x86_64/arm64 support for Windows
- Linux Architectures: Multi-arch Linux support (x86_64, arm64, etc.)
- Package Managers: Homebrew support with architecture detection
- Update System: In-app updates with architecture awareness
- Metrics: Architecture usage analytics
For technical support or questions about the dual architecture implementation:
- Email: travis@michettetech.com
- Organization: Michette Technologies
This implementation maintains the same proprietary license as the original Log Viewer application.
Generated: December 2024 Version: 3.2.0 Implementation: Dual Architecture macOS Support