# Multi-Platform Build Guide This document explains how to build LanMountainDesktop for Windows, Linux, and macOS. ## Overview LanMountainDesktop supports self-contained builds for: - **Windows**: x64 (64-bit) and x86 (32-bit) - **Linux**: x64 only (AppImage/snap support planned) - **macOS**: x64 (Intel) and arm64 (Apple Silicon M1/M2/M3) ## Build Matrices in CI The GitHub Actions workflow uses a build matrix to automatically build all combinations: ```yaml Windows builds: win-x64, win-x86 (on windows-latest) Linux builds: linux-x64 (on ubuntu-latest) macOS builds: osx-x64, osx-arm64 (on macos-latest) ``` Each build: - ✅ Restores dependencies - ✅ Updates version in csproj - ✅ Publishes with optimizations - ✅ Creates platform-specific packages - ✅ Uploads to release artifacts ## Local Building ### Prerequisites **All Platforms:** ```bash # Install .NET 10 SDK dotnet --version # Should show 10.0.x ``` **Linux (Debian/Ubuntu):** ```bash # Install required dependencies sudo apt-get update sudo apt-get install -y \ libfontconfig1 \ libfreetype6 \ libx11-6 \ libxrandr2 \ libxinerama1 \ libxi6 \ libxcursor1 \ libxext6 \ libxrender1 \ libxkbcommon-x11-0 ``` **macOS:** ```bash # Xcode Command Line Tools required xcode-select --install # Or if you have Homebrew: brew install dotnet ``` ### Building Locally **Windows (x64):** ```powershell # Using the PowerShell script .\LanMountainDesktop\scripts\package.ps1 ` -RuntimeIdentifier win-x64 ` -Version 1.0.0 # Or with dotnet directly dotnet publish LanMountainDesktop/LanMountainDesktop.csproj ` -c Release -r win-x64 -o ./publish/win-x64 ` --self-contained -p:PublishSingleFile=true ``` **Windows (x86):** ```powershell .\LanMountainDesktop\scripts\package.ps1 ` -RuntimeIdentifier win-x86 ` -Version 1.0.0 ``` **Linux (x64):** ```bash # Make build script executable chmod +x scripts/build.sh # Build ./scripts/build.sh --rid linux-x64 --version 1.0.0 # Output: ./publish/linux-x64/ ``` **macOS (Intel x64):** ```bash chmod +x scripts/build.sh ./scripts/build.sh --rid osx-x64 --version 1.0.0 # Output: ./publish/osx-x64/ ``` **macOS (Apple Silicon arm64):** ```bash chmod +x scripts/build.sh ./scripts/build.sh --rid osx-arm64 --version 1.0.0 # Output: ./publish/osx-arm64/ ``` ## Build Output After building, you'll have a self-contained directory with: ``` publish/[rid]/ ├── LanMountainDesktop.exe (Windows) ├── LanMountainDesktop (Linux/macOS - executable) ├── libvlc/ (Windows/macOS only) ├── Localization/ (i18n files) ├── Extensions/ (Component extension manifests) └── Assets/ (Fonts, weather icons, etc.) ``` ### Package Creation **For Windows:** ```bash # Create zip package $rid = "win-x64" $version = "1.0.0" $dir = "LanMountainDesktop-$version-$rid" Copy-Item -Path "./publish/$rid" -Destination $dir -Recurse Compress-Archive -Path $dir -DestinationPath "$dir.zip" ``` **For Linux/macOS:** ```bash # Create tar.gz package rid=linux-x64 version=1.0.0 dir="LanMountainDesktop-$version-$rid" mkdir -p $dir cp -r ./publish/$rid/* $dir/ tar -czf "$dir.tar.gz" $dir ``` ## Cross-Compilation Considerations ### ⚠️ Limitations - **Windows builds must run on Windows** (or in WSL2 with additional setup) - libvlc has platform-specific native libraries - Windows-specific dependencies in vcpkg - **Linux builds must run on Linux** - Different library paths and system dependencies - **macOS builds must run on macOS** - Code signing / notarization (if needed) requires macOS ### ✅ Workaround Options 1. **GitHub Actions** (Recommended) - Automatically runs on the correct OS for each build - No local cross-compilation needed 2. **Docker** (For Linux on any platform) - Use container-based build environment - Example: `ghcr.io/classisland/philia-build-image:main` 3. **CI/CD Pipeline** - Let Actions handle all platform builds - Download artifacts locally for testing ## Platform-Specific Notes ### Windows - Supports both x64 and x86 architectures - Uses libvlc from `VideoLAN.LibVLC.Windows` NuGet package - Includes MSVC runtime if needed **Unsupported:** - ARM64 (would need separate toolchain) ### Linux - Tested on Ubuntu 22.04+ - Requires X11 libraries (no Wayland support yet) - Self-contained includes .NET runtime - Uses libvlc system libraries or bundled version **Planned:** - AppImage format - Snap package - .deb packaging ### macOS - Supports both Intel (x64) and Apple Silicon (arm64) - Uses libvlc from `VideoLAN.LibVLC.Mac` NuGet package - Universal binary support (both architectures in one file) - not yet implemented **Planned:** - DMG packaging - Code signing & notarization - App Store distribution ## Troubleshooting ### Windows Build Fails ```bash # Clean and retry dotnet clean LanMountainDesktop/LanMountainDesktop.csproj dotnet restore dotnet publish LanMountainDesktop/LanMountainDesktop.csproj -c Release -r win-x64 --self-contained ``` ### Linux Build Fails ```bash # Check dependencies are installed ldd ./publish/linux-x64/LanMountainDesktop | grep "not found" # Install missing libraries sudo apt-get install -y lib[missing-name] ``` ### macOS Build Fails ```bash # Ensure correct .NET version for ARM/Intel dotnet --version # Try specifying explicit SDK version export DOTNET_ROOT=/usr/local/share/dotnet ./scripts/build.sh --rid osx-arm64 --version 1.0.0 ``` ## Performance & Size | Platform | RID | Size | Notes | |----------|-----|------|-------| | Windows x64 | win-x64 | ~150-200 MB | Includes .NET + libvlc | | Windows x86 | win-x86 | ~140-190 MB | Smaller footprint | | Linux x64 | linux-x64 | ~120-170 MB | Minimal deps included | | macOS Intel | osx-x64 | ~130-180 MB | Intel-optimized | | macOS Silicon | osx-arm64 | ~120-170 MB | Apple Silicon native | *Sizes vary based on trimming and included dependencies* ## Optimization Options For smaller, faster builds, you can adjust publish settings: ```bash # Aggressive trimming (may break reflection-based features) -p:PublishTrimmed=true # Embed debug symbols (larger, but better debugging) -p:DebugType=embedded # AOT compilation (Windows only, faster startup) -p:PublishAot=true # Single executable (already enabled in workflows) -p:PublishSingleFile=true ``` ## Distribution After building, distribute the packages: 1. **Windows users**: Download `.zip`, extract, run executable 2. **Linux users**: Download `.tar.gz`, extract, run executable 3. **macOS users**: Download `.tar.gz`, extract, run executable Plan for future: - Installer generation (.exe for Windows, .deb for Linux) - Code signing for macOS - Auto-update mechanism ## References - [.NET Runtime Identifiers](https://learn.microsoft.com/dotnet/core/rid-catalog) - [dotnet publish options](https://learn.microsoft.com/dotnet/core/tools/dotnet-publish) - [Avalonia Deployment](https://docs.avaloniaui.net/docs/deployment) - [libvlc Bindings](https://github.com/videolan/libvlcsharp)