diff options
author | Hood Chatham <roberthoodchatham@gmail.com> | 2024-11-21 04:10:46 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-11-21 04:10:46 (GMT) |
commit | 1629d2ca56014beb2d46c42cc199a43ac97e3b97 (patch) | |
tree | b5e702ce31d9a07697eaade6ca823e52d9f67a24 /Tools | |
parent | 32428cf9ea03bce6d64c7acd28e0b7d92774eb53 (diff) | |
download | cpython-1629d2ca56014beb2d46c42cc199a43ac97e3b97.zip cpython-1629d2ca56014beb2d46c42cc199a43ac97e3b97.tar.gz cpython-1629d2ca56014beb2d46c42cc199a43ac97e3b97.tar.bz2 |
gh-126898: Emscripten support: Use es6 modules (#126903)
Modify Emscripten support to use ES6 modules.
Diffstat (limited to 'Tools')
-rw-r--r-- | Tools/wasm/emscripten/__main__.py | 36 | ||||
-rw-r--r-- | Tools/wasm/emscripten/node_entry.mjs | 30 | ||||
-rw-r--r-- | Tools/wasm/emscripten/node_pre.js | 15 |
3 files changed, 55 insertions, 26 deletions
diff --git a/Tools/wasm/emscripten/__main__.py b/Tools/wasm/emscripten/__main__.py index 2015a37..9ce8dd6 100644 --- a/Tools/wasm/emscripten/__main__.py +++ b/Tools/wasm/emscripten/__main__.py @@ -4,20 +4,22 @@ import argparse import contextlib import functools import os - -try: - from os import process_cpu_count as cpu_count -except ImportError: - from os import cpu_count -from pathlib import Path import shutil import subprocess import sys import sysconfig import tempfile +from pathlib import Path +from textwrap import dedent + +try: + from os import process_cpu_count as cpu_count +except ImportError: + from os import cpu_count -WASM_DIR = Path(__file__).parent.parent -CHECKOUT = WASM_DIR.parent.parent + +EMSCRIPTEN_DIR = Path(__file__).parent +CHECKOUT = EMSCRIPTEN_DIR.parent.parent.parent CROSS_BUILD_DIR = CHECKOUT / "cross-build" BUILD_DIR = CROSS_BUILD_DIR / "build" @@ -72,7 +74,7 @@ def subdir(working_dir, *, clean_ok=False): print("⎯" * terminal_width) print("📁", working_dir) if clean_ok and getattr(context, "clean", False) and working_dir.exists(): - print(f"🚮 Deleting directory (--clean)...") + print("🚮 Deleting directory (--clean)...") shutil.rmtree(working_dir) working_dir.mkdir(parents=True, exist_ok=True) @@ -207,9 +209,21 @@ def configure_emscripten_python(context, working_dir): quiet=context.quiet, ) - python_js = working_dir / "python.js" + shutil.copy(EMSCRIPTEN_DIR / "node_entry.mjs", working_dir / "node_entry.mjs") + + node_entry = working_dir / "node_entry.mjs" exec_script = working_dir / "python.sh" - exec_script.write_text(f'#!/bin/sh\nexec {host_runner} {python_js} "$@"\n') + exec_script.write_text( + dedent( + f"""\ + #!/bin/sh + + # We compute our own path, not following symlinks and pass it in so that + # node_entry.mjs can set sys.executable correctly. + exec {host_runner} {node_entry} "$(realpath -s $0)" "$@" + """ + ) + ) exec_script.chmod(0o755) print(f"🏃♀️ Created {exec_script} ... ") sys.stdout.flush() diff --git a/Tools/wasm/emscripten/node_entry.mjs b/Tools/wasm/emscripten/node_entry.mjs new file mode 100644 index 0000000..cb1c6ff --- /dev/null +++ b/Tools/wasm/emscripten/node_entry.mjs @@ -0,0 +1,30 @@ +import EmscriptenModule from "./python.mjs"; +import { dirname } from 'node:path'; +import { fileURLToPath } from 'node:url'; + +if (process?.versions?.node) { + const nodeVersion = Number(process.versions.node.split(".", 1)[0]); + if (nodeVersion < 18) { + process.stderr.write( + `Node version must be >= 18, got version ${process.version}\n`, + ); + process.exit(1); + } +} + +const settings = { + preRun(Module) { + const __dirname = dirname(fileURLToPath(import.meta.url)); + Module.FS.mkdirTree("/lib/"); + Module.FS.mount(Module.FS.filesystems.NODEFS, { root: __dirname + "/lib/" }, "/lib/"); + }, + // The first three arguments are: "node", path to this file, path to + // python.sh. After that come the arguments the user passed to python.sh. + arguments: process.argv.slice(3), + // Ensure that sys.executable, sys._base_executable, etc point to python.sh + // not to this file. To properly handle symlinks, python.sh needs to compute + // its own path. + thisProgram: process.argv[2], +}; + +await EmscriptenModule(settings); diff --git a/Tools/wasm/emscripten/node_pre.js b/Tools/wasm/emscripten/node_pre.js deleted file mode 100644 index 54b09dc..0000000 --- a/Tools/wasm/emscripten/node_pre.js +++ /dev/null @@ -1,15 +0,0 @@ -// If process is undefined, we're not running in the node runtime let it go I -// guess? -if (typeof process !== "undefined") { - const nodeVersion = Number(process.versions.node.split(".", 1)[0]); - if (nodeVersion < 18) { - process.stderr.write( - `Node version must be >= 18, got version ${process.version}\n`, - ); - process.exit(1); - } - Module.preRun = () => { - FS.mkdirTree("/lib/"); - FS.mount(NODEFS, { root: __dirname + "/lib/" }, "/lib/"); - }; -} |