mirror of
https://github.com/RTimothyEdwards/magic.git
synced 2026-08-29 17:39:28 +02:00
Add npm package and CI workflows
The user-facing layer of the WASM port: a publishable npm package
plus the GitHub Actions that build and ship it.
* npm/package.json — publishes as `magic-vlsi-wasm`, ESM-only, HPND
licensed, version tracks Magic's own VERSION file (8.3.637).
Whitelists the published files and exposes index.js + index.d.ts.
* npm/index.js, npm/index.d.ts — thin JS/TS wrapper around the four
WASM exports. createMagic(opts) returns { init, runCommand,
sourceFile, update, FS } so consumers can write into the
Emscripten virtual filesystem and dispatch Magic commands from
Node.js, browsers or Web Workers.
* npm/build.sh — end-to-end build: locates emsdk (via PATH or
EMSDK_DIR), runs distclean+configure+make in the right order
(techs before mains so embed-files are present), copies
magic.js / magic.wasm into npm/. Optional --release, --test,
--pack flags. Preserves configure's exec bits across invocations.
* npm/pack.sh — produces a reproducible npm tarball by touching
every file to the build time and exporting SOURCE_DATE_EPOCH so
pacote does not rewrite mtimes to its 1985 fallback.
* npm/examples/ — runnable smoke tests for the four common
workflows (extract, gds, drc, cif), driven by examples/all.js.
Each example is self-contained and uses the bundled siliwiz
technology. helpers.js encapsulates the boilerplate.
* npm/LICENSE, npm/README.md — license text and consumer-facing
docs (install, quick-start, API, examples, build-from-source,
license, third-party content notice).
* .github/workflows/main.yml — adds a `simple_build_wasm` job that
installs a pinned emsdk (3.1.56), builds the WASM module, runs
the example test suite and uploads the npm tarball as an
artifact. Pinned for reproducibility against the post-build.sh
patches; switchable to "latest" by commenting two lines.
* .github/workflows/main-aarch64.yml — drops the now-redundant
WASM ARM job. WASM is architecture-independent.
* .github/workflows/npm-publish.yml — new workflow. Publishes to
npm on `v*` tag pushes (manual `workflow_dispatch` supported as
a dry-run). Uses the same pinned emsdk and pack.sh.
Also sets FORCE_JAVASCRIPT_ACTIONS_TO_NODE24 in both workflows to
silence the Node.js 20 deprecation warnings until
actions/upload-artifact@v6 ships a Node-24 release.
This commit is contained in:
committed by
R. Timothy Edwards
parent
02087ea3f8
commit
8560027569
@@ -1,14 +1,15 @@
|
||||
# This is a basic workflow to help you get started with Actions
|
||||
# CI for native ARM64 Linux build.
|
||||
# WASM is not built here — WebAssembly bytecode is architecture-independent,
|
||||
# so the single x86-64 WASM artifact produced by the CI workflow is identical
|
||||
# to what an ARM build would produce. See .github/workflows/main.yml.
|
||||
|
||||
name: CI-aarch64
|
||||
|
||||
# Controls when the workflow will run
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
jobs:
|
||||
simple_build_linux_arm:
|
||||
runs-on: ubuntu-24.04-arm
|
||||
@@ -23,39 +24,3 @@ jobs:
|
||||
./configure
|
||||
make database/database.h
|
||||
make -j$(nproc)
|
||||
simple_build_wasm_arm:
|
||||
runs-on: ubuntu-24.04-arm
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- name: Get Dependencies
|
||||
run: |
|
||||
git clone https://github.com/emscripten-core/emsdk.git
|
||||
cd emsdk
|
||||
./emsdk install latest
|
||||
./emsdk activate latest
|
||||
- name: Emscripten Diagnostic
|
||||
run: |
|
||||
source ./emsdk/emsdk_env.sh
|
||||
echo "===== gcc -dM -E - ====="
|
||||
echo | gcc -dM -E - | sort
|
||||
echo "===== g++ -dM -E - ====="
|
||||
echo | g++ -dM -E - | sort
|
||||
echo "===== emcc -dM -E - ====="
|
||||
echo | emcc -dM -E - | sort
|
||||
echo "===== em++ -dM -E - ====="
|
||||
echo | em++ -dM -E - | sort
|
||||
- name: Build
|
||||
run: |
|
||||
source ./emsdk/emsdk_env.sh
|
||||
# The --without and --disable in these build options is due to no WASM library being available for that feature
|
||||
CFLAGS="--std=c17 -D_DEFAULT_SOURCE=1 -DEMSCRIPTEN=1 -g" emconfigure ./configure --without-cairo --without-opengl --without-x --without-tk --without-tcl --disable-readline --disable-compression --target=asmjs-unknown-emscripten
|
||||
echo "===== defs.mak ====="
|
||||
cat defs.mak
|
||||
echo "===== defs.mak ====="
|
||||
emmake make
|
||||
- name: archive wasm bundle
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: magic-wasm-bundle-arm
|
||||
path: |
|
||||
${{ github.workspace }}/magic/magic.wasm
|
||||
|
||||
+49
-16
@@ -1,19 +1,21 @@
|
||||
# This is a basic workflow to help you get started with Actions
|
||||
|
||||
name: CI
|
||||
|
||||
# Controls when the workflow will run
|
||||
on:
|
||||
push:
|
||||
pull_request:
|
||||
workflow_dispatch:
|
||||
|
||||
# A workflow run is made up of one or more jobs that can run sequentially or in parallel
|
||||
# actions/upload-artifact@v5 still runs on Node.js 20. Force Node 24 to
|
||||
# silence the deprecation warning until upload-artifact ships a Node-24
|
||||
# release. Drop this once upgraded.
|
||||
env:
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||
|
||||
jobs:
|
||||
simple_build_linux:
|
||||
runs-on: ubuntu-22.04
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
- name: Get Dependencies
|
||||
run: |
|
||||
sudo apt-get install -y tcl-dev tk-dev libcairo-dev
|
||||
@@ -24,14 +26,24 @@ jobs:
|
||||
make -j$(nproc)
|
||||
simple_build_wasm:
|
||||
runs-on: ubuntu-22.04
|
||||
env:
|
||||
# --- emsdk version switch ---------------------------------------------
|
||||
# Pinned: post-build.sh patches depend on the exact text output of this
|
||||
# Emscripten version. Bump intentionally and re-verify the patches.
|
||||
# To test against the latest emsdk, comment the pinned line and
|
||||
# uncomment the "latest" line below.
|
||||
EMSDK_VERSION: '3.1.56'
|
||||
# EMSDK_VERSION: 'latest'
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
- uses: actions/checkout@v5
|
||||
- name: Get Dependencies
|
||||
run: |
|
||||
git clone https://github.com/emscripten-core/emsdk.git
|
||||
cd emsdk
|
||||
./emsdk install latest
|
||||
./emsdk activate latest
|
||||
./emsdk install "$EMSDK_VERSION"
|
||||
./emsdk activate "$EMSDK_VERSION"
|
||||
# Dump native + emscripten preprocessor defines. Useful for diagnosing
|
||||
# WASM-build differences after an emsdk bump.
|
||||
- name: Emscripten Diagnostic
|
||||
run: |
|
||||
source ./emsdk/emsdk_env.sh
|
||||
@@ -46,15 +58,36 @@ jobs:
|
||||
- name: Build
|
||||
run: |
|
||||
source ./emsdk/emsdk_env.sh
|
||||
# The --without and --disable in these build options is due to no WASM library being available for that feature
|
||||
CFLAGS="--std=c17 -D_DEFAULT_SOURCE=1 -DEMSCRIPTEN=1 -g" emconfigure ./configure --without-cairo --without-opengl --without-x --without-tk --without-tcl --disable-readline --disable-compression --target=asmjs-unknown-emscripten
|
||||
# --without/--disable flags: no WASM library available for these features
|
||||
CFLAGS="--std=c17 -D_DEFAULT_SOURCE=1 -DEMSCRIPTEN=1 -g" emconfigure ./configure \
|
||||
--without-cairo --without-opengl --without-x --without-tk --without-tcl \
|
||||
--disable-readline --disable-compression \
|
||||
--host=asmjs-unknown-emscripten \
|
||||
--target=asmjs-unknown-emscripten
|
||||
# Append WASM linker flags and activate the WASM link target
|
||||
cat toolchains/emscripten/defs.mak >> defs.mak
|
||||
# Echo the merged defs.mak so CI logs show the exact build config
|
||||
echo "===== defs.mak ====="
|
||||
cat defs.mak
|
||||
echo "===== defs.mak ====="
|
||||
emmake make
|
||||
- name: archive wasm bundle
|
||||
uses: actions/upload-artifact@v4
|
||||
# Build in order: techs must exist before mains (--embed-file embeds them)
|
||||
emmake make depend
|
||||
emmake make -j$(nproc) modules libs
|
||||
emmake make techs
|
||||
emmake make mains
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
name: magic-wasm-bundle
|
||||
path: |
|
||||
${{ github.workspace }}/magic/magic.wasm
|
||||
node-version: '22'
|
||||
- name: Run example tests
|
||||
run: |
|
||||
cp magic/magic.js npm/
|
||||
cp magic/magic.wasm npm/
|
||||
cd npm && npm run test
|
||||
- name: Pack npm package
|
||||
run: ./npm/pack.sh
|
||||
- name: Upload npm package
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: magic-vlsi-wasm-npm
|
||||
path: ${{ github.workspace }}/npm/*.tgz
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
name: Publish npm package
|
||||
|
||||
# Publishes magic-vlsi-wasm to npm.
|
||||
# Triggered automatically on version tags (v*); can also be run manually.
|
||||
# Requires an NPM_TOKEN repository secret for publishing.
|
||||
#
|
||||
# WASM is architecture-independent — built once on x86-64, usable everywhere.
|
||||
|
||||
on:
|
||||
push:
|
||||
tags:
|
||||
- 'v*'
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
dry_run:
|
||||
description: 'Dry run: pack only, do not publish'
|
||||
type: boolean
|
||||
default: true
|
||||
|
||||
# actions/upload-artifact@v5 still runs on Node.js 20. Force Node 24 to
|
||||
# silence the deprecation warning until upload-artifact ships a Node-24
|
||||
# release. Drop this once upgraded.
|
||||
env:
|
||||
FORCE_JAVASCRIPT_ACTIONS_TO_NODE24: true
|
||||
|
||||
jobs:
|
||||
build-and-publish:
|
||||
runs-on: ubuntu-22.04
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v5
|
||||
|
||||
- name: Set up Node.js
|
||||
uses: actions/setup-node@v5
|
||||
with:
|
||||
node-version: '22'
|
||||
registry-url: 'https://registry.npmjs.org'
|
||||
|
||||
- name: Install emsdk
|
||||
env:
|
||||
# --- emsdk version switch -----------------------------------------
|
||||
# Pinned: must match .github/workflows/main.yml. See post-build.sh.
|
||||
# To test against the latest emsdk, comment the pinned line and
|
||||
# uncomment the "latest" line below.
|
||||
EMSDK_VERSION: '3.1.56'
|
||||
# EMSDK_VERSION: 'latest'
|
||||
run: |
|
||||
git clone https://github.com/emscripten-core/emsdk.git
|
||||
cd emsdk
|
||||
./emsdk install "$EMSDK_VERSION"
|
||||
./emsdk activate "$EMSDK_VERSION"
|
||||
|
||||
- name: Build WASM
|
||||
run: |
|
||||
source ./emsdk/emsdk_env.sh
|
||||
# --without/--disable flags: no WASM library available for these features
|
||||
CFLAGS="--std=c17 -D_DEFAULT_SOURCE=1 -DEMSCRIPTEN=1" emconfigure ./configure \
|
||||
--without-cairo --without-opengl --without-x --without-tk --without-tcl \
|
||||
--disable-readline --disable-compression \
|
||||
--host=asmjs-unknown-emscripten \
|
||||
--target=asmjs-unknown-emscripten
|
||||
# Append WASM linker flags and activate the WASM link target
|
||||
cat toolchains/emscripten/defs.mak >> defs.mak
|
||||
# Build in order: techs must exist before mains (--embed-file embeds them)
|
||||
emmake make depend
|
||||
emmake make -j$(nproc) modules libs
|
||||
emmake make techs
|
||||
emmake make mains
|
||||
|
||||
- name: Copy WASM artifacts into npm/
|
||||
run: |
|
||||
cp magic/magic.js npm/
|
||||
cp magic/magic.wasm npm/
|
||||
|
||||
- name: Set package version from tag
|
||||
if: startsWith(github.ref, 'refs/tags/v')
|
||||
run: |
|
||||
VERSION="${GITHUB_REF#refs/tags/v}"
|
||||
cd npm
|
||||
npm version "$VERSION" --no-git-tag-version
|
||||
|
||||
- name: Pack
|
||||
run: ./npm/pack.sh
|
||||
|
||||
- name: Upload tarball as artifact
|
||||
uses: actions/upload-artifact@v5
|
||||
with:
|
||||
name: magic-wasm-npm-package
|
||||
path: npm/*.tgz
|
||||
|
||||
- name: Publish to npm
|
||||
if: startsWith(github.ref, 'refs/tags/v') && github.event.inputs.dry_run != 'true'
|
||||
run: cd npm && npm publish --access public
|
||||
env:
|
||||
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
||||
Reference in New Issue
Block a user