summaryrefslogtreecommitdiffstats
path: root/Tools
diff options
context:
space:
mode:
authorHood Chatham <roberthoodchatham@gmail.com>2024-11-21 04:10:46 (GMT)
committerGitHub <noreply@github.com>2024-11-21 04:10:46 (GMT)
commit1629d2ca56014beb2d46c42cc199a43ac97e3b97 (patch)
treeb5e702ce31d9a07697eaade6ca823e52d9f67a24 /Tools
parent32428cf9ea03bce6d64c7acd28e0b7d92774eb53 (diff)
downloadcpython-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__.py36
-rw-r--r--Tools/wasm/emscripten/node_entry.mjs30
-rw-r--r--Tools/wasm/emscripten/node_pre.js15
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/");
- };
-}