Repository navigation
gh-156780: Emscripten: support building CPython with static linking - #156781
clementperon wants to merge 4 commits into
Conversation
|
@hoodmane 👀 maybe ? |
|
Maybe let's start with a PR that adds the I think rather than using #ifdef __EMSCRIPTEN__
__attribute__((constructor)) void _PyEmscripten_Constructor(void) {
_PyEmscripten_BeforeMain();
}
And of course as traditional we need much less prose since Claude is as rambly as usual. Please rewrite all the comments and the commit message by hand. I find that helps cut them down to a more reasonable length. Of course, it's likely that any of this will bit rot without test coverage. cc @freakboy3742 WDYT? |
e0433ec to
c89eb2f
Compare
|
@hoodmane as you suggest move to a dedicated object file + reword commit + add a test |
c89eb2f to
2e46f9a
Compare
+1 to this as an approach to landing the changes.
I agree that linking into the mainline is a preferable approach to a runtime flag. As for where to put it - I can definitely see the argument for using
+1 to this as well. Claude's predilection for extraneous verbositude is usually contrary to the underlying goals of effective communication :-) |
fa3261b to
ee90cfa
Compare
|
@hoodmane EM_JS_DEPS has been merged thanks to @freakboy3742. I will rework a bit this PR + clean commit message & comment. |
5417e3e to
7c1f523
Compare
7c1f523 to
18d7011
Compare
|
@hoodmane new version after discussion with AI
Tested with the CI configuration, a |
|
The changes to |
18d7011 to
1eaadc6
Compare
|
Rebase on top of #157238 |
f96de99 to
afd1a38
Compare
|
@hoodmane can I have again your feedback on this PR please 🙏 Thanks |
Running main() under WebAssembly.promising only makes sense when Python is the program. Move the wrapper into Programs/emscripten_beforemain.c, linked into the interpreter but not into libpython, and let the runtime shut down normally afterwards so atexit handlers run and buffered output is flushed. FS.createAsyncInputDevice() stays in libpython. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…() wrapper Suspending in fd_read or poll needs a promising entry point, which libpython no longer sets up itself. Check Module.Py_EmscriptenStackSwitching, set by the interpreter's wrapper, instead of WebAssembly.promising alone. An embedder with its own promising entry point sets the flag. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Link libpython.a into a program whose main() is not Python's, without -sMAIN_MODULE or the interpreter's link flags, and run a script that imports from the stdlib, calls through the trampoline and polls. Platforms/emscripten/web_embed_test/run_test.sh builds and runs it in CI. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
@freakboy3742 what do you think of this PR ? Do you want me to update something ? |
Keep the JavaScript setup in emscripten_syscalls.c and only the constructor in the interpreter object. Restore the existing live-runtime exit behavior and omit the constructor when syscall overrides are disabled. Add a smoke test that resumes main after an Emscripten callback and verifies its exit status.
afd1a38 to
09b9faf
Compare
|
@hoodmane thanks for your review, I hope i understand correctly what you wanted |
Fixes #156780.
Allow Emscripten
libpython.ato be embedded without-sMAIN_MODULEor wrapping the application'smain(). The wrapper no longer depends onresolveGlobalSymbol().Keep the JavaScript setup in
Python/emscripten_syscalls.cand invoke it from a constructor inPrograms/emscripten_beforemain.c, linked only into the interpreter and_testembed. Preserve the existing_emscripten_exit_with_live_runtime()andModule.onExitbehavior. Omit the constructor when Emscripten syscall overrides are disabled.fd_readandpollsuspend only whenModule.Py_EmscriptenStackSwitchingis set. The interpreter sets this flag when entering its promisingmain(); embedders can opt in when providing their own promising entry point.Add CI smoke tests for static embedding and for an Emscripten callback completing while
main()is suspended. The latter checks thatmain()resumes and its exit status is preserved.Validation with Emscripten 6.0.9 and Node 26.8.1:
test_capi.test_emscripten,test_builtin,test_json,test_sys, andtest_functoolspassed.test_selectwas skipped because socket support was unavailable.-sMAIN_MODULE; it fails against the previous wrapper and passes with this change.--disable-emscripten-syscallsomits the constructor and syscall objects from the configuration.configurewith CPython's regeneration script.