The runtime is JSPI-only; this removes everything that still pretended otherwise. Three exhaustive sweeps (C++/JS+build+CI/tests+docs) drove the inventory; every deletion verified by grep closure + full gates. Broken-right-now fixes: - deploy-staging.yml passed the retired opt_level input — the workflow could not even start. Removed. - env.sh carried dead exports with a live -sASYNCIFY=1 inside (WASM_LDFLAGS/PTHREAD_LDFLAGS, zero consumers). Removed; the WASM_LEGACY_EXCEPTIONS rationale rewritten to the real reason. - docker/build.sh exported PCBJAM_ASYNC_BACKEND (read nowhere). Gone. Dead weight removed: - binaryen submodule (nothing builds or invokes it), wasm-opt-bench workflow + scripts/bench/, get-wasm-opt.sh, diagnostics.js (242 lines of Asyncify-API-only code), the KICAD_PIPELINE background-postprocess scaffolding (existed to parallelize the deleted wasm-opt phase; the postprocess is a seconds-long node script and now runs inline), build-monitor's dead asyncify rows, sched-context orphan build output, dead .gitignore entries, the .jspi-assets spike dir (the two wf-result research JSONs moved to docs/features/async/migration-evidence/). - bindings: fiber_park.h + its 12 embind registrations (broken-if- called under JSPI), the kicadOpenFileStart/OPEN_JOB starter route, main_stack_runner.h + 5 includes, the always-null context-sleep weak hook in nanosleep_yield.c. - shim: the backend field (installed-flag idempotency instead), noteContextWait (dead both sides), the __wxAsyncifyDump alias (+ the WasmTool fallback and string-dump normalize branch). - web: the emscripten-6-ignored mainScriptUrlOrBlob option in boot.ts (gerber-demo keeps it: it loads the deployed CDN release, which predates emscripten 6 — noted inline). Conditionals: all 'backend === jspi' checks reduced to scheduler- presence checks; races_quiescent re-keyed from Asyncify.state (vacuous) to real backlog quiescence (resumeReady/mutatorQueue — NOT _windowLive, which is the probing activation's own window by definition). Renames (identifiers only, no file renames): ASYNC_LINK_FLAGS→ JSPI_LINK_FLAGS and Makefile ASYNC_LDFLAGS→JSPI_LDFLAGS, kicadCollabFiberBusy→kicadCollabBusy (embind + web + tests), collab_common.h fiber*→apply*/coroutine naming, asyncifySignatures→ wasmTrapSignatures (lists byte-identical). Tests: the two remaining vacuous [wx-asyncify]/fiber-resume-refused asserts re-keyed to live JSPI beacons; eeschema-load's failure message no longer sends the developer to a deleted script; wait-beacons' dead families/parser deleted; lane-0 legacy-glue guards removed (lane 0 is unconstructible); the embind test.fail re-gated with the JSPI reason (plain embind invokers cannot suspend — verified still failing); lint-determinism now scans tests/jspi (166 files clean); eeschema-collab local-move gated to chromium (~50% flaky on FF even solo; pcbnew twin covers both engines). Docs: DEBUG.md rewritten as the JSPI debugging guide; build.md describes the single-phase build; docs/features/async/README.md banner-marked historical and repointed at the NEW 23-jspi-runtime.md (current architecture: export census, turnstile, libcontext ownership + refusal contract, embind call shapes, the em-pthread service-wrapper trick, exception policy, known gaps). Gates on the cleaned tree: test:e2e 725 passed / 0 failed (after the quiescence-probe fix; the 3 other reds were verified contention flakes solo-green or the documented FF gate), web 76/0, jspi 18/18 both engines, vitest 295/295 + 17/17, all lints green, live-app census clean. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_016X9eh1s5sTx1o9Em9KBuwR
1035 lines
49 KiB
Text
1035 lines
49 KiB
Text
# Makefile for wxWidgets WASM test apps
|
|
# Uses the local wxWidgets build
|
|
#
|
|
# Usage:
|
|
# make -f Makefile.wasm # Optimized release build
|
|
# make -f Makefile.wasm DEBUG=1 # Debug build with DWARF symbols and source maps
|
|
|
|
TOOLS_ROOT = ../../wxwidgets/build/wasm
|
|
KICAD_ROOT = ../../kicad
|
|
|
|
WXCONFIG = ../../build-wasm/wxwidgets/wx-config
|
|
WXLIB_PREFIX = libwx_wasmu
|
|
|
|
CXX = em++
|
|
WX_CXXFLAGS := $(shell $(WXCONFIG) --cxxflags)
|
|
|
|
# Libraries for non-GL apps (standalone tests don't need GL)
|
|
WX_LDFLAGS_NOGL := $(shell $(WXCONFIG) --libs base,core,aui)
|
|
|
|
# Libraries for HTML apps (htmlwin_test needs html)
|
|
WX_LDFLAGS_HTML := $(shell $(WXCONFIG) --libs base,core,html)
|
|
|
|
# Libraries for STC apps (stc_test needs stc)
|
|
WX_LDFLAGS_STC := $(shell $(WXCONFIG) --libs base,core,stc)
|
|
|
|
# Libraries for PropGrid apps (propgrid_test needs propgrid)
|
|
WX_LDFLAGS_PROPGRID := $(shell $(WXCONFIG) --libs base,core,propgrid)
|
|
|
|
# Libraries for AUI apps (auinotebook needs aui)
|
|
WX_LDFLAGS_AUI := $(shell $(WXCONFIG) --libs base,core,aui)
|
|
|
|
# Libraries for ADV apps (wizard, calendar need adv)
|
|
WX_LDFLAGS_ADV := $(shell $(WXCONFIG) --libs base,core,adv)
|
|
|
|
# Libraries for XML apps (xml_test needs xml)
|
|
WX_LDFLAGS_XML := $(shell $(WXCONFIG) --libs base,core,xml)
|
|
|
|
# Debug or Release build
|
|
ifdef DEBUG
|
|
# Debug: DWARF info, source maps, minimal optimization
|
|
CXXFLAGS = -g -O0 $(WX_CXXFLAGS)
|
|
DEBUG_LDFLAGS = -g -gsource-map
|
|
else
|
|
# Release: optimized
|
|
CXXFLAGS = -O2 $(WX_CXXFLAGS)
|
|
DEBUG_LDFLAGS =
|
|
endif
|
|
|
|
# Track header dependencies: without this, objects compiled against old wx headers
|
|
# get silently relinked into a newer library, and any vtable layout change then
|
|
# crashes apps at startup with "RuntimeError: function signature mismatch".
|
|
CXXFLAGS += -MMD -MP
|
|
|
|
# Native wasm-EH is the only build mode: compile + link with -fwasm-exceptions (legacy encoding) +
|
|
# wasm setjmp/longjmp, matching the libwx build (scripts/build-wx-wasm.sh) and scripts/common/env.sh.
|
|
# JSPI is the only suspension backend since the migration (-sDYNCALLS and the
|
|
# whole Asyncify/binaryen post-link pipeline are retired).
|
|
EH_FLAGS = -fwasm-exceptions -sSUPPORT_LONGJMP=wasm -sWASM_LEGACY_EXCEPTIONS=1
|
|
# Promising entry exports: every JS->wasm entry that can transitively suspend
|
|
# (census of EMSCRIPTEN_KEEPALIVE in wxwidgets/src/wasm; the non-suspending
|
|
# wx_dispatch_abandon probe stays plain). pcbjam_libctx_entry is libcontext's
|
|
# coroutine entry (only present in apps that link libcontext — emscripten
|
|
# warns-and-ignores absent names).
|
|
WX_JSPI_EXPORTS = main,wx_dom_event,wx_dom_mouse,wx_window_close,wx_window_move,wx_window_resize,ProcessEvents,wxWasmMailboxTick,wxWasmTopLevelTick,wxWasmJobTick,pcbjam_libctx_entry
|
|
# Per-app suspending test levers (fresh-stack ccalls that park or swap a
|
|
# coroutine). Appended as a LAST -sJSPI_EXPORTS on the app's link line, which
|
|
# wins over the one inside JSPI_LDFLAGS (emcc last-wins). The non-parking
|
|
# levers (races_end_active_modal — the answer-synchronously resolve path)
|
|
# deliberately stay plain.
|
|
RACES_EXTRA_LDFLAGS = -sJSPI_EXPORTS=$(WX_JSPI_EXPORTS),races_swap_once,races_park_token2,races_wdt_park_b
|
|
JSPI_SHIM = $(abspath ../../scripts/common/shims/jspi-scheduler.js)
|
|
# $stringToNewUTF8: the JSPI rejection path decodes a thrown C++ exception
|
|
# through it; without forced inclusion the reference resolves to emscripten's
|
|
# throwing stub and the FIRST throwing wx handler aborts the whole runtime
|
|
# ("native code called abort()" -> pthread mutex deadlock storm).
|
|
JSPI_LDFLAGS = -sJSPI \
|
|
-sJSPI_EXPORTS=$(WX_JSPI_EXPORTS) \
|
|
-s "EXPORTED_RUNTIME_METHODS=['HEAPU8','HEAP8','HEAP32','ccall','stackSave','stackRestore']" \
|
|
-sDEFAULT_LIBRARY_FUNCS_TO_INCLUDE='$$stringToNewUTF8' \
|
|
--pre-js $(JSPI_SHIM)
|
|
JSPI_CORO_LDFLAGS = $(JSPI_LDFLAGS)
|
|
CXXFLAGS += $(EH_FLAGS)
|
|
|
|
# Base Emscripten flags (for all apps)
|
|
# JSPI enables blocking modal dialogs (ShowModal suspends its promising activation)
|
|
# - js_writeTextToClipboard, js_readTextFromClipboard, js_clipboardHasText, js_clearClipboard: for clipboard
|
|
# - js_enumerateFonts: for font enumeration via Local Font Access API
|
|
BASE_LDFLAGS = $(EH_FLAGS) -sALLOW_MEMORY_GROWTH -sERROR_ON_UNDEFINED_SYMBOLS=0 \
|
|
$(JSPI_LDFLAGS)
|
|
|
|
# LDFLAGS for non-GL apps (standalone tests)
|
|
LDFLAGS_NOGL = $(DEBUG_LDFLAGS) $(BASE_LDFLAGS) $(WX_LDFLAGS_NOGL)
|
|
|
|
# LDFLAGS for HTML apps (htmlwin_test)
|
|
LDFLAGS_HTML = $(DEBUG_LDFLAGS) $(BASE_LDFLAGS) $(WX_LDFLAGS_HTML)
|
|
|
|
# LDFLAGS for STC apps (stc_test)
|
|
LDFLAGS_STC = $(DEBUG_LDFLAGS) $(BASE_LDFLAGS) $(WX_LDFLAGS_STC)
|
|
|
|
# LDFLAGS for PropGrid apps (propgrid_test)
|
|
LDFLAGS_PROPGRID = $(DEBUG_LDFLAGS) $(BASE_LDFLAGS) $(WX_LDFLAGS_PROPGRID)
|
|
|
|
# LDFLAGS for AUI apps (auinotebook)
|
|
LDFLAGS_AUI = $(DEBUG_LDFLAGS) $(BASE_LDFLAGS) $(WX_LDFLAGS_AUI)
|
|
|
|
# LDFLAGS for ADV apps (wizard, calendar)
|
|
LDFLAGS_ADV = $(DEBUG_LDFLAGS) $(BASE_LDFLAGS) $(WX_LDFLAGS_ADV)
|
|
|
|
# LDFLAGS for XML apps (xml_test)
|
|
LDFLAGS_XML = $(DEBUG_LDFLAGS) $(BASE_LDFLAGS) $(WX_LDFLAGS_XML)
|
|
|
|
# LDFLAGS for pthread test - uses dynamic PTHREAD_POOL_SIZE to match hardware_concurrency
|
|
# This fixes the KiCad deadlock: pre-warm enough workers for all threads
|
|
LDFLAGS_PTHREAD = $(DEBUG_LDFLAGS) $(BASE_LDFLAGS) -pthread \
|
|
-sPTHREAD_POOL_SIZE='navigator.hardwareConcurrency' \
|
|
-sPTHREAD_POOL_SIZE_STRICT=0 \
|
|
$(WX_LDFLAGS_NOGL)
|
|
|
|
# Coroutine harness flags - mirror KiCad's coroutine runtime needs
|
|
COROUTINE_BASE_LDFLAGS = $(EH_FLAGS) -sALLOW_MEMORY_GROWTH -sERROR_ON_UNDEFINED_SYMBOLS=0 \
|
|
$(JSPI_CORO_LDFLAGS)
|
|
LDFLAGS_COROUTINE = $(DEBUG_LDFLAGS) $(COROUTINE_BASE_LDFLAGS) $(WX_LDFLAGS_NOGL)
|
|
|
|
# The suspend-races harness must match PRODUCTION suspension semantics: the KiCad
|
|
# apps ship with assertions off and rely on the shim layer, while emscripten's
|
|
# debug assert ("We cannot start an async operation when one is already flight")
|
|
# forbids the very multi-parked-sleep states the harness exists to exercise.
|
|
LDFLAGS_RACES = $(DEBUG_LDFLAGS) $(COROUTINE_BASE_LDFLAGS) -sASSERTIONS=0 $(WX_LDFLAGS_NOGL)
|
|
|
|
# LDFLAGS for the raytracer thread-deadlock repro. Same pthread + pool config as
|
|
# LDFLAGS_PTHREAD, but built on COROUTINE_BASE_LDFLAGS for the
|
|
# stack KiCad actually ships (emscripten_sleep suspends via JSPI).
|
|
LDFLAGS_RAYTRACE = $(DEBUG_LDFLAGS) $(COROUTINE_BASE_LDFLAGS) -pthread \
|
|
-sPTHREAD_POOL_SIZE='navigator.hardwareConcurrency' \
|
|
-sPTHREAD_POOL_SIZE_STRICT=0 \
|
|
$(WX_LDFLAGS_NOGL)
|
|
|
|
# LDFLAGS for the real-pool test (Phase 1a). Like LDFLAGS_RAYTRACE but pre-warm +2 workers so
|
|
# the lifecycle mode's small BS::pause_thread_pool(2) gets pre-warmed workers (no on-demand spawn).
|
|
LDFLAGS_REALPOOL = $(DEBUG_LDFLAGS) $(COROUTINE_BASE_LDFLAGS) -pthread \
|
|
-sPTHREAD_POOL_SIZE='navigator.hardwareConcurrency + 2' \
|
|
-sPTHREAD_POOL_SIZE_STRICT=0 \
|
|
$(WX_LDFLAGS_NOGL)
|
|
|
|
# A second pre-js carries the DOM-control shim ("--pre-js A --pre-js B"
|
|
# after expansion — emcc accepts repeated --pre-js).
|
|
# JS_FILES lists the actual pre-js paths (no flags) so the link targets can
|
|
# depend on them — otherwise editing a shim wouldn't trigger a relink.
|
|
JS = $(TOOLS_ROOT)/wx.js --pre-js $(TOOLS_ROOT)/wx-dom.js
|
|
JS_FILES = $(TOOLS_ROOT)/wx.js $(TOOLS_ROOT)/wx-dom.js
|
|
# The scheduler shim is a pre-js on every link (JSPI_LDFLAGS): apps whose
|
|
# objects are up to date must still relink when it changes.
|
|
JS_FILES += $(JSPI_SHIM)
|
|
HTML = $(TOOLS_ROOT)/template.html
|
|
|
|
# wxWidgets library directory - used as dependency to rebuild when libs change
|
|
WX_LIB_DIR = ../../build-wasm/wxwidgets/lib
|
|
# Key library that changes when wxWidgets is rebuilt
|
|
WX_CORE_LIB = $(WX_LIB_DIR)/$(WXLIB_PREFIX)_core-3.2-emscripten.a
|
|
|
|
# Standalone directories
|
|
S = standalone
|
|
|
|
# Pull in the dependency files generated by -MMD
|
|
-include $(wildcard *.d) $(wildcard $(S)/*/*.d)
|
|
|
|
all: minimal_test.html \
|
|
$(S)/menu/menu_test.html \
|
|
$(S)/contextmenu/contextmenu_test.html \
|
|
$(S)/scrollbar/scrollbar_test.html \
|
|
$(S)/notebook/notebook_test.html \
|
|
$(S)/clipboard/clipboard_test.html \
|
|
$(S)/filedialog/filedialog_test.html \
|
|
$(S)/layout/layout_test.html \
|
|
$(S)/aui/aui_test.html \
|
|
$(S)/toolbar/toolbar_test.html \
|
|
$(S)/grid/grid_test.html \
|
|
$(S)/dialog/dialog_test.html \
|
|
$(S)/timer/timer_test.html \
|
|
$(S)/tree/tree_test.html \
|
|
$(S)/radiogroups/radiogroups_test.html \
|
|
$(S)/dataview/dataview_test.html \
|
|
$(S)/htmlwin/htmlwin_test.html \
|
|
$(S)/stc/stc_test.html \
|
|
$(S)/print/print_test.html \
|
|
$(S)/dnd/dnd_test.html \
|
|
$(S)/propgrid/propgrid_test.html \
|
|
$(S)/pickers/pickers_test.html \
|
|
$(S)/collapsible/collapsible_test.html \
|
|
$(S)/collapse-relayout/collapse-relayout_test.html \
|
|
$(S)/listctrl/listctrl_test.html \
|
|
$(S)/infobar/infobar_test.html \
|
|
$(S)/dataviewvirtual/dataviewvirtual_test.html \
|
|
$(S)/auinotebook/auinotebook_test.html \
|
|
$(S)/wizard/wizard_test.html \
|
|
$(S)/gridedit/gridedit_test.html \
|
|
$(S)/calendar/calendar_test.html \
|
|
$(S)/gridrenderers/gridrenderers_test.html \
|
|
$(S)/printpreview/printpreview_test.html \
|
|
$(S)/bitmapbuttons/bitmapbuttons_test.html \
|
|
$(S)/specialized/specialized_test.html \
|
|
$(S)/validators/validators_test.html \
|
|
$(S)/ownerdrawn/ownerdrawn_test.html \
|
|
$(S)/popup/popup_test.html \
|
|
$(S)/xml/xml_test.html \
|
|
$(S)/wasmedge/wasmedge_test.html \
|
|
$(S)/fontenum/fontenum_test.html \
|
|
$(S)/textdecor/textdecor_test.html \
|
|
$(S)/bitmask/bitmask_test.html \
|
|
$(S)/regions/regions_test.html \
|
|
$(S)/maximize/maximize_test.html \
|
|
$(S)/earlysize/earlysize_test.html \
|
|
$(S)/selectheight/selectheight_test.html \
|
|
$(S)/uipolish/uipolish_test.html \
|
|
$(S)/threadpool/threadpool_test.html \
|
|
$(S)/logerror/logerror_test.html \
|
|
$(S)/retinascale/retinascale_test.html \
|
|
$(S)/coroutine/coroutine_test.html \
|
|
$(S)/coroutine-nested/nested_test.html \
|
|
$(S)/asyncify-races/races_test.html \
|
|
$(S)/coroutine-pthread/coroutine_test_wxpt.html \
|
|
$(S)/coroutine-pthread/embind_repro.html \
|
|
$(S)/coroutine-pthread/gl_repro.html \
|
|
$(S)/coroutine-pthread/gl_repro_pt.html \
|
|
$(S)/coroutine-pthread/main_repro.html \
|
|
$(S)/coroutine-pthread/mainloop_repro.html \
|
|
$(S)/coroutine-pthread/nested_repro_ex.html \
|
|
$(S)/coroutine-pthread/vcall_repro.html \
|
|
$(S)/textctrl-reentry/textctrl-reentry_test.html \
|
|
$(S)/stattext-ellipsize/stattext-ellipsize_test.html \
|
|
$(S)/tooltip-lifetime/tooltip-lifetime_test.html \
|
|
$(S)/tooltip-toolbar/tooltip-toolbar_test.html \
|
|
$(S)/warp-pointer/warp-pointer_test.html
|
|
|
|
# Main test app
|
|
minimal_test.o: minimal_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
minimal_test.html: minimal_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# --- DOM-port bug reproductions (docs/features/wx-dom-port/branch-review.md) ---
|
|
|
|
# wxTextCtrl reentry-guard repro: it throws from a wxEVT_TEXT handler to prove the
|
|
# OnDomEvent m_inDomInput reset must be exception-safe (works under native -fwasm-exceptions).
|
|
$(S)/textctrl-reentry/textctrl-reentry_test.o: $(S)/textctrl-reentry/textctrl-reentry_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/textctrl-reentry/textctrl-reentry_test.html: $(S)/textctrl-reentry/textctrl-reentry_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
textctrl-reentry: $(S)/textctrl-reentry/textctrl-reentry_test.html
|
|
|
|
# wxStaticText ellipsize-on-resize repro: re-ellipsize the label on wxEVT_SIZE.
|
|
$(S)/stattext-ellipsize/stattext-ellipsize_test.o: $(S)/stattext-ellipsize/stattext-ellipsize_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/stattext-ellipsize/stattext-ellipsize_test.html: $(S)/stattext-ellipsize/stattext-ellipsize_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
stattext-ellipsize: $(S)/stattext-ellipsize/stattext-ellipsize_test.html
|
|
|
|
# wxToolTip hover-window lifetime repro (relies on wxWasmTooltipDebugHoverWindow).
|
|
$(S)/tooltip-lifetime/tooltip-lifetime_test.o: $(S)/tooltip-lifetime/tooltip-lifetime_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/tooltip-lifetime/tooltip-lifetime_test.html: $(S)/tooltip-lifetime/tooltip-lifetime_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
tooltip-lifetime: $(S)/tooltip-lifetime/tooltip-lifetime_test.html
|
|
|
|
# wxAuiToolBar per-tool tooltip repro (dom-port-bugs.spec.ts).
|
|
$(S)/tooltip-toolbar/tooltip-toolbar_test.o: $(S)/tooltip-toolbar/tooltip-toolbar_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/tooltip-toolbar/tooltip-toolbar_test.html: $(S)/tooltip-toolbar/tooltip-toolbar_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
tooltip-toolbar: $(S)/tooltip-toolbar/tooltip-toolbar_test.html
|
|
|
|
# wxWindow::WarpPointer must update the cached mouse position (wxGetMousePosition).
|
|
$(S)/warp-pointer/warp-pointer_test.o: $(S)/warp-pointer/warp-pointer_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/warp-pointer/warp-pointer_test.html: $(S)/warp-pointer/warp-pointer_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
warp-pointer: $(S)/warp-pointer/warp-pointer_test.html
|
|
|
|
# Menu test (no GL)
|
|
$(S)/menu/menu_test.o: $(S)/menu/menu_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/menu/menu_test.html: $(S)/menu/menu_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Context menu test (no GL)
|
|
$(S)/contextmenu/contextmenu_test.o: $(S)/contextmenu/contextmenu_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/contextmenu/contextmenu_test.html: $(S)/contextmenu/contextmenu_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Scrollbar test (no GL)
|
|
$(S)/scrollbar/scrollbar_test.o: $(S)/scrollbar/scrollbar_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/scrollbar/scrollbar_test.html: $(S)/scrollbar/scrollbar_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
$(S)/notebook/notebook_test.o: $(S)/notebook/notebook_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/notebook/notebook_test.html: $(S)/notebook/notebook_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Clipboard test (no GL)
|
|
$(S)/clipboard/clipboard_test.o: $(S)/clipboard/clipboard_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/clipboard/clipboard_test.html: $(S)/clipboard/clipboard_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# FileDialog test (no GL)
|
|
$(S)/filedialog/filedialog_test.o: $(S)/filedialog/filedialog_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/filedialog/filedialog_test.html: $(S)/filedialog/filedialog_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Layout test (no GL)
|
|
$(S)/layout/layout_test.o: $(S)/layout/layout_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/layout/layout_test.html: $(S)/layout/layout_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# AUI test (no GL)
|
|
$(S)/aui/aui_test.o: $(S)/aui/aui_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/aui/aui_test.html: $(S)/aui/aui_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Toolbar test (no GL)
|
|
$(S)/toolbar/toolbar_test.o: $(S)/toolbar/toolbar_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/toolbar/toolbar_test.html: $(S)/toolbar/toolbar_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Grid test (no GL)
|
|
$(S)/grid/grid_test.o: $(S)/grid/grid_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/grid/grid_test.html: $(S)/grid/grid_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Dialog test (no GL)
|
|
$(S)/dialog/dialog_test.o: $(S)/dialog/dialog_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/dialog/dialog_test.html: $(S)/dialog/dialog_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Timer test (no GL)
|
|
$(S)/timer/timer_test.o: $(S)/timer/timer_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/timer/timer_test.html: $(S)/timer/timer_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Tree test (no GL)
|
|
$(S)/tree/tree_test.o: $(S)/tree/tree_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/tree/tree_test.html: $(S)/tree/tree_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Radio button groups test (no GL) - multiple wxRB_GROUP groups in one window
|
|
$(S)/radiogroups/radiogroups_test.o: $(S)/radiogroups/radiogroups_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/radiogroups/radiogroups_test.html: $(S)/radiogroups/radiogroups_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# DataView test (no GL)
|
|
$(S)/dataview/dataview_test.o: $(S)/dataview/dataview_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/dataview/dataview_test.html: $(S)/dataview/dataview_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# HtmlWindow test (needs HTML library)
|
|
$(S)/htmlwin/htmlwin_test.o: $(S)/htmlwin/htmlwin_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/htmlwin/htmlwin_test.html: $(S)/htmlwin/htmlwin_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_HTML) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# StyledTextCtrl test (needs STC library)
|
|
$(S)/stc/stc_test.o: $(S)/stc/stc_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/stc/stc_test.html: $(S)/stc/stc_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_STC) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Print test (no GL)
|
|
$(S)/print/print_test.o: $(S)/print/print_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/print/print_test.html: $(S)/print/print_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# DragDrop test (no GL)
|
|
$(S)/dnd/dnd_test.o: $(S)/dnd/dnd_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/dnd/dnd_test.html: $(S)/dnd/dnd_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# PropertyGrid test (needs propgrid library)
|
|
$(S)/propgrid/propgrid_test.o: $(S)/propgrid/propgrid_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/propgrid/propgrid_test.html: $(S)/propgrid/propgrid_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_PROPGRID) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Pickers test (colour/font pickers, no GL)
|
|
$(S)/pickers/pickers_test.o: $(S)/pickers/pickers_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/pickers/pickers_test.html: $(S)/pickers/pickers_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Collapsible pane test (no GL)
|
|
$(S)/collapsible/collapsible_test.o: $(S)/collapsible/collapsible_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/collapsible/collapsible_test.html: $(S)/collapsible/collapsible_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# collapse-relayout: notebook page + proportion-1 scrolled list + collapsible pane (no GL)
|
|
$(S)/collapse-relayout/collapse-relayout_test.o: $(S)/collapse-relayout/collapse-relayout_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/collapse-relayout/collapse-relayout_test.html: $(S)/collapse-relayout/collapse-relayout_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# ListCtrl virtual mode test (no GL)
|
|
$(S)/listctrl/listctrl_test.o: $(S)/listctrl/listctrl_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/listctrl/listctrl_test.html: $(S)/listctrl/listctrl_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# InfoBar test (no GL)
|
|
$(S)/infobar/infobar_test.o: $(S)/infobar/infobar_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/infobar/infobar_test.html: $(S)/infobar/infobar_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# DataViewCtrl Virtual Mode test (no GL, uses base dataview)
|
|
$(S)/dataviewvirtual/dataviewvirtual_test.o: $(S)/dataviewvirtual/dataviewvirtual_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/dataviewvirtual/dataviewvirtual_test.html: $(S)/dataviewvirtual/dataviewvirtual_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# AuiNotebook test (needs aui)
|
|
$(S)/auinotebook/auinotebook_test.o: $(S)/auinotebook/auinotebook_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/auinotebook/auinotebook_test.html: $(S)/auinotebook/auinotebook_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_AUI) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Wizard test (needs adv)
|
|
$(S)/wizard/wizard_test.o: $(S)/wizard/wizard_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/wizard/wizard_test.html: $(S)/wizard/wizard_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_ADV) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Grid Edit test (cell editing, no GL)
|
|
$(S)/gridedit/gridedit_test.o: $(S)/gridedit/gridedit_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/gridedit/gridedit_test.html: $(S)/gridedit/gridedit_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Calendar test (needs adv)
|
|
$(S)/calendar/calendar_test.o: $(S)/calendar/calendar_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/calendar/calendar_test.html: $(S)/calendar/calendar_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_ADV) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Grid Renderers test (no GL)
|
|
$(S)/gridrenderers/gridrenderers_test.o: $(S)/gridrenderers/gridrenderers_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/gridrenderers/gridrenderers_test.html: $(S)/gridrenderers/gridrenderers_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Print Preview test (no GL)
|
|
$(S)/printpreview/printpreview_test.o: $(S)/printpreview/printpreview_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/printpreview/printpreview_test.html: $(S)/printpreview/printpreview_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Bitmap Buttons test (no GL)
|
|
$(S)/bitmapbuttons/bitmapbuttons_test.o: $(S)/bitmapbuttons/bitmapbuttons_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/bitmapbuttons/bitmapbuttons_test.html: $(S)/bitmapbuttons/bitmapbuttons_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Specialized Controls test (needs adv for treebook)
|
|
$(S)/specialized/specialized_test.o: $(S)/specialized/specialized_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/specialized/specialized_test.html: $(S)/specialized/specialized_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_ADV) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Validators test (no GL)
|
|
$(S)/validators/validators_test.o: $(S)/validators/validators_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/validators/validators_test.html: $(S)/validators/validators_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Owner-drawn ComboBox test (no GL)
|
|
$(S)/ownerdrawn/ownerdrawn_test.o: $(S)/ownerdrawn/ownerdrawn_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/ownerdrawn/ownerdrawn_test.html: $(S)/ownerdrawn/ownerdrawn_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Popup Window test (no GL)
|
|
$(S)/popup/popup_test.o: $(S)/popup/popup_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/popup/popup_test.html: $(S)/popup/popup_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# XML Document test (needs xml library)
|
|
$(S)/xml/xml_test.o: $(S)/xml/xml_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/xml/xml_test.html: $(S)/xml/xml_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_XML) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# WASM Edge Cases test (no GL)
|
|
$(S)/wasmedge/wasmedge_test.o: $(S)/wasmedge/wasmedge_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/wasmedge/wasmedge_test.html: $(S)/wasmedge/wasmedge_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Font Enumeration test (no GL)
|
|
$(S)/fontenum/fontenum_test.o: $(S)/fontenum/fontenum_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/fontenum/fontenum_test.html: $(S)/fontenum/fontenum_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Text Decorations test (no GL)
|
|
$(S)/textdecor/textdecor_test.o: $(S)/textdecor/textdecor_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/textdecor/textdecor_test.html: $(S)/textdecor/textdecor_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Bitmask test (no GL)
|
|
$(S)/bitmask/bitmask_test.o: $(S)/bitmask/bitmask_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/bitmask/bitmask_test.html: $(S)/bitmask/bitmask_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Regions test (no GL)
|
|
$(S)/regions/regions_test.o: $(S)/regions/regions_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/regions/regions_test.html: $(S)/regions/regions_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Maximize test (no GL) - reproduces KiCad startup maximize issue
|
|
$(S)/maximize/maximize_test.o: $(S)/maximize/maximize_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/maximize/maximize_test.html: $(S)/maximize/maximize_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Early size test (no GL) - tests GetClientSize() before Show()
|
|
$(S)/earlysize/earlysize_test.o: $(S)/earlysize/earlysize_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/earlysize/earlysize_test.html: $(S)/earlysize/earlysize_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
$(S)/selectheight/selectheight_test.o: $(S)/selectheight/selectheight_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/selectheight/selectheight_test.html: $(S)/selectheight/selectheight_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Thread Pool test (pthread) - reproduces KiCad deadlock when hardware_concurrency() > PTHREAD_POOL_SIZE
|
|
$(S)/threadpool/threadpool_test.o: $(S)/threadpool/threadpool_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $< -o $@
|
|
|
|
$(S)/threadpool/threadpool_test.html: $(S)/threadpool/threadpool_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_PTHREAD) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Raytracer thread-deadlock repro (pthread) - mirrors render_3d_raytrace_base.cpp's
|
|
# post-process passes (detached threads + main-thread busy-wait). Variants via URL ?m=.
|
|
$(S)/raytrace-threads/raytrace_threads_test.o: $(S)/raytrace-threads/raytrace_threads_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $< -o $@
|
|
|
|
$(S)/raytrace-threads/raytrace_threads_test.html: $(S)/raytrace-threads/raytrace_threads_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_RAYTRACE) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
raytrace-threads: $(S)/raytrace-threads/raytrace_threads_test.html
|
|
.PHONY: raytrace-threads
|
|
|
|
# Include the raytracer-threading repro in the default `all` build (prereqs accumulate).
|
|
all: $(S)/raytrace-threads/raytrace_threads_test.html
|
|
|
|
# wxString UTF-8 multithreading red/green tests (shared-iterator registry,
|
|
# position cache, iterator fix-up) — see the app header for the modes.
|
|
$(S)/wxstring-mt/wxstring_mt_test.o: $(S)/wxstring-mt/wxstring_mt_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $< -o $@
|
|
|
|
$(S)/wxstring-mt/wxstring_mt_test.html: $(S)/wxstring-mt/wxstring_mt_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_PTHREAD) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
wxstring-mt: $(S)/wxstring-mt/wxstring_mt_test.html
|
|
.PHONY: wxstring-mt
|
|
|
|
all: $(S)/wxstring-mt/wxstring_mt_test.html
|
|
|
|
# Un-shimmed copy of KiCad's BS::thread_pool: the single-thread #ifdef __EMSCRIPTEN__ shim in
|
|
# detach_task is disabled (-> #if 0) so the pool tests exercise REAL multithreading WITHOUT
|
|
# modifying the pristine KiCad header and WITHOUT a compile macro. Regenerated at parse time to
|
|
# stay in sync. (HASH is a literal '#', escaped so make does not treat it as a comment.)
|
|
HASH := \#
|
|
POOL_UNSHIMMED := $(S)/_pool_unshimmed
|
|
$(shell mkdir -p $(POOL_UNSHIMMED); sed 's/$(HASH)ifdef __EMSCRIPTEN__/$(HASH)if 0/' $(KICAD_ROOT)/thirdparty/thread-pool/bs_thread_pool.hpp > $(POOL_UNSHIMMED)/bs_thread_pool.hpp)
|
|
|
|
# Real KiCad thread-pool test (Phase 1a / native-EH). Compiles the REAL
|
|
# kicad/common/thread_pool.cpp (GetKiCadThreadPool) with minimal pgm_base/advanced_config
|
|
# stubs; the pool is un-shimmed via a generated bs_thread_pool.hpp (POOL_UNSHIMMED below) so
|
|
# tasks run on workers.
|
|
TP_REAL = $(S)/threadpool-real
|
|
TP_REAL_INC = -std=c++20 \
|
|
-I$(TP_REAL)/stubs -I$(POOL_UNSHIMMED) -I$(KICAD_ROOT)/include -I$(KICAD_ROOT)/thirdparty/thread-pool
|
|
|
|
$(TP_REAL)/threadpool_real_test.o: $(TP_REAL)/threadpool_real_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $(TP_REAL_INC) $< -o $@
|
|
|
|
$(TP_REAL)/thread_pool.o: $(KICAD_ROOT)/common/thread_pool.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $(TP_REAL_INC) $< -o $@
|
|
|
|
$(TP_REAL)/kicad_pool_stubs.o: $(TP_REAL)/stubs/kicad_pool_stubs.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $(TP_REAL_INC) $< -o $@
|
|
|
|
$(TP_REAL)/threadpool_real_test.html: $(TP_REAL)/threadpool_real_test.o $(TP_REAL)/thread_pool.o $(TP_REAL)/kicad_pool_stubs.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_REALPOOL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
threadpool-real: $(TP_REAL)/threadpool_real_test.html
|
|
.PHONY: threadpool-real
|
|
|
|
all: $(TP_REAL)/threadpool_real_test.html
|
|
|
|
# On-demand non-warm Worker test (Phase 2). The real pool (compiled-in thread_pool.cpp)
|
|
# consumes the pre-warmed Workers, then raw fly-threads force on-demand creation;
|
|
# wasm/shims/nanosleep_yield.c (a strong nanosleep override; -Wl,--wrap crashes wasm-ld)
|
|
# makes the main-thread sleep_for join yield (a JSPI suspension) so the on-demand Workers boot.
|
|
# Reuses threadpool-real's pool stubs.
|
|
OD = $(S)/pthread-ondemand
|
|
OD_INC = -std=c++20 \
|
|
-I$(S)/threadpool-real/stubs -I$(POOL_UNSHIMMED) -I$(KICAD_ROOT)/include -I$(KICAD_ROOT)/thirdparty/thread-pool
|
|
SHIMS = ../../wasm/shims
|
|
|
|
$(OD)/pthread_ondemand_test.o: $(OD)/pthread_ondemand_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $(OD_INC) $< -o $@
|
|
|
|
$(OD)/thread_pool.o: $(KICAD_ROOT)/common/thread_pool.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $(OD_INC) $< -o $@
|
|
|
|
$(OD)/kicad_pool_stubs.o: $(S)/threadpool-real/stubs/kicad_pool_stubs.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $(OD_INC) $< -o $@
|
|
|
|
# Compiled as C (no -std=c++): em++ keys language off the .c extension.
|
|
$(OD)/nanosleep_yield.o: $(SHIMS)/nanosleep_yield.c
|
|
$(CXX) -c -pthread $< -o $@
|
|
|
|
$(OD)/pthread_ondemand_test.html: $(OD)/pthread_ondemand_test.o $(OD)/thread_pool.o $(OD)/kicad_pool_stubs.o $(OD)/nanosleep_yield.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_RAYTRACE) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
pthread-ondemand: $(OD)/pthread_ondemand_test.html
|
|
.PHONY: pthread-ondemand
|
|
|
|
all: $(OD)/pthread_ondemand_test.html
|
|
|
|
# Library-preload native-EH repro (1b). Standalone std::async worker that parses+throws (mode-c)
|
|
# and proxies a fetch to main (emscripten_proxy_*) — mirrors the KiCad-10 PCBJAM preload shape.
|
|
# No KiCad source. Uses the system proxying queue (built into the pthread runtime).
|
|
$(S)/async-preload/async_preload_test.o: $(S)/async-preload/async_preload_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $< -o $@
|
|
|
|
$(S)/async-preload/async_preload_test.html: $(S)/async-preload/async_preload_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_RAYTRACE) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
async-preload: $(S)/async-preload/async_preload_test.html
|
|
.PHONY: async-preload
|
|
|
|
all: $(S)/async-preload/async_preload_test.html
|
|
|
|
# A raytracer worker-join run inside a wx modal pump. The pump dispatches the work via
|
|
# ProcessEvents (ccall async:true) between suspensions, so both joins complete:
|
|
# m=0 sleep_for busy-wait, m=1 emscripten_sleep yield.
|
|
$(S)/raytrace-modal/raytrace_modal_test.o: $(S)/raytrace-modal/raytrace_modal_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) -pthread $< -o $@
|
|
|
|
$(S)/raytrace-modal/raytrace_modal_test.html: $(S)/raytrace-modal/raytrace_modal_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_RAYTRACE) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
raytrace-modal: $(S)/raytrace-modal/raytrace_modal_test.html
|
|
.PHONY: raytrace-modal
|
|
|
|
all: $(S)/raytrace-modal/raytrace_modal_test.html
|
|
|
|
# Log Error test (no GL) - reproduces KiCad's kiface error dialog
|
|
$(S)/logerror/logerror_test.o: $(S)/logerror/logerror_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/logerror/logerror_test.html: $(S)/logerror/logerror_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Coroutine stress harness - mirrors KiCad coroutine semantics against real libcontext
|
|
$(S)/coroutine/coroutine_test.o: $(S)/coroutine/coroutine_test.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
$(CXX) -c $(CXXFLAGS) -I$(KICAD_ROOT)/thirdparty/libcontext $< -o $@
|
|
|
|
$(S)/coroutine/libcontext.o: $(KICAD_ROOT)/thirdparty/libcontext/libcontext.cpp $(KICAD_ROOT)/thirdparty/libcontext/libcontext.h
|
|
$(CXX) -c $(CXXFLAGS) -I$(KICAD_ROOT)/thirdparty/libcontext $< -o $@
|
|
|
|
$(S)/coroutine/coroutine_test.html: $(S)/coroutine/coroutine_test.o $(S)/coroutine/libcontext.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
# Nested coroutine+modal interaction harness - historically reproduced asyncify rewind
|
|
# corruption when coroutine swaps happened inside a wxDialog::ShowModal event loop
|
|
# (Issue #9153); now pins the same topologies on the JSPI runtime.
|
|
$(S)/coroutine-nested/nested_test.o: $(S)/coroutine-nested/nested_test.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
$(CXX) -c $(CXXFLAGS) -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/coroutine-nested/nested_test.html: $(S)/coroutine-nested/nested_test.o $(S)/coroutine/libcontext.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
|
|
# (The trampoline-heal / handleSleep ablation variants — races_test_noheal /
|
|
# races_test_nosleepfix — were retired at doc 20 D-1 together with the legacy
|
|
# runtime they pinned.)
|
|
$(S)/asyncify-races/races_test.o: $(S)/asyncify-races/races_test.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
$(CXX) -c $(CXXFLAGS) -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/asyncify-races/races_test.html: $(S)/asyncify-races/races_test.o $(S)/coroutine/libcontext.o $(WX_CORE_LIB)
|
|
$(CXX) $^ $(LDFLAGS_RACES) $(RACES_EXTRA_LDFLAGS) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
|
|
# Convenience targets
|
|
menu: $(S)/menu/menu_test.html
|
|
contextmenu: $(S)/contextmenu/contextmenu_test.html
|
|
scrollbar: $(S)/scrollbar/scrollbar_test.html
|
|
notebook: $(S)/notebook/notebook_test.html
|
|
clipboard: $(S)/clipboard/clipboard_test.html
|
|
filedialog: $(S)/filedialog/filedialog_test.html
|
|
layout: $(S)/layout/layout_test.html
|
|
aui: $(S)/aui/aui_test.html
|
|
toolbar: $(S)/toolbar/toolbar_test.html
|
|
grid: $(S)/grid/grid_test.html
|
|
dialog: $(S)/dialog/dialog_test.html
|
|
timer: $(S)/timer/timer_test.html
|
|
tree: $(S)/tree/tree_test.html
|
|
radiogroups: $(S)/radiogroups/radiogroups_test.html
|
|
dataview: $(S)/dataview/dataview_test.html
|
|
htmlwin: $(S)/htmlwin/htmlwin_test.html
|
|
stc: $(S)/stc/stc_test.html
|
|
print: $(S)/print/print_test.html
|
|
dnd: $(S)/dnd/dnd_test.html
|
|
propgrid: $(S)/propgrid/propgrid_test.html
|
|
pickers: $(S)/pickers/pickers_test.html
|
|
collapsible: $(S)/collapsible/collapsible_test.html
|
|
collapse-relayout: $(S)/collapse-relayout/collapse-relayout_test.html
|
|
listctrl: $(S)/listctrl/listctrl_test.html
|
|
infobar: $(S)/infobar/infobar_test.html
|
|
dataviewvirtual: $(S)/dataviewvirtual/dataviewvirtual_test.html
|
|
auinotebook: $(S)/auinotebook/auinotebook_test.html
|
|
wizard: $(S)/wizard/wizard_test.html
|
|
gridedit: $(S)/gridedit/gridedit_test.html
|
|
calendar: $(S)/calendar/calendar_test.html
|
|
gridrenderers: $(S)/gridrenderers/gridrenderers_test.html
|
|
printpreview: $(S)/printpreview/printpreview_test.html
|
|
bitmapbuttons: $(S)/bitmapbuttons/bitmapbuttons_test.html
|
|
specialized: $(S)/specialized/specialized_test.html
|
|
validators: $(S)/validators/validators_test.html
|
|
ownerdrawn: $(S)/ownerdrawn/ownerdrawn_test.html
|
|
popup: $(S)/popup/popup_test.html
|
|
xml: $(S)/xml/xml_test.html
|
|
wasmedge: $(S)/wasmedge/wasmedge_test.html
|
|
fontenum: $(S)/fontenum/fontenum_test.html
|
|
textdecor: $(S)/textdecor/textdecor_test.html
|
|
bitmask: $(S)/bitmask/bitmask_test.html
|
|
regions: $(S)/regions/regions_test.html
|
|
maximize: $(S)/maximize/maximize_test.html
|
|
earlysize: $(S)/earlysize/earlysize_test.html
|
|
selectheight: $(S)/selectheight/selectheight_test.html
|
|
threadpool: $(S)/threadpool/threadpool_test.html
|
|
logerror: $(S)/logerror/logerror_test.html
|
|
|
|
# UI polish regression guards (wasm-ui-polish: DC clip box, blit origin,
|
|
# mask alpha, checkbox/statbmp best size)
|
|
$(S)/uipolish/uipolish_test.o: $(S)/uipolish/uipolish_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/uipolish/uipolish_test.html: $(S)/uipolish/uipolish_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
uipolish: $(S)/uipolish/uipolish_test.html
|
|
|
|
# Retina/HiDPI scaling test
|
|
$(S)/retinascale/retinascale_test.o: $(S)/retinascale/retinascale_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/retinascale/retinascale_test.html: $(S)/retinascale/retinascale_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_NOGL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
retinascale: $(S)/retinascale/retinascale_test.html
|
|
coroutine: $(S)/coroutine/coroutine_test.html
|
|
coroutine-nested: $(S)/coroutine-nested/nested_test.html
|
|
asyncify-races: $(S)/asyncify-races/races_test.html
|
|
|
|
# Only delete generated app files (*_test*, *_repro*) — a bare $(S)/*/*.js would
|
|
# also delete checked-in sources like coroutine-pthread/worker_dom_stub.js.
|
|
clean:
|
|
rm -f minimal_test.o minimal_test.d minimal_test.html minimal_test.js minimal_test.wasm minimal_test.wasm.map
|
|
rm -f $(S)/*/*.o $(S)/*/*.d $(S)/*/*.wasm.map
|
|
rm -f $(S)/*/*_test*.html $(S)/*/*_test*.js $(S)/*/*_test*.wasm
|
|
rm -f $(S)/*/*_repro*.html $(S)/*/*_repro*.js $(S)/*/*_repro*.wasm
|
|
|
|
.PHONY: all clean menu contextmenu scrollbar clipboard filedialog layout aui toolbar grid dialog timer tree dataview htmlwin stc print dnd propgrid pickers collapsible listctrl infobar dataviewvirtual auinotebook wizard gridedit calendar gridrenderers printpreview bitmapbuttons specialized validators ownerdrawn popup xml wasmedge fontenum textdecor bitmask regions maximize earlysize selectheight uipolish threadpool logerror retinascale coroutine coroutine-nested asyncify-races notebook radiogroups collapse-relayout
|
|
|
|
# === Coroutine pthread variant — historically reproduced the KiCad coroutine x pthreads crash ===
|
|
# Same modal-free harness as `coroutine`, but compiled/linked with pthreads to match
|
|
# KiCad's runtime (-pthread + PTHREAD_POOL_SIZE). The single-threaded `coroutine` build
|
|
# passes in system Chrome; KiCad (pthreads) crashes. This isolates that difference.
|
|
LDFLAGS_COROUTINE_PTHREAD = $(DEBUG_LDFLAGS) $(COROUTINE_BASE_LDFLAGS) -pthread \
|
|
-sPTHREAD_POOL_SIZE='navigator.hardwareConcurrency' -sPTHREAD_POOL_SIZE_STRICT=0 \
|
|
$(WX_LDFLAGS_NOGL)
|
|
|
|
$(S)/coroutine-pthread/coroutine_test_pt.o: $(S)/coroutine/coroutine_test.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/coroutine-pthread/libcontext_pt.o: $(KICAD_ROOT)/thirdparty/libcontext/libcontext.cpp $(KICAD_ROOT)/thirdparty/libcontext/libcontext.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext $< -o $@
|
|
|
|
$(S)/coroutine-pthread/coroutine_test.html: $(S)/coroutine-pthread/coroutine_test_pt.o $(S)/coroutine-pthread/libcontext_pt.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_PTHREAD) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
coroutine-pthread: $(S)/coroutine-pthread/coroutine_test.html
|
|
.PHONY: coroutine-pthread
|
|
|
|
# === No-wx pthread main() reproduction: coroutine pattern in main + pthreads, no wx ===
|
|
# JSPI since 2026-08-13: these pages compile the JSPI-only libcontext, so they must
|
|
# link the JSPI suspension engine (the old -sASYNCIFY/-sDYNCALLS link produced a
|
|
# frankenbuild matching no shipped configuration — instant stack overflow at the
|
|
# first yield).
|
|
LDFLAGS_COROUTINE_PTHREAD_NOWX = $(EH_FLAGS) $(DEBUG_LDFLAGS) -sALLOW_MEMORY_GROWTH -sERROR_ON_UNDEFINED_SYMBOLS=0 \
|
|
-sJSPI -sJSPI_EXPORTS=main,pcbjam_libctx_entry \
|
|
-pthread -sPTHREAD_POOL_SIZE='navigator.hardwareConcurrency' \
|
|
-sPTHREAD_POOL_SIZE_STRICT=0 -sEXPORTED_RUNTIME_METHODS=['ccall']
|
|
|
|
$(S)/coroutine-pthread/main_repro.o: $(S)/coroutine-pthread/main_repro.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/coroutine-pthread/main_repro.html: $(S)/coroutine-pthread/main_repro.o $(S)/coroutine-pthread/libcontext_pt.o
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_PTHREAD_NOWX) -o $@
|
|
|
|
coroutine-pthread-main: $(S)/coroutine-pthread/main_repro.html
|
|
.PHONY: coroutine-pthread-main
|
|
|
|
# Nested JS<->wasm dynCall-boundary reproduction (no wx + pthreads)
|
|
$(S)/coroutine-pthread/nested_repro.o: $(S)/coroutine-pthread/nested_repro.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/coroutine-pthread/nested_repro.html: $(S)/coroutine-pthread/nested_repro.o $(S)/coroutine-pthread/libcontext_pt.o
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_PTHREAD_NOWX) -o $@
|
|
|
|
coroutine-pthread-nested: $(S)/coroutine-pthread/nested_repro.html
|
|
.PHONY: coroutine-pthread-nested
|
|
|
|
# Nested invoke_/dynCall reproduction WITH exceptions (invoke_* boundaries).
|
|
# JSPI since 2026-08-13 — see the NOWX comment above.
|
|
LDFLAGS_COROUTINE_INVOKE = $(EH_FLAGS) $(DEBUG_LDFLAGS) -sALLOW_MEMORY_GROWTH -sERROR_ON_UNDEFINED_SYMBOLS=0 \
|
|
-sJSPI -sJSPI_EXPORTS=main,pcbjam_libctx_entry \
|
|
-pthread -sPTHREAD_POOL_SIZE='navigator.hardwareConcurrency' \
|
|
-sPTHREAD_POOL_SIZE_STRICT=0 -sEXPORTED_RUNTIME_METHODS=['ccall']
|
|
|
|
$(S)/coroutine-pthread/nested_repro_ex.o: $(S)/coroutine-pthread/nested_repro.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/coroutine-pthread/libcontext_ex.o: $(KICAD_ROOT)/thirdparty/libcontext/libcontext.cpp $(KICAD_ROOT)/thirdparty/libcontext/libcontext.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext $< -o $@
|
|
|
|
$(S)/coroutine-pthread/nested_repro_ex.html: $(S)/coroutine-pthread/nested_repro_ex.o $(S)/coroutine-pthread/libcontext_ex.o
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_INVOKE) -o $@
|
|
|
|
coroutine-pthread-nested-ex: $(S)/coroutine-pthread/nested_repro_ex.html
|
|
.PHONY: coroutine-pthread-nested-ex
|
|
|
|
# wx event loop + pthreads (KiCad's 13-scenario harness) with a worker DOM stub so the
|
|
# pthread workers don't crash on wx's module-eval document access.
|
|
$(S)/coroutine-pthread/coroutine_test_wxpt.html: $(S)/coroutine-pthread/coroutine_test_pt.o $(S)/coroutine-pthread/libcontext_pt.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_PTHREAD) --pre-js $(S)/coroutine-pthread/worker_dom_stub.js --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
coroutine-pthread-wx: $(S)/coroutine-pthread/coroutine_test_wxpt.html
|
|
.PHONY: coroutine-pthread-wx
|
|
|
|
# embind reproduction: coroutine activated via an embind (--bind) call
|
|
LDFLAGS_COROUTINE_EMBIND = $(LDFLAGS_COROUTINE_INVOKE) --bind
|
|
|
|
$(S)/coroutine-pthread/embind_repro.o: $(S)/coroutine-pthread/embind_repro.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/coroutine-pthread/embind_repro.html: $(S)/coroutine-pthread/embind_repro.o $(S)/coroutine-pthread/libcontext_ex.o
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_EMBIND) -o $@
|
|
|
|
coroutine-pthread-embind: $(S)/coroutine-pthread/embind_repro.html
|
|
.PHONY: coroutine-pthread-embind
|
|
|
|
# Main-loop (rAF) activation reproduction: coroutine activated inside emscripten_set_main_loop
|
|
$(S)/coroutine-pthread/mainloop_repro.o: $(S)/coroutine-pthread/mainloop_repro.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
# repro_tick is the promising rAF tick export (see mainloop_repro.cpp); a LAST
|
|
# -sJSPI_EXPORTS overrides the base list.
|
|
$(S)/coroutine-pthread/mainloop_repro.html: $(S)/coroutine-pthread/mainloop_repro.o $(S)/coroutine-pthread/libcontext_pt.o
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_PTHREAD_NOWX) -sJSPI_EXPORTS=main,pcbjam_libctx_entry,repro_tick -o $@
|
|
|
|
coroutine-pthread-mainloop: $(S)/coroutine-pthread/mainloop_repro.html
|
|
.PHONY: coroutine-pthread-mainloop
|
|
|
|
# WebGL2 + coroutine reproduction (no wx, no pthreads, default shell with #canvas)
|
|
LDFLAGS_COROUTINE_GL = $(EH_FLAGS) $(DEBUG_LDFLAGS) -sALLOW_MEMORY_GROWTH -sERROR_ON_UNDEFINED_SYMBOLS=0 \
|
|
-sJSPI -sJSPI_EXPORTS=main,pcbjam_libctx_entry \
|
|
-sMAX_WEBGL_VERSION=2 -sMIN_WEBGL_VERSION=2 -sEXPORTED_RUNTIME_METHODS=['ccall']
|
|
|
|
$(S)/coroutine-pthread/gl_repro.o: $(S)/coroutine-pthread/gl_repro.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/coroutine-pthread/gl_repro.html: $(S)/coroutine-pthread/gl_repro.o $(S)/coroutine/libcontext.o
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_GL) -sJSPI_EXPORTS=main,pcbjam_libctx_entry,repro_tick -o $@
|
|
|
|
coroutine-pthread-gl: $(S)/coroutine-pthread/gl_repro.html
|
|
.PHONY: coroutine-pthread-gl
|
|
|
|
# WebGL2 + coroutine + PTHREADS (the last untested combo: KiCad uses GL + pthreads together)
|
|
LDFLAGS_COROUTINE_GL_PTHREAD = $(LDFLAGS_COROUTINE_GL) -pthread \
|
|
-sPTHREAD_POOL_SIZE='navigator.hardwareConcurrency' -sPTHREAD_POOL_SIZE_STRICT=0
|
|
|
|
$(S)/coroutine-pthread/gl_repro_pt.o: $(S)/coroutine-pthread/gl_repro.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/coroutine-pthread/gl_repro_pt.html: $(S)/coroutine-pthread/gl_repro_pt.o $(S)/coroutine-pthread/libcontext_pt.o
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_GL_PTHREAD) -sJSPI_EXPORTS=main,pcbjam_libctx_entry,repro_tick -o $@
|
|
|
|
coroutine-pthread-gl-pt: $(S)/coroutine-pthread/gl_repro_pt.html
|
|
.PHONY: coroutine-pthread-gl-pt
|
|
|
|
$(S)/coroutine-pthread/vcall_repro.o: $(S)/coroutine-pthread/vcall_repro.cpp $(S)/coroutine/kicad_coroutine_harness.h
|
|
@mkdir -p $(S)/coroutine-pthread
|
|
$(CXX) -c $(CXXFLAGS) -pthread -I$(KICAD_ROOT)/thirdparty/libcontext -I$(S)/coroutine $< -o $@
|
|
|
|
$(S)/coroutine-pthread/vcall_repro.html: $(S)/coroutine-pthread/vcall_repro.o $(S)/coroutine-pthread/libcontext_pt.o
|
|
$(CXX) $(filter %.o %.a,$^) $(LDFLAGS_COROUTINE_PTHREAD_NOWX) -o $@
|
|
|
|
coroutine-pthread-vcall: $(S)/coroutine-pthread/vcall_repro.html
|
|
.PHONY: coroutine-pthread-vcall
|
|
|
|
# --- secondary-window wxGLCanvas compositing test (GL-enabled) -----------------
|
|
# First GL-linked standalone app. Reproduces the "two canvases over each other"
|
|
# bug: a wxGLCanvas in a secondary top-level frame must be z-lifted above that
|
|
# frame's own window chrome (wx.js createGLCanvas fix). GL link recipe mirrors
|
|
# tests/gal-regression/wasm/Makefile (wx 'gl' lib + -sMAX_WEBGL_VERSION=2).
|
|
WX_LDFLAGS_GL := $(shell $(WXCONFIG) --libs base,core,gl)
|
|
EM_GL_FLAGS := -sMAX_WEBGL_VERSION=2
|
|
LDFLAGS_GL = $(DEBUG_LDFLAGS) $(BASE_LDFLAGS) $(EM_GL_FLAGS) $(WX_LDFLAGS_GL)
|
|
|
|
$(S)/secondary-glcanvas/secondary-glcanvas_test.o: $(S)/secondary-glcanvas/secondary-glcanvas_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/secondary-glcanvas/secondary-glcanvas_test.html: $(S)/secondary-glcanvas/secondary-glcanvas_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_GL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
secondary-glcanvas: $(S)/secondary-glcanvas/secondary-glcanvas_test.html
|
|
|
|
# Include the new app in the default `all` build (prerequisites accumulate).
|
|
all: $(S)/secondary-glcanvas/secondary-glcanvas_test.html
|
|
|
|
# --- secondary-frame chrome probe (GL-enabled) --------------------------------
|
|
# Isolation harness for the "secondary top-level frame has no usable title bar"
|
|
# behaviour (KiCad 3D viewer / footprint editor). Reuses LDFLAGS_GL defined in the
|
|
# secondary-glcanvas block above. See tests/e2e/secondary-frame-chrome.spec.ts.
|
|
$(S)/secondary-frame-chrome/secondary-frame-chrome_test.o: $(S)/secondary-frame-chrome/secondary-frame-chrome_test.cpp
|
|
$(CXX) -c $(CXXFLAGS) $< -o $@
|
|
|
|
$(S)/secondary-frame-chrome/secondary-frame-chrome_test.html: $(S)/secondary-frame-chrome/secondary-frame-chrome_test.o $(WX_CORE_LIB) $(JS_FILES)
|
|
$(CXX) $< $(LDFLAGS_GL) --pre-js $(JS) --shell-file $(HTML) -o $@
|
|
|
|
secondary-frame-chrome: $(S)/secondary-frame-chrome/secondary-frame-chrome_test.html
|
|
.PHONY: secondary-frame-chrome
|
|
|
|
all: $(S)/secondary-frame-chrome/secondary-frame-chrome_test.html
|