mirror of
https://github.com/python/cpython.git
synced 2025-08-02 16:13:13 +00:00
[3.11] gh-96883: browser: include concurrent.futures (GH-96886) (GH-96888)
This commit is contained in:
parent
d39fce0f03
commit
876606fc65
2 changed files with 19 additions and 17 deletions
|
@ -0,0 +1,2 @@
|
||||||
|
``wasm32-emscripten`` builds for browsers now include
|
||||||
|
:mod:`concurrent.futures` for :mod:`asyncio` and :mod:`unittest.mock`.
|
|
@ -58,6 +58,8 @@ OMIT_FILES = (
|
||||||
# Pure Python implementations of C extensions
|
# Pure Python implementations of C extensions
|
||||||
"_pydecimal.py",
|
"_pydecimal.py",
|
||||||
"_pyio.py",
|
"_pyio.py",
|
||||||
|
# concurrent threading
|
||||||
|
"concurrent/futures/thread.py",
|
||||||
# Misc unused or large files
|
# Misc unused or large files
|
||||||
"pydoc_data/",
|
"pydoc_data/",
|
||||||
"msilib/",
|
"msilib/",
|
||||||
|
@ -99,13 +101,12 @@ OMIT_MODULE_FILES = {
|
||||||
"_dbm": ["dbm/ndbm.py"],
|
"_dbm": ["dbm/ndbm.py"],
|
||||||
"_gdbm": ["dbm/gnu.py"],
|
"_gdbm": ["dbm/gnu.py"],
|
||||||
"_json": ["json/"],
|
"_json": ["json/"],
|
||||||
"_multiprocessing": ["concurrent/", "multiprocessing/"],
|
"_multiprocessing": ["concurrent/futures/process.py", "multiprocessing/"],
|
||||||
"pyexpat": ["xml/", "xmlrpc/"],
|
"pyexpat": ["xml/", "xmlrpc/"],
|
||||||
"readline": ["rlcompleter.py"],
|
"readline": ["rlcompleter.py"],
|
||||||
"_sqlite3": ["sqlite3/"],
|
"_sqlite3": ["sqlite3/"],
|
||||||
"_ssl": ["ssl.py"],
|
"_ssl": ["ssl.py"],
|
||||||
"_tkinter": ["idlelib/", "tkinter/", "turtle.py", "turtledemo/"],
|
"_tkinter": ["idlelib/", "tkinter/", "turtle.py", "turtledemo/"],
|
||||||
|
|
||||||
"_zoneinfo": ["zoneinfo/"],
|
"_zoneinfo": ["zoneinfo/"],
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -125,21 +126,18 @@ SYSCONFIG_NAMES = (
|
||||||
|
|
||||||
|
|
||||||
def get_builddir(args: argparse.Namespace) -> pathlib.Path:
|
def get_builddir(args: argparse.Namespace) -> pathlib.Path:
|
||||||
"""Get builddir path from pybuilddir.txt
|
"""Get builddir path from pybuilddir.txt"""
|
||||||
"""
|
|
||||||
with open("pybuilddir.txt", encoding="utf-8") as f:
|
with open("pybuilddir.txt", encoding="utf-8") as f:
|
||||||
builddir = f.read()
|
builddir = f.read()
|
||||||
return pathlib.Path(builddir)
|
return pathlib.Path(builddir)
|
||||||
|
|
||||||
|
|
||||||
def get_sysconfigdata(args: argparse.Namespace) -> pathlib.Path:
|
def get_sysconfigdata(args: argparse.Namespace) -> pathlib.Path:
|
||||||
"""Get path to sysconfigdata relative to build root
|
"""Get path to sysconfigdata relative to build root"""
|
||||||
"""
|
|
||||||
data_name = sysconfig._get_sysconfigdata_name()
|
data_name = sysconfig._get_sysconfigdata_name()
|
||||||
if not data_name.startswith(SYSCONFIG_NAMES):
|
if not data_name.startswith(SYSCONFIG_NAMES):
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"Invalid sysconfig data name '{data_name}'.",
|
f"Invalid sysconfig data name '{data_name}'.", SYSCONFIG_NAMES
|
||||||
SYSCONFIG_NAMES
|
|
||||||
)
|
)
|
||||||
filename = data_name + ".py"
|
filename = data_name + ".py"
|
||||||
return args.builddir / filename
|
return args.builddir / filename
|
||||||
|
@ -150,20 +148,23 @@ def create_stdlib_zip(
|
||||||
*,
|
*,
|
||||||
optimize: int = 0,
|
optimize: int = 0,
|
||||||
) -> None:
|
) -> None:
|
||||||
def filterfunc(name: str) -> bool:
|
def filterfunc(filename: str) -> bool:
|
||||||
return not name.startswith(args.omit_subdirs_absolute)
|
pathname = pathlib.Path(filename).resolve()
|
||||||
|
return pathname not in args.omit_files_absolute
|
||||||
|
|
||||||
with zipfile.PyZipFile(
|
with zipfile.PyZipFile(
|
||||||
args.wasm_stdlib_zip, mode="w", compression=args.compression, optimize=optimize
|
args.wasm_stdlib_zip,
|
||||||
|
mode="w",
|
||||||
|
compression=args.compression,
|
||||||
|
optimize=optimize,
|
||||||
) as pzf:
|
) as pzf:
|
||||||
if args.compresslevel is not None:
|
if args.compresslevel is not None:
|
||||||
pzf.compresslevel = args.compresslevel
|
pzf.compresslevel = args.compresslevel
|
||||||
pzf.writepy(args.sysconfig_data)
|
pzf.writepy(args.sysconfig_data)
|
||||||
for entry in sorted(args.srcdir_lib.iterdir()):
|
for entry in sorted(args.srcdir_lib.iterdir()):
|
||||||
|
entry = entry.resolve()
|
||||||
if entry.name == "__pycache__":
|
if entry.name == "__pycache__":
|
||||||
continue
|
continue
|
||||||
if entry in args.omit_files_absolute:
|
|
||||||
continue
|
|
||||||
if entry.name.endswith(".py") or entry.is_dir():
|
if entry.name.endswith(".py") or entry.is_dir():
|
||||||
# writepy() writes .pyc files (bytecode).
|
# writepy() writes .pyc files (bytecode).
|
||||||
pzf.writepy(entry, filterfunc=filterfunc)
|
pzf.writepy(entry, filterfunc=filterfunc)
|
||||||
|
@ -247,10 +248,9 @@ def main():
|
||||||
if not extmods.get(modname):
|
if not extmods.get(modname):
|
||||||
omit_files.extend(modfiles)
|
omit_files.extend(modfiles)
|
||||||
|
|
||||||
args.omit_files_absolute = {args.srcdir_lib / name for name in omit_files}
|
args.omit_files_absolute = {
|
||||||
args.omit_subdirs_absolute = tuple(
|
(args.srcdir_lib / name).resolve() for name in omit_files
|
||||||
str(args.srcdir_lib / name) for name in OMIT_SUBDIRS
|
}
|
||||||
)
|
|
||||||
|
|
||||||
# Empty, unused directory for dynamic libs, but required for site initialization.
|
# Empty, unused directory for dynamic libs, but required for site initialization.
|
||||||
args.wasm_dynload.mkdir(parents=True, exist_ok=True)
|
args.wasm_dynload.mkdir(parents=True, exist_ok=True)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue