diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 7517d98c..60c79028 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -19,7 +19,12 @@ jobs: fail-fast: false matrix: include: + # `os` is what the per-step guards key on, never the runner label: + # there are now two Linux labels, so `platform == 'ubuntu-24.04'` + # would silently skip the apt step on the arm64 leg and fail it at + # the eframe build instead. - platform: windows-latest + os: windows formats: nsis # Pinned rather than `ubuntu-latest` so the glibc floor of the .deb # and .AppImage is a decision, not whatever GitHub last moved the @@ -29,8 +34,32 @@ jobs: # so the Linux artifacts no longer run on Ubuntu 22.04 or Debian 12 — # stated in the README's Install section. - platform: ubuntu-24.04 + os: linux formats: deb,appimage + # arm64 Linux — Raspberry Pi 5, Ampere/Graviton servers, Snapdragon X + # laptops running Linux. A *native* runner, not a cross-build: this + # repo cannot cross-compile (TODO.md — `ring`'s build script needs a + # target C toolchain), and ARM AppImages can only be produced on ARM + # hardware anyway. + # + # Nothing in the sensor path is x86-specific: the Linux backend is + # sysfs and procfs (src/source/linux.rs), which is architecture + # neutral, and the one place that does read CPUID is already gated — + # src/sysinfo.rs has an explicit + # `not(any(target_arch = "x86_64", ...))` arm. So aarch64 compiles + # today; what it loses is the CPUID signature, the codename and the + # x86 feature-flag list in the System Summary, which report empty. + # + # `deb` only, deliberately. cargo-packager's AppImage path fetches + # linuxdeploy, and whether it resolves an aarch64 build of it is + # unverified — adding `appimage` here on a guess would make the leg + # red for a reason unrelated to this project. Widen it once someone + # has watched it work. + - platform: ubuntu-24.04-arm + os: linux + formats: deb - platform: macos-latest + os: macos formats: dmg runs-on: ${{ matrix.platform }} defaults: @@ -40,7 +69,7 @@ jobs: - uses: actions/checkout@v5 - name: Install Linux build dependencies - if: matrix.platform == 'ubuntu-24.04' + if: matrix.os == 'linux' run: | sudo apt-get update sudo apt-get install -y \ @@ -55,7 +84,7 @@ jobs: workspaces: app -> target - name: Publish LHM bridge sidecar (Windows) - if: matrix.platform == 'windows-latest' + if: matrix.os == 'windows' run: dotnet publish sidecar -c Release -o sidecar/publish # Failing test names are echoed as ::error:: annotations so they show up @@ -131,7 +160,7 @@ jobs: # would break silently between tags and only be discovered while cutting # a release. Windows-only: the embedded sidecar is a no-op elsewhere. - name: Build the portable exe (Windows) - if: matrix.platform == 'windows-latest' + if: matrix.os == 'windows' run: cargo build --release --features portable --target-dir target-portable - name: Install cargo-packager diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 5df43dbd..f71a6f00 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -113,7 +113,11 @@ jobs: # # These paths are relative to the *workspace root*, not to app/. See # the note on the publish step. + # + # `os` — not the runner label — is what the per-step guards key on, + # because there are now two Linux labels. See ci.yml. - platform: windows-latest + os: windows formats: nsis artifacts: | app/target/release/*-setup.exe @@ -122,11 +126,26 @@ jobs: # from 2026-09-17). See the matching note in ci.yml for the glibc # 2.39 floor this puts on the .deb and .AppImage. - platform: ubuntu-24.04 + os: linux formats: deb,appimage artifacts: | app/target/release/*.deb app/target/release/*.AppImage + # arm64 Linux, built natively — see the long note in ci.yml for why + # this is a real runner rather than a cross-build, and why it is + # `deb` only. + # + # Both Linux legs glob `*.deb`, which is safe because cargo-packager + # puts the architecture in the filename (`_amd64.deb` vs + # `_arm64.deb`), so neither leg can match the other's artifact and + # the release ends up with both. + - platform: ubuntu-24.04-arm + os: linux + formats: deb + artifacts: | + app/target/release/*.deb - platform: macos-latest + os: macos formats: dmg artifacts: | app/target/release/*.dmg @@ -142,7 +161,7 @@ jobs: ref: ${{ needs.prepare.outputs.tag }} - name: Install Linux build dependencies - if: matrix.platform == 'ubuntu-24.04' + if: matrix.os == 'linux' run: | sudo apt-get update sudo apt-get install -y \ @@ -217,7 +236,7 @@ jobs: grep -m1 'MyAppVersion "' installer/SensorView_Setup.iss - name: Publish LHM bridge sidecar (Windows) - if: matrix.platform == 'windows-latest' + if: matrix.os == 'windows' run: dotnet publish sidecar -c Release -o sidecar/publish - name: Run tests @@ -235,7 +254,7 @@ jobs: EXPECTED: ${{ needs.prepare.outputs.version }} run: | bin=target/release/sensorview - [ "${{ matrix.platform }}" = "windows-latest" ] && bin=target/release/sensorview.exe + [ "${{ matrix.os }}" = "windows" ] && bin=target/release/sensorview.exe actual="$("$bin" --version | awk '{print $NF}')" echo "expected $EXPECTED, binary reports $actual" if [ "$actual" != "$EXPECTED" ]; then @@ -261,7 +280,7 @@ jobs: # cargo-packager has just wrapped into the installer, then copied into # target/release/ under its final name for the upload glob below. - name: Build the portable exe (Windows) - if: matrix.platform == 'windows-latest' + if: matrix.os == 'windows' shell: bash env: VERSION: ${{ needs.prepare.outputs.version }} @@ -321,7 +340,8 @@ jobs: | Windows | `SensorView_*_x64-setup.exe` | Installer | | Windows | `SensorView-*-portable.exe` | Single file, no install — see below | | macOS (Apple Silicon) | `*.dmg` | Unsigned; System Settings → Privacy & Security → Open Anyway | - | Linux | `*.deb` / `*.AppImage` | | + | Linux (x86-64) | `*_amd64.deb` / `*.AppImage` | Needs glibc 2.39+ | + | Linux (arm64) | `*_arm64.deb` | Pi 5, Ampere/Graviton, Snapdragon X | **The portable Windows build** is one self-contained `.exe`. It carries the LibreHardwareMonitor sensor bridge inside it and unpacks diff --git a/README.md b/README.md index cf154a66..36e35e94 100644 --- a/README.md +++ b/README.md @@ -248,7 +248,8 @@ Download the installer for your platform from [Releases](https://github.com/Zekt | Windows | `SensorView__x64-setup.exe` (NSIS) | Bundles the sensor sidecar; optionally installs the PawnIO driver | | Windows | `SensorView--portable.exe` | One file, no install — see below | | macOS | `SensorView__aarch64.dmg` | Apple Silicon only; **unsigned** — see below | -| Linux | `.deb` / `.AppImage` | | +| Linux (x86-64) | `.deb` / `.AppImage` | | +| Linux (arm64) | `_arm64.deb` | Raspberry Pi 5, Ampere/Graviton, Snapdragon X — see below | **The portable Windows build** is a single self-contained `.exe`. Every Windows sensor comes from the LibreHardwareMonitor sidecar, so the portable build @@ -257,6 +258,15 @@ carries that sidecar inside the binary and unpacks it to several times the size of the installer, and why it works from a USB stick with nothing beside it. Delete that folder to reclaim the space once you are done. +**Linux on arm64** gets a `.deb` only — no AppImage yet. Sensor coverage is the +same as on x86-64, because the Linux backend reads `hwmon`, `/proc` and +`cpufreq`, none of which are architecture-specific. What is missing is the +x86-only part of the **System Summary**: the CPUID signature, the +microarchitecture codename and the instruction-set feature list are blank, +since those come from the `CPUID` instruction. Everything else — temperatures, +per-core load, clocks, power, disks, network, the Task Manager, the web +dashboard — behaves identically. + **Linux glibc requirement:** the `.deb` and `.AppImage` are built on Ubuntu 24.04, so they need **glibc 2.39 or newer** — Ubuntu 24.04+, Debian 13+, Fedora 40+. They will not run on Ubuntu 22.04 or Debian 12; build from source