gh-95853: WASM: better version and asset handling in scripts (GH-96045)

- support EMSDK tot-upstream and git releases
- allow WASM assents for wasm64-emscripten and WASI. This makes single file distributions on WASI easier.
- decouple WASM assets from browser builds
This commit is contained in:
Christian Heimes 2022-08-19 08:36:12 +02:00 committed by GitHub
parent 757c383d24
commit 6087f491ea
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 42 additions and 6 deletions

View file

@ -108,6 +108,14 @@ OMIT_MODULE_FILES = {
"_zoneinfo": ["zoneinfo/"],
}
SYSCONFIG_NAMES = (
"_sysconfigdata__emscripten_wasm32-emscripten",
"_sysconfigdata__emscripten_wasm32-emscripten",
"_sysconfigdata__wasi_wasm32-wasi",
"_sysconfigdata__wasi_wasm64-wasi",
)
def get_builddir(args: argparse.Namespace) -> pathlib.Path:
"""Get builddir path from pybuilddir.txt
"""
@ -120,7 +128,11 @@ def get_sysconfigdata(args: argparse.Namespace) -> pathlib.Path:
"""Get path to sysconfigdata relative to build root
"""
data_name = sysconfig._get_sysconfigdata_name()
assert "emscripten_wasm32" in data_name
if not data_name.startswith(SYSCONFIG_NAMES):
raise ValueError(
f"Invalid sysconfig data name '{data_name}'.",
SYSCONFIG_NAMES
)
filename = data_name + ".py"
return args.builddir / filename

View file

@ -20,6 +20,7 @@ import enum
import dataclasses
import os
import pathlib
import re
import shlex
import shutil
import subprocess
@ -99,6 +100,24 @@ def get_emscripten_root(emconfig: pathlib.Path = EM_CONFIG) -> pathlib.PurePath:
EMSCRIPTEN_ROOT = get_emscripten_root()
def read_python_version(configure: pathlib.Path = CONFIGURE) -> str:
"""Read PACKAGE_VERSION from configure script
configure and configure.ac are the canonical source for major and
minor version number.
"""
version_re = re.compile("^PACKAGE_VERSION='(\d\.\d+)'")
with configure.open(encoding="utf-8") as f:
for line in f:
mo = version_re.match(line)
if mo:
return mo.group(1)
raise ValueError(f"PACKAGE_VERSION not found in {configure}")
PYTHON_VERSION = read_python_version()
class ConditionError(ValueError):
def __init__(self, info: str, text: str):
self.info = info
@ -174,6 +193,9 @@ def _check_emscripten():
raise MissingDependency(os.fspath(version_txt), INSTALL_EMSDK)
with open(version_txt) as f:
version = f.read().strip().strip('"')
if version.endswith("-git"):
# git / upstream / tot-upstream installation
version = version[:-4]
version_tuple = tuple(int(v) for v in version.split("."))
if version_tuple < EMSDK_MIN_VERSION:
raise MissingDependency(
@ -221,7 +243,7 @@ WASI = Platform(
# workaround for https://github.com/python/cpython/issues/95952
"HOSTRUNNER": (
"wasmtime run "
"--env PYTHONPATH=/{relbuilddir}/build/lib.wasi-wasm32-$(VERSION):/Lib "
"--env PYTHONPATH=/{relbuilddir}/build/lib.wasi-wasm32-{version}:/Lib "
"--mapdir /::{srcdir} --"
),
},
@ -362,6 +384,7 @@ class BuildProfile:
env[key] = value.format(
relbuilddir=self.builddir.relative_to(SRCDIR),
srcdir=SRCDIR,
version=PYTHON_VERSION,
)
else:
env[key] = value