Skip to content

Cross-platform support: platform-aware update pipeline, POSIX updater ops, and native macOS app build - #10159

Open
jucardi wants to merge 13 commits into
PathOfBuildingCommunity:devfrom
jucardi:pr/crossplatform
Open

Cross-platform support: platform-aware update pipeline, POSIX updater ops, and native macOS app build#10159
jucardi wants to merge 13 commits into
PathOfBuildingCommunity:devfrom
jucardi:pr/crossplatform

Conversation

@jucardi

@jucardi jucardi commented Aug 6, 2026

Copy link
Copy Markdown

Summary

This PR makes the repository cross-platform-capable and adds a native macOS app build path.

Companion PR: the native macOS host (SimpleGraphic build + launcher) that make macos-app consumes is PathOfBuildingCommunity/PathOfBuilding-SimpleGraphic#111.

It has two logical parts:

1. Cross-platform readiness (standalone, fully backward-compatible):

  • update_manifest.py / manifest.cfg: platform tagging is now config-driven (part/platform section options) instead of hardcoding win32, so future per-platform runtime bundles need no client changes. Extensionless files (POSIX executables) are no longer skipped by the glob. manifest.xml regenerated (attribute change runtime="win32"platform="win32"; per-file platform tags on runtime files).
  • UpdateApply.lua: the infinite destination-open retry loop (which spins forever on a POSIX permission error) is now bounded with a clear error; new chmod op preserves executable bits; source handle closed on the error path.
  • UpdateCheck.lua: emits chmod ops for extensionless runtime files on non-win32 platforms. Win32 op output is byte-identical (spec-pinned).
  • GetCloudProvider and jit.opt are now optional host APIs (alternate hosts like pobfrontend don't provide them).
  • New spec enforces case-sensitive Assets/ references (a recurring Linux bug class — it immediately caught and fixed two Assets/breachicon.pngBreachIcon.png mismatches).
  • First test coverage for the update pipeline: an end-to-end UpdateCheck harness with a fake curl, UpdateApply op-interpreter specs, and pytest coverage for the manifest generator.

Backward compatibility: deployed win32 clients are unaffected. They include a remote <File> iff it has no platform attribute or it matches their local platform; adding platform="win32" to runtime files keeps them selected exactly as before. Verified against the deployed client logic in review.

2. Native macOS app build (arm64):

  • New root Makefile: test (Docker busted suite), test-python, manifest, macos-runtime, macos-app, run-macos, clean-macos.
  • make macos-app assembles build/macos/Path of Building.app from a sibling build of SimpleGraphic: flat Contents/MacOS/ bundle mirroring the Windows runtime/ layout, pob: URL scheme, ad-hoc codesign.
  • The app is a dev-mode thin shim over the checkout (runs src/Launch.lua; user data stays in src/). Auto-update is deliberately disabled: the published manifest has no macOS runtime section yet, and an update-enabled macOS install would delete its own native runtime. Updater parity is follow-up work (see docs/crossPlatform.md).
  • Docs: docs/crossPlatform.md (platform model + host contract) and a CONTRIBUTING macOS build section; also fixes a stale -PoE2.exe filename in CONTRIBUTING.

Dependency note: make macos-app requires the macOS build of SimpleGraphic, submitted as PathOfBuildingCommunity/PathOfBuilding-SimpleGraphic#111 (until it merges, the branch is available at jucardi/PathOfBuilding-SimpleGraphic feat/macos-build). Everything in part 1 is independent of it.

Testing

  • Full busted suite: 472/472 (baseline 463 + 9 new spec cases), run in the repo's Linux CI container.
  • New tests/test_update_manifest.py: 2/2. (tests/test_fix_ascendancy_positions.py has 2 pre-existing failures on dev, untouched here.)
  • macOS app verified end-to-end: renderer init ~160 ms, full startup ~2.2 s, tree/uniques/rares loaded, open-launch, settings persist to the checkout on quit, pob:// links launch the app (URL delivery to a running instance is a documented limitation).

Known limitations (documented in CONTRIBUTING)

  • macOS: pob:// Apple-Event delivery is launch-only/best-effort; the app writes imgui.ini/logs inside its bundle (discarded on rebuild; build data unaffected).
  • Accepted tradeoff: the bounded updater retry fails visibly on a persistent Windows file lock instead of hanging forever (staged files are reused on the next attempt).

🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant