magic/toolchains/emscripten/defs.mak

39 lines
1.5 KiB
Makefile
Raw Normal View History

Add WASM entry point and Emscripten build wiring The pieces that make Magic actually buildable as a WASM library. * magic/magicWasm.c — new headless entry point exporting four functions used by the JS wrapper: - magic_wasm_init() idempotent initialisation - magic_wasm_run_command(s) dispatch one Magic command - magic_wasm_source_file(p) execute a script from the VFS - magic_wasm_update() drive a display-update cycle Sets CAD_ROOT=/ if unset, so embedded technology files under /magic/sys/ resolve correctly. Centers the command point inside GrScreenRect so commands route to the layout window client rather than the border/window-management client. * utils/main.c, utils/main.h — split magicMain() into magicMainInit() + the dispatch loop. magicMainInit is idempotent (a static flag guards against re-initialisation) so JS callers can call any of the four wasm entry points first without sequencing. * magic/Makefile — adds the WASM link target, gated by MAKE_WASM=1 set from toolchains/emscripten/defs.mak. Conditionally compiles magicWasm.c into the main binary, links to magic.js and runs post-build.sh on the result. * toolchains/emscripten/defs.mak — Emscripten linker flags (WASM=1, MODULARIZE, EXPORT_ES6, ALLOW_MEMORY_GROWTH, INITIAL_MEMORY=32M, STACK_SIZE=5M), the four EXPORTED_FUNCTIONS, and the embed-file bindings for the technology files under /magic/sys/. * toolchains/emscripten/post-build.sh — patches Emscripten's ESM output so it works in pure Node.js ESM: aliases require() through createRequire, injects __filename / __dirname shims, and resyncs the ___emscripten_embedded_file_data constant from the wasm global section if Emscripten emitted a stale value. Idempotent and pinned to emsdk 3.1.56 (see WARNING in the header). * toolchains/emscripten/README.md — full build documentation: quick-start via npm/build.sh, manual build, list of embedded files, exported C API, JavaScript usage example, and notes on CAD_ROOT, DISPLAY_SUSPEND, and the signal-API stubs. * .gitignore — adds the WASM artefacts (magic.js, magic.wasm, magic.symbols), tightens the editor/OS cruft list, and keeps toolchains/emscripten/defs.mak tracked despite the `defs.mak` ignore rule.
2026-05-04 13:31:41 +02:00
# WASM-specific make additions — append to the configure-generated defs.mak.
#
# Usage (matches what the CI workflow does):
#
# source <emsdk>/emsdk_env.sh
# 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
# cat toolchains/emscripten/defs.mak >> defs.mak
# emmake make depend
# emmake make -j$(nproc) modules libs
# emmake make techs
# emmake make mains
# Activate the WASM link target in magic/Makefile.
MAKE_WASM = 1
# Emscripten linker flags.
# The link step runs from the magic/ subdirectory, so embed-file paths
# are relative to that directory (../scmos, ../windows/...).
TOP_EXTRA_LIBS += \
-sWASM=1 \
-sMODULARIZE=1 \
-sEXPORT_ES6=1 \
Add TCL-embedded WASM build variant alongside the existing non-TCL build Bump VERSION to 8.3.645. magic.wasm can now be built as two variants packaged in the same npm release: notcl/ (legacy, magic's own parser) and tcl/ (intubun/tcl 9.x statically linked, commands evaluated by Tcl_EvalEx). The TCL fork is pinned via npm/tcl.ref and cloned/built by magic itself — the tcl/ checkout is treated as read-only and built out-of-source into magic/build-tcl-wasm/. Configure layer: - New usingTk variable decoupled from usingTcl in scripts/configure.in + scripts/configure, so --with-tcl --without-tk is finally a valid combination. Native Linux Tcl+Tk builds keep their previous behaviour (both flags default to enabled). - When usingTk is empty, configure passes -DMAGIC_NO_TK so the small number of remaining Tk callsites in tcltk/tclmagic.{h,c} compile out, and TKCOMMON_SRCS / USE_TK_STUBS are omitted from the link. WASM build orchestration: - toolchains/emscripten/build-tcl-wasm.sh builds libtcl9.x.a + libtclstub.a + tclConfig.sh out-of-source from a pristine intubun/tcl checkout. - npm/build.sh grew a --variant=<tcl|notcl|both> flag and writes its outputs into npm/tcl/ and npm/notcl/. It also clones intubun/tcl with autocrlf=false at the SHA pinned by npm/tcl.ref. - magic/Makefile (WASM block only): magicWasm.o is now compiled with DFLAGS_NOSTUB so Tcl_CreateInterp resolves to libtcl9.x directly before tclStubsPtr is set. magic.js link pulls in LIB_SPECS_NOSTUB and -ltclstub. After rules.mak include, magic: is a phony alias for magic.js so the generic ${MODULE} recipe doesn't fight it. - toolchains/emscripten/defs.mak: add -sUSE_ZLIB=1 (libtcl9 references zlib), replace -sSTACK_SIZE=N with -Wl,-z,stack-size=N (emcc >=5 rejects the setting form). - magic/magicWasm.c bootstraps the embedded interp under MAGIC_WRAPPER (Tcl_CreateInterp -> Tcl_Init -> Tclmagic_Init) and routes run_command through Tcl_EvalEx. - magic/magicTop.c: gate MagicVersion/Revision/CompileTime on !MAGIC_WRAPPER so they don't collide with the copies in tcltk/tclmagic.c when both objects land in the same wasm binary. npm package: - Subpath exports: ".", "./tcl", "./notcl". Default import keeps the pre-existing non-TCL behaviour for backward compatibility. - examples/smoke-tcl.mjs exercises the TCL variant. CI: - main-wasm.yml clones intubun/tcl at the pinned ref, builds both variants via npm/build.sh --variant=both, runs the existing notcl test suite and the new TCL smoke test, and publishes only on a v<x.y.z>... git tag. Tag name (minus the leading v) becomes the npm version.
2026-05-17 21:41:03 +02:00
-sUSE_ZLIB=1 \
Add WASM entry point and Emscripten build wiring The pieces that make Magic actually buildable as a WASM library. * magic/magicWasm.c — new headless entry point exporting four functions used by the JS wrapper: - magic_wasm_init() idempotent initialisation - magic_wasm_run_command(s) dispatch one Magic command - magic_wasm_source_file(p) execute a script from the VFS - magic_wasm_update() drive a display-update cycle Sets CAD_ROOT=/ if unset, so embedded technology files under /magic/sys/ resolve correctly. Centers the command point inside GrScreenRect so commands route to the layout window client rather than the border/window-management client. * utils/main.c, utils/main.h — split magicMain() into magicMainInit() + the dispatch loop. magicMainInit is idempotent (a static flag guards against re-initialisation) so JS callers can call any of the four wasm entry points first without sequencing. * magic/Makefile — adds the WASM link target, gated by MAKE_WASM=1 set from toolchains/emscripten/defs.mak. Conditionally compiles magicWasm.c into the main binary, links to magic.js and runs post-build.sh on the result. * toolchains/emscripten/defs.mak — Emscripten linker flags (WASM=1, MODULARIZE, EXPORT_ES6, ALLOW_MEMORY_GROWTH, INITIAL_MEMORY=32M, STACK_SIZE=5M), the four EXPORTED_FUNCTIONS, and the embed-file bindings for the technology files under /magic/sys/. * toolchains/emscripten/post-build.sh — patches Emscripten's ESM output so it works in pure Node.js ESM: aliases require() through createRequire, injects __filename / __dirname shims, and resyncs the ___emscripten_embedded_file_data constant from the wasm global section if Emscripten emitted a stale value. Idempotent and pinned to emsdk 3.1.56 (see WARNING in the header). * toolchains/emscripten/README.md — full build documentation: quick-start via npm/build.sh, manual build, list of embedded files, exported C API, JavaScript usage example, and notes on CAD_ROOT, DISPLAY_SUSPEND, and the signal-API stubs. * .gitignore — adds the WASM artefacts (magic.js, magic.wasm, magic.symbols), tightens the editor/OS cruft list, and keeps toolchains/emscripten/defs.mak tracked despite the `defs.mak` ignore rule.
2026-05-04 13:31:41 +02:00
-sEXPORTED_FUNCTIONS=_magic_wasm_init,_magic_wasm_run_command,_magic_wasm_source_file,_magic_wasm_update \
-sEXPORTED_RUNTIME_METHODS=cwrap,ccall,FS,setValue,getValue \
-sALLOW_MEMORY_GROWTH=1 \
-sINITIAL_MEMORY=67108864 \
-Wl,-z,stack-size=10485760 \
Add WASM entry point and Emscripten build wiring The pieces that make Magic actually buildable as a WASM library. * magic/magicWasm.c — new headless entry point exporting four functions used by the JS wrapper: - magic_wasm_init() idempotent initialisation - magic_wasm_run_command(s) dispatch one Magic command - magic_wasm_source_file(p) execute a script from the VFS - magic_wasm_update() drive a display-update cycle Sets CAD_ROOT=/ if unset, so embedded technology files under /magic/sys/ resolve correctly. Centers the command point inside GrScreenRect so commands route to the layout window client rather than the border/window-management client. * utils/main.c, utils/main.h — split magicMain() into magicMainInit() + the dispatch loop. magicMainInit is idempotent (a static flag guards against re-initialisation) so JS callers can call any of the four wasm entry points first without sequencing. * magic/Makefile — adds the WASM link target, gated by MAKE_WASM=1 set from toolchains/emscripten/defs.mak. Conditionally compiles magicWasm.c into the main binary, links to magic.js and runs post-build.sh on the result. * toolchains/emscripten/defs.mak — Emscripten linker flags (WASM=1, MODULARIZE, EXPORT_ES6, ALLOW_MEMORY_GROWTH, INITIAL_MEMORY=32M, STACK_SIZE=5M), the four EXPORTED_FUNCTIONS, and the embed-file bindings for the technology files under /magic/sys/. * toolchains/emscripten/post-build.sh — patches Emscripten's ESM output so it works in pure Node.js ESM: aliases require() through createRequire, injects __filename / __dirname shims, and resyncs the ___emscripten_embedded_file_data constant from the wasm global section if Emscripten emitted a stale value. Idempotent and pinned to emsdk 3.1.56 (see WARNING in the header). * toolchains/emscripten/README.md — full build documentation: quick-start via npm/build.sh, manual build, list of embedded files, exported C API, JavaScript usage example, and notes on CAD_ROOT, DISPLAY_SUSPEND, and the signal-API stubs. * .gitignore — adds the WASM artefacts (magic.js, magic.wasm, magic.symbols), tightens the editor/OS cruft list, and keeps toolchains/emscripten/defs.mak tracked despite the `defs.mak` ignore rule.
2026-05-04 13:31:41 +02:00
-sASSERTIONS=1 \
-sENVIRONMENT=node,web,worker \
-sFORCE_FILESYSTEM=1 \
--embed-file ../scmos@/magic/sys/current \
--embed-file ../windows/windows7.glyphs@/magic/sys/windows7.glyphs \
--embed-file ../windows/windows7.glyphs@/magic/sys/bw.glyphs