diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index d7c4394..d2870b0 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -65,16 +65,18 @@ jobs: build_dir: target/aarch64-pc-windows-msvc/release rustflags: -C target-feature=+crt-static # Linux:固定 ubuntu-22.04(glibc 2.35 地板)而不是 latest, - # 否则产物的 glibc 底线会跟着 runner 漂移(24.04 = 2.39)。 + # 否则产物的 glibc 底线会跟着 runner 漂移(24.04 的 glibc 明显更高)。 - slot: linux-x64 os: ubuntu-22.04 build_dir: target/release # Linux arm64:公开仓库免费的原生 ARM64 runner(原生构建,不做交叉)。 - # 该 runner 家族只有 24.04 档(`ubuntu-24.04-arm`),所以产物 glibc 地板是 2.39, - # 高于 x64 的 2.35 —— packaging/README.md §4 按实际 runner 如实标注,不假装同地板; - # 真要 2.35 地板就把本行 os 换成 `ubuntu-22.04-arm`(GitHub 文档同样列出该标准标签)。 + # 用 `ubuntu-22.04-arm` 而**不是** 24.04:与 x64 同 glibc 地板(2.35), + # 覆盖 Debian 12 / Ubuntu 22.04 arm64 / Raspberry Pi OS Bookworm(2.36)这类实际在跑的 + # ARM 发行版;换 24.04 会把地板抬高、把上面前两个挡在门外。该家族标签有 + # `ubuntu-22.04-arm` / `ubuntu-24.04-arm` / `ubuntu-26.04-arm`,均 4C/16GB、 + # 公开仓库免费不限量(GitHub 文档 Standard runners for public repositories)。 - slot: linux-arm64 - os: ubuntu-24.04-arm + os: ubuntu-22.04-arm build_dir: target/release # macOS:latest = arm64;Intel x64 用 macos-15-intel(macos-13 已下线)。 - slot: macos-arm64 @@ -89,6 +91,7 @@ jobs: - name: Linux 图形栈构建依赖(winit / femtovg 编译期需要) if: runner.os == 'Linux' + shell: bash run: | sudo apt-get update sudo apt-get install -y --no-install-recommends \ @@ -99,9 +102,13 @@ jobs: - uses: Swatinem/rust-cache@v2 # 只有交叉编译槽位需要额外 target(原生槽位留空 → 本步整体跳过)。 + # 不把 `${{ }}` 直接拼进 bash:与后面的打包步骤同一纪律,一律经 env 传入再展开。 - name: 追加交叉编译目标 ${{ matrix.target }} if: matrix.target != '' - run: rustup target add ${{ matrix.target }} + shell: bash + env: + TARGET: ${{ matrix.target }} + run: rustup target add "$TARGET" # 交叉链接的前提是镜像里真有 ARM64 的 MSVC 库(VC `/lib/arm64/libcmt.lib`,+crt-static # 就靠它)与 Windows SDK 的 ARM64 导入库(`um/arm64/kernel32.lib`)。缺了照样是失败, diff --git a/packaging/README.md b/packaging/README.md index 1604f5a..a53d8c3 100644 --- a/packaging/README.md +++ b/packaging/README.md @@ -69,7 +69,7 @@ python packaging/make_artifacts.py --slot windows-arm64 \ `--slot` 与宿主槽位不一致时,`ull --version` 冒烟会**自动跳过并打印原因**(arm64 产物在 x64 宿主机上根本执行不了;拿"跳过"当通过是假证据,所以跳过永远带原因)——那条路径的验证只能落在 CI 真机上:`windows-arm64` 由 cross 构建产物 + M50 的 dumpbin 导入表门禁覆盖,`linux-arm64` -由 `ubuntu-24.04-arm` 原生 runner 上真跑冒烟覆盖。 +由 `ubuntu-22.04-arm` 原生 runner 上真跑冒烟覆盖。 ### CI(四平台六槽位矩阵) @@ -83,7 +83,7 @@ CI 真机上:`windows-arm64` 由 cross 构建产物 + M50 的 dumpbin 导入 - 矩阵(六槽位;`matrix.build_dir` 参数化产物根,脚本不再假设产物一定在 `target/release`): `windows-latest` x64(MSVC + `-C target-feature=+crt-static`)、`windows-latest` **交叉编译**到 `aarch64-pc-windows-msvc`(产物在 `target/aarch64-pc-windows-msvc/release`)、`ubuntu-22.04` - (glibc 2.35 地板)、`ubuntu-24.04-arm`(原生 ARM64 runner,glibc 2.39 地板)、`macos-latest`(arm64)、 + (glibc 2.35 地板)、`ubuntu-22.04-arm`(原生 ARM64 runner,**与 x64 同 2.35 地板**)、`macos-latest`(arm64)、 `macos-15-intel`(Intel x64;`macos-13` 已下线,`macos-26-intel` 为更新替位)。 - 每个槽位 `cargo build --release --locked`(交叉槽位多两步:`rustup target add` + ARM64 库体检 ——查 VC 的 `lib/arm64/libcmt.lib`(`+crt-static` 靠它)与 SDK 的 `um/arm64/kernel32.lib`, @@ -151,11 +151,11 @@ Debian/Ubuntu 一行:`sudo apt install libxkbcommon0 fontconfig libgl1 libegl1 ### Linux arm64(aarch64) 依赖与 x64 完全同一套(`libxkbcommon` / `fontconfig` / `libGL` / `libxcb` / `libwayland-client`), -唯一差别是 **glibc 地板**:arm64 槽位跑在原生 `ubuntu-24.04-arm` runner 上,地板 = **2.39**; -x64 那边固定 `ubuntu-22.04`,地板 2.35。这里不假装"两档同地板"——如实标注是硬要求: -Raspberry Pi OS Bookworm(2.36)、Ubuntu 22.04 arm64(2.35)这类更老的 ARM 发行版会被 2.39 的 -产物挡住。要更低的 arm64 地板,把 `release.yml` 里那个槽位的 `os` 换成 `ubuntu-22.04-arm` -(GitHub 文档同样列出该标准公开仓库标签)即可,脚本与产物名都不用动。 +**glibc 地板也相同**:arm64 槽位跑在原生 `ubuntu-22.04-arm` runner 上,地板 = **2.35**,与 x64 +用的 `ubuntu-22.04` 一致。选 22.04 而不是 24.04 就是为了这个地板——24.04 的 glibc 更高,会把 +Debian 12(2.36)、Raspberry Pi OS Bookworm(2.36)这些实际在跑的 ARM 发行版挡在门外。 +要抬地板(例如将来 ARM 生态整体上移)换 `release.yml` 里那个槽位的 `os` 即可,脚本与产物名都不用动; +`ubuntu-24.04-arm` / `ubuntu-26.04-arm` 都是同一家族的标准公开仓库标签(4C/16GB、免费不限量)。 ### macOS 12+ @@ -308,7 +308,7 @@ merge 后由 tower 重指 tag 重跑流水线,两槽位进 `SHA256SUMS.txt` | macOS 12+(arm64 / x64) | 一等 | 无第三方库;未签名需去 quarantine | | Linux x64 X11 | 一等 | glibc 2.35+、xkbcommon、fontconfig、libGL、xcb | | Linux x64 Wayland | 支持 | 上述 + wayland-client | -| Linux arm64 X11 | 一等 | glibc **2.39+**(`ubuntu-24.04-arm` 原生构建,高于 x64 的 2.35)、xkbcommon、fontconfig、libGL、xcb | +| Linux arm64 X11 | 一等 | glibc 2.35+(`ubuntu-22.04-arm` 原生构建,**与 x64 同地板**)、xkbcommon、fontconfig、libGL、xcb | | Linux arm64 Wayland | 支持 | 上述 + wayland-client | | Windows 8.1/8/7 | 不支持 | 基线已上调(D21) | | Android Termux + X11 | 试验级(不承诺) | 仅 CLI(源码自建),GUI 未验证,不在本发布矩阵内 | @@ -337,7 +337,7 @@ experimental / not part of this release matrix)——改一边必须同步另 老式抱怨,不影响产物(体积/导入表/冒烟均已实测正常);CI 的 MSVC 槽位不会出现这条。 7. **两个 arm64 槽位本机跑不了**:本机是 x64 Windows,既没有 ARM 机器也没有 MSVC 的 ARM64 链接库 组合,`windows-arm64` / `linux-arm64` 的**真实产物只能由 CI 出**:前者靠 `dumpbin -dependents` - 的静态 CRT 门禁 + 架构校验,后者在 `ubuntu-24.04-arm` 上真跑 `ull --version` 冒烟。 + 的静态 CRT 门禁 + 架构校验,后者在 `ubuntu-22.04-arm` 上真跑 `ull --version` 冒烟。 本机能做且已做的是脚本层取证(见 §7.5):宿主判定注入(`win32/ARM64`、`linux/aarch64` 等全槽位)、 可执行文件头架构识别(真 x64 exe + 合成 PE/ELF/Mach-O 头)、以及把真 exe 的 PE 机器码改成 ARM64 当 stub 走完命名/校验/归档全流程 —— 不假装能在 x64 上执行 arm64 二进制。 diff --git a/packaging/make_artifacts.py b/packaging/make_artifacts.py index 103d5c0..b71f69b 100644 --- a/packaging/make_artifacts.py +++ b/packaging/make_artifacts.py @@ -111,14 +111,14 @@ def host_slot(os_name: str | None = None, machine: str | None = None) -> str: own (no ARM machine here); they default to the real ones. """ os_name = (sys.platform if os_name is None else os_name).lower() - machine = MACHINE_ALIASES.get( - (platform.machine() if machine is None else machine).lower() - ) + raw_machine = platform.machine() if machine is None else machine + arch = MACHINE_ALIASES.get(raw_machine.lower()) family = next((fam for prefix, fam in OS_FAMILIES if os_name.startswith(prefix)), None) for slot, (slot_os, slot_arch, _) in SLOTS.items(): - if (slot_os, slot_arch) == (family, machine): + if (slot_os, slot_arch) == (family, arch): return slot - fail(f"unsupported build host {os_name}/{machine}; matrix is {' / '.join(SLOTS)}") + # 报错带**原始**取值而不是归一后的 None:`riscv64` 这类不认识的架构得在诊断里看得见。 + fail(f"unsupported build host {os_name}/{raw_machine}; matrix is {' / '.join(SLOTS)}") def binary(name: str, build_dir: Path, family: str) -> Path: diff --git a/packaging/release-notes.md b/packaging/release-notes.md index d1defa1..97558ae 100644 --- a/packaging/release-notes.md +++ b/packaging/release-notes.md @@ -11,7 +11,7 @@ No WebView, no bundled runtime, no JRE download needed to start the launcher its | Windows 10/11 x64 | `unlucky-launcher-{{VERSION}}-windows-x64.exe` | single exe, double-click to run | | Windows 11 ARM64 | `unlucky-launcher-{{VERSION}}-windows-arm64.exe` | single exe, runs natively on ARM64 Windows | | Linux x64 (X11/Wayland) | `unlucky-launcher-{{VERSION}}-linux-x64.tar.gz` | single binary inside, no installer | -| Linux arm64 (X11/Wayland) | `unlucky-launcher-{{VERSION}}-linux-arm64.tar.gz` | single binary inside; needs glibc 2.39+ | +| Linux arm64 (X11/Wayland) | `unlucky-launcher-{{VERSION}}-linux-arm64.tar.gz` | single binary inside; needs glibc 2.35+ | | macOS 12+ Apple Silicon | `unlucky-launcher-{{VERSION}}-macos-arm64.tar.gz` | single binary inside, no installer | | macOS 12+ Intel | `unlucky-launcher-{{VERSION}}-macos-x64.tar.gz` | single binary inside, no installer | @@ -28,7 +28,7 @@ with the download on every platform. | macOS 12+ (arm64 / x64) | first class | nothing; unsigned build, see Gatekeeper note | | Linux x64, X11 | first class | `libxkbcommon`, `fontconfig`, `libGL` (or software renderer), `libxcb` | | Linux x64, Wayland | supported | `wayland-client`, `libxkbcommon`, plus the X11 set for XWayland apps | -| Linux arm64, X11 | first class | glibc **2.39+** (built on `ubuntu-24.04-arm`, higher than the x64 floor of 2.35), `libxkbcommon`, `fontconfig`, `libGL`, `libxcb` | +| Linux arm64, X11 | first class | glibc 2.35+ (built on `ubuntu-22.04-arm`, same floor as x64), `libxkbcommon`, `fontconfig`, `libGL`, `libxcb` | | Linux arm64, Wayland | supported | the above plus `wayland-client` | | Windows 8.1/8/7 | unsupported | baseline was raised to Win10 (decision D21) | | Android — Termux + X11 | experimental, not promised | CLI only (build from source), GUI unverified; not part of this release matrix |