https://github.com/python/cpython/commit/91e1312b950e3a98a9e968da02500db127e06f43
commit: 91e1312b950e3a98a9e968da02500db127e06f43
branch: main
author: Hood Chatham <[email protected]>
committer: freakboy3742 <[email protected]>
date: 2026-03-19T09:38:22Z
summary:

gh-145177: Put node version into emscripten/config.toml. (#146156)

Configure node version as part of the emscripten build script, and install 
that node version if it isn't available.

files:
M Platforms/emscripten/__main__.py
M Platforms/emscripten/config.toml

diff --git a/Platforms/emscripten/__main__.py b/Platforms/emscripten/__main__.py
index 78825a52fed29b..a7c52c2d59f10d 100644
--- a/Platforms/emscripten/__main__.py
+++ b/Platforms/emscripten/__main__.py
@@ -413,10 +413,41 @@ def make_mpdec(context, working_dir):
     write_library_config(prefix, "mpdec", mpdec_config, context.quiet)
 
 
+def calculate_node_path():
+    node_version = os.environ.get("PYTHON_NODE_VERSION", None)
+    if node_version is None:
+        node_version = load_config_toml()["node-version"]
+
+    subprocess.run(
+        [
+            "bash",
+            "-c",
+            f"source ~/.nvm/nvm.sh && nvm install {node_version}",
+        ],
+        check=True,
+    )
+
+    res = subprocess.run(
+        [
+            "bash",
+            "-c",
+            f"source ~/.nvm/nvm.sh && nvm which {node_version}",
+        ],
+        text=True,
+        capture_output=True,
+        check=True,
+    )
+    return res.stdout.strip()
+
+
 @subdir("host_dir", clean_ok=True)
 def configure_emscripten_python(context, working_dir):
     """Configure the emscripten/host build."""
     validate_emsdk_version(context.emsdk_cache)
+    host_runner = context.host_runner
+    if host_runner is None:
+        host_runner = calculate_node_path()
+
     paths = context.build_paths
     config_site = os.fsdecode(EMSCRIPTEN_DIR / "config.site-wasm32-emscripten")
 
@@ -435,19 +466,6 @@ def configure_emscripten_python(context, working_dir):
     )
     if pydebug:
         sysconfig_data += "-pydebug"
-
-    host_runner = context.host_runner
-    if node_version := os.environ.get("PYTHON_NODE_VERSION", None):
-        res = subprocess.run(
-            [
-                "bash",
-                "-c",
-                f"source ~/.nvm/nvm.sh && nvm which {node_version}",
-            ],
-            text=True,
-            capture_output=True,
-        )
-        host_runner = res.stdout.strip()
     pkg_config_path_dir = (paths["prefix_dir"] / "lib/pkgconfig/").resolve()
     env_additions = {
         "CONFIG_SITE": config_site,
@@ -613,8 +631,6 @@ def add_cross_build_dir_option(subcommand):
 
 
 def main():
-    default_host_runner = "node"
-
     parser = argparse.ArgumentParser()
     subcommands = parser.add_subparsers(dest="subcommand")
 
@@ -744,10 +760,10 @@ def main():
         subcommand.add_argument(
             "--host-runner",
             action="store",
-            default=default_host_runner,
+            default=None,
             dest="host_runner",
-            help="Command template for running the emscripten host"
-            f"`{default_host_runner}`)",
+            help="Command template for running the emscripten host "
+            "(default: use nvm to install the node version specified in 
config.toml)",
         )
 
     context = parser.parse_args()
diff --git a/Platforms/emscripten/config.toml b/Platforms/emscripten/config.toml
index 98edaebe992685..4e76b5bf9f7d2b 100644
--- a/Platforms/emscripten/config.toml
+++ b/Platforms/emscripten/config.toml
@@ -2,6 +2,7 @@
 # This allows for blanket copying of the Emscripten build code between 
supported
 # Python versions.
 emscripten-version = "4.0.12"
+node-version = "24"
 
 [libffi]
 url = 
"https://github.com/libffi/libffi/releases/download/v{version}/libffi-{version}.tar.gz";

_______________________________________________
Python-checkins mailing list -- [email protected]
To unsubscribe send an email to [email protected]
https://mail.python.org/mailman3//lists/python-checkins.python.org
Member address: [email protected]

Reply via email to