3
0
Fork 0
mirror of https://github.com/Z3Prover/z3 synced 2026-07-15 03:25:43 +00:00
z3/.github/workflows/wasm-release.yml
copilot-swe-agent[bot] 66b0f58e23
Add single-threaded WASM build for z3-solver without SharedArrayBuffer
- Add makeCCSinglethreadWrapper() in make-cc-wrapper.ts that generates
  synchronous async wrappers using EM_ASM instead of threads +
  MAIN_THREAD_ASYNC_EM_ASM. Refactor shared error-handler code into a
  SHARED_ERROR_HANDLERS constant used by both variants.

- Add build-wasm-singlethread.ts: new build script that compiles a
  separate libz3.a (in build-singlethread/) and z3-built-singlethread.js
  without -pthread / USE_PTHREADS=1. Uses -DSINGLE_THREAD -DPOLLING_TIMER
  and ALLOW_MEMORY_GROWTH instead of a fixed 2 GB SharedArrayBuffer.

- Add src/node-singlethread.ts and src/browser-singlethread.ts entry
  points. Browser variant reads initZ3SingleThread from global scope
  (load z3-built-singlethread.js via importScripts in a Web Worker).

- Add tests for both new entry points (node-singlethread.test.ts,
  browser-singlethread.test.ts).

- Update package.json: add build:wasm:singlethread script; add exports
  map so users can do import { init } from 'z3-solver/singlethread'.

- Update PUBLISHED_README.md: document the single-threaded variant,
  explain when to use it (no COOP/COEP headers), and provide a Web
  Worker usage example.

- Update wasm.yml CI: add check-singlethread parallel job.
- Update wasm-release.yml: build single-threaded artifact before publish.

- Guard scoped_timer.cpp with #if defined(SINGLE_THREAD) &&
  !defined(__EMSCRIPTEN_PTHREADS__) so that thread-based timer creation
  is skipped in single-threaded Emscripten builds (POLLING_TIMER covers
  the primary cancel_eh<reslimit> use-case).
2026-07-13 04:05:49 +00:00

71 lines
1.7 KiB
YAML

name: WebAssembly Publish
on:
workflow_dispatch:
release:
types: [published]
defaults:
run:
working-directory: src/api/js
env:
EM_VERSION: 3.1.73
permissions:
contents: read # to fetch code (actions/checkout)
jobs:
publish:
name: Publish
runs-on: ubuntu-latest
steps:
- name: Checkout
uses: actions/checkout@v7.0.0
- name: Setup node
uses: actions/setup-node@v6
with:
node-version: "lts/*"
registry-url: "https://registry.npmjs.org"
- name: Prepare for publish
run: |
npm version $(node -e 'console.log(fs.readFileSync("../../../.github/workflows/release.yml", "utf8").match(/RELEASE_VERSION:\s*\x27(\S+)\x27/)[1])')
mv PUBLISHED_README.md README.md
cp ../../../LICENSE.txt .
- name: Setup emscripten
uses: mymindstorm/setup-emsdk@v16
with:
no-install: true
version: ${{env.EM_VERSION}}
actions-cache-folder: "emsdk-cache"
- name: Install dependencies
run: npm ci
- name: Build TypeScript
run: npm run build:ts
- name: Build wasm (threaded)
run: |
emsdk install ${EM_VERSION}
emsdk activate ${EM_VERSION}
source $(dirname $(which emsdk))/emsdk_env.sh
which node
which clang++
npm run build:wasm
- name: Build wasm (single-threaded)
run: |
source $(dirname $(which emsdk))/emsdk_env.sh
npm run build:wasm:singlethread
- name: Test
run: npm test
- name: Publish
run: npm publish
env:
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}