diff --git a/.github/workflows/rust-release.yml b/.github/workflows/rust-release.yml index c55766af..c2f52e07 100644 --- a/.github/workflows/rust-release.yml +++ b/.github/workflows/rust-release.yml @@ -1,12 +1,13 @@ name: Rust release artifacts -# Triggered on tag push (v*) — assembles a GitHub Release draft. The desktop -# binary build job has been removed: the `openpencil-app` placeholder crate -# was deleted in Phase 1 Task 1.2, and real desktop apps (DMG / AppImage / EXE -# installer) arrive in Step 1f as new `op-*` crates that will reintroduce a -# build matrix here. The wasm web bundle is currently DEFERRED (see comment -# block below); when the CI-side C-hard pipeline (emscripten install + EMSDK + -# symlink hack + wasm-bindgen + wasm-opt) lands it will re-enter the matrix. +# Triggered on tag push (v*) — builds release binaries across desktop targets +# and assembles a GitHub Release draft. The `build` job builds the real +# `openpencil-desktop` crate (winit + skia-safe runner that drives the Rust +# shell); the deleted `openpencil-app` placeholder crate is gone (Phase 1 +# Task 1.2). Full DMG / AppImage / EXE installer packaging lands in Step 1f. +# The wasm web bundle is currently DEFERRED (see comment block below); when +# the CI-side C-hard pipeline (emscripten install + EMSDK + symlink hack + +# wasm-bindgen + wasm-opt) lands it will re-enter the matrix. on: push: @@ -14,6 +15,93 @@ on: workflow_dispatch: jobs: + build: + name: ${{ matrix.label }} + runs-on: ${{ matrix.runner }} + strategy: + fail-fast: false + matrix: + include: + - label: macos-aarch64 + runner: macos-latest + target: aarch64-apple-darwin + archive: tar.gz + # macos-13 (Intel) deprecated; cross-compile x86_64-apple-darwin + # from Apple Silicon (cargo supports cross-compile to host's other + # arch out of the box, no `cross` needed). + - label: macos-x86_64 + runner: macos-latest + target: x86_64-apple-darwin + archive: tar.gz + - label: linux-x86_64 + runner: ubuntu-latest + target: x86_64-unknown-linux-gnu + archive: tar.gz + - label: linux-aarch64 + runner: ubuntu-latest + target: aarch64-unknown-linux-gnu + archive: tar.gz + cross: true + - label: windows-x86_64 + runner: windows-latest + target: x86_64-pc-windows-msvc + archive: zip + # Windows ARM64 — cargo cross-compile from x86_64 windows runner. + - label: windows-aarch64 + runner: windows-latest + target: aarch64-pc-windows-msvc + archive: zip + steps: + - uses: actions/checkout@v4 + with: + submodules: recursive + - uses: dtolnay/rust-toolchain@stable + with: + toolchain: '1.85' + targets: ${{ matrix.target }} + - uses: Swatinem/rust-cache@v2 + with: + key: release-${{ matrix.target }} + - name: Install Linux GL/EGL prereqs + if: runner.os == 'Linux' && matrix.cross != true + run: | + sudo apt-get update + sudo apt-get install -y \ + libxkbcommon-dev libxkbcommon-x11-dev \ + libwayland-dev libxcb-render0-dev libxcb-shape0-dev libxcb-xfixes0-dev \ + libegl1-mesa-dev libgles2-mesa-dev libgbm-dev \ + libfreetype-dev libfontconfig1-dev + - name: Install cross + if: matrix.cross == true + run: cargo install cross --locked --version 0.2.5 + - name: Build (host) + if: matrix.cross != true + run: cargo build -p openpencil-desktop --target ${{ matrix.target }} --release + - name: Build (cross) + if: matrix.cross == true + run: cross build -p openpencil-desktop --target ${{ matrix.target }} --release + - name: Package archive (unix) + if: matrix.archive == 'tar.gz' + shell: bash + run: | + cd target/${{ matrix.target }}/release + tar czf ../../../openpencil-desktop-${{ matrix.label }}.tar.gz openpencil-desktop + - name: Package archive (windows) + if: matrix.archive == 'zip' + shell: pwsh + run: | + Compress-Archive ` + -Path target\${{ matrix.target }}\release\openpencil-desktop.exe ` + -DestinationPath openpencil-desktop-${{ matrix.label }}.zip + - name: Upload artifact + uses: actions/upload-artifact@v4 + with: + name: openpencil-desktop-${{ matrix.label }} + path: | + openpencil-desktop-${{ matrix.label }}.tar.gz + openpencil-desktop-${{ matrix.label }}.zip + if-no-files-found: ignore + # Phase 1b release wasm artifact: explicitly DEFERRED (not silently # dropped). The local C-hard pipeline (vendor/skia-safe-op fork + # crates/wasm-libc-shim) does produce a runtime-loadable @@ -35,11 +123,10 @@ jobs: release-draft: name: Create / update GitHub Release draft - # Desktop `build` job removed with the `openpencil-app` placeholder - # crate (Phase 1 Task 1.2); the `wasm` job is deferred (see comment - # block above). When the Step 1f `op-*` desktop crates and the - # CI-side C-hard pipeline land, re-add those jobs and list their - # names in this `needs:` field. + # `wasm` job deferred (see comment block above); when the + # CI-side C-hard pipeline lands, re-add the job and append its + # name to this `needs:` list. + needs: [build] runs-on: ubuntu-latest if: startsWith(github.ref, 'refs/tags/v') steps: diff --git a/README.md b/README.md index 922f99c8..e2497d8b 100644 --- a/README.md +++ b/README.md @@ -461,11 +461,9 @@ bun run cargo:deny # cargo-deny (native + wasm32 bans; CI uses cargo-deny **Crate list (`crates/`):** -| Crate | Category | wasm32 | -| ----------------------------------------------------------- | ------------------------------ | --------------------------------------------- | -| openpencil-app | Stage F entry placeholder | — | -| openpencil-shell-{core,web,native} | UI shell(spec §1.2 三 crate) | core/web ✅ / native ❌ (compile_error guard) | -| pen-types / pen-core / pen-engine / pen-codegen / pen-figma | bucket A logic | ✅ | +| Crate | Category | wasm32 | +| ---------------------------------- | ------------------------------ | --------------------------------------------- | +| openpencil-shell-{core,web,native} | UI shell(spec §1.2 三 crate) | core/web ✅ / native ❌ (compile_error guard) | **Submodule:** `vendor/agent` → `github.com/ZSeven-W/agent-rs` (cross-product Rust agent runtime). diff --git a/package.json b/package.json index d920e46a..55ba2d76 100644 --- a/package.json +++ b/package.json @@ -51,7 +51,7 @@ "cargo:test": "cargo test --workspace", "cargo:fmt": "cargo fmt --all", "cargo:clippy": "cargo clippy --workspace --all-targets -- -D warnings", - "cargo:wasm-check": "cargo check --target wasm32-unknown-unknown -p openpencil-shell-web --no-default-features --features web && cargo check --target wasm32-unknown-unknown -p pen-types -p pen-core -p pen-engine -p pen-codegen -p pen-figma", + "cargo:wasm-check": "cargo check --target wasm32-unknown-unknown -p openpencil-shell-web --no-default-features --features web", "cargo:deny": "cargo deny check && cargo deny --target wasm32-unknown-unknown check bans", "shell:wasm:dev": "echo 'Step 4 will replace this with: cargo build --target wasm32-unknown-unknown -p openpencil-shell-web --no-default-features --features web && wasm-pack build crates/openpencil-shell-web --target web --dev && bun run scripts/serve-wasm-dev.ts'" }, diff --git a/tools/check-jian-boundaries.sh b/tools/check-jian-boundaries.sh index 1cbf58ac..385c20c0 100755 --- a/tools/check-jian-boundaries.sh +++ b/tools/check-jian-boundaries.sh @@ -96,4 +96,4 @@ if [ -n "$shell_web_deps" ]; then exit 1 fi -echo "check-jian-boundaries.sh: all 4 Jian boundary invariants pass." +echo "check-jian-boundaries.sh: all 3 Jian boundary invariants pass."