name: release on: push: tags: - 'v*' permissions: contents: write jobs: build: strategy: fail-fast: false matrix: include: - target: x86_64-unknown-linux-gnu os: ubuntu-latest name: mhrv-rs-linux-amd64 - target: aarch64-unknown-linux-gnu os: ubuntu-latest name: mhrv-rs-linux-arm64 - target: x86_64-apple-darwin os: macos-latest name: mhrv-rs-macos-amd64 - target: aarch64-apple-darwin os: macos-latest name: mhrv-rs-macos-arm64 - target: x86_64-pc-windows-gnu os: windows-latest name: mhrv-rs-windows-amd64 runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable with: targets: ${{ matrix.target }} # eframe needs a few system libs on Linux for window management, keyboard, # and OpenGL/X11/Wayland. We install them on the Ubuntu runners regardless # of arch so both CLI-only and UI builds succeed. - name: Install Linux eframe system deps if: runner.os == 'Linux' run: | sudo apt-get update sudo apt-get install -y \ libxkbcommon-dev \ libwayland-dev \ libxcb1-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \ libx11-dev \ libgl1-mesa-dev libglib2.0-dev libgtk-3-dev - name: Install aarch64 cross-compile toolchain (Linux only) if: matrix.target == 'aarch64-unknown-linux-gnu' run: | sudo apt-get update sudo apt-get install -y gcc-aarch64-linux-gnu echo '[target.aarch64-unknown-linux-gnu]' >> ~/.cargo/config.toml echo 'linker = "aarch64-linux-gnu-gcc"' >> ~/.cargo/config.toml - name: Install Windows MinGW toolchain if: matrix.target == 'x86_64-pc-windows-gnu' id: msys2 uses: msys2/setup-msys2@v2 with: msystem: MINGW64 update: true install: mingw-w64-x86_64-gcc - name: Configure Windows GNU linker if: matrix.target == 'x86_64-pc-windows-gnu' shell: pwsh run: | $gcc = "${{ steps.msys2.outputs.msys2-location }}\mingw64\bin\gcc.exe" -replace '\\','/' New-Item -ItemType Directory -Force -Path $env:USERPROFILE/.cargo | Out-Null Add-Content -Path $env:USERPROFILE/.cargo/config.toml -Value '[target.x86_64-pc-windows-gnu]' Add-Content -Path $env:USERPROFILE/.cargo/config.toml -Value "linker = '$gcc'" - name: Build CLI run: cargo build --release --target ${{ matrix.target }} --bin mhrv-rs # UI build: we try to build the UI binary on every platform. If it fails # on cross-compile for linux-arm64 (missing arm64 system libs cross), # we still ship the CLI. - name: Build UI if: matrix.target != 'aarch64-unknown-linux-gnu' run: cargo build --release --target ${{ matrix.target }} --features ui --bin mhrv-rs-ui - name: Package (unix) if: runner.os != 'Windows' run: | mkdir -p dist cp target/${{ matrix.target }}/release/mhrv-rs dist/mhrv-rs chmod +x dist/mhrv-rs if [ -f target/${{ matrix.target }}/release/mhrv-rs-ui ]; then cp target/${{ matrix.target }}/release/mhrv-rs-ui dist/mhrv-rs-ui chmod +x dist/mhrv-rs-ui fi - name: Build macOS .app bundle if: runner.os == 'macOS' run: | VER="${GITHUB_REF#refs/tags/v}" ./assets/macos/build-app.sh dist/mhrv-rs-ui "$VER" dist # Make a clean zip of just the .app for the release cd dist zip -qry "${{ matrix.name }}-app.zip" mhrv-rs.app - name: Package (windows) if: runner.os == 'Windows' shell: pwsh run: | New-Item -ItemType Directory -Force -Path dist | Out-Null Copy-Item target/${{ matrix.target }}/release/mhrv-rs.exe dist/mhrv-rs.exe if (Test-Path target/${{ matrix.target }}/release/mhrv-rs-ui.exe) { Copy-Item target/${{ matrix.target }}/release/mhrv-rs-ui.exe dist/mhrv-rs-ui.exe } - name: Make archive shell: bash run: | cd dist if [ "${{ runner.os }}" = "Windows" ]; then 7z a -tzip "${{ matrix.name }}.zip" mhrv-rs.exe mhrv-rs-ui.exe else tar czf "${{ matrix.name }}.tar.gz" mhrv-rs mhrv-rs-ui 2>/dev/null || tar czf "${{ matrix.name }}.tar.gz" mhrv-rs fi - uses: actions/upload-artifact@v4 with: name: ${{ matrix.name }} path: | dist/${{ matrix.name }}.tar.gz dist/${{ matrix.name }}.zip dist/${{ matrix.name }}-app.zip if-no-files-found: ignore release: needs: build runs-on: ubuntu-latest permissions: contents: write steps: - uses: actions/checkout@v4 with: fetch-depth: 0 - uses: actions/download-artifact@v4 with: path: dist merge-multiple: true - name: Release uses: softprops/action-gh-release@v2 with: files: dist/* generate_release_notes: true