Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions .github/workflows/mypy.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,6 @@ on:
- "Tools/jit/**"
- "Tools/peg_generator/**"
- "Tools/requirements-dev.txt"
- "Tools/wasm/**"
workflow_dispatch:

permissions:
Expand Down Expand Up @@ -61,7 +60,6 @@ jobs:
"Tools/clinic",
"Tools/jit",
"Tools/peg_generator",
"Tools/wasm",
]
steps:
- uses: actions/checkout@v4
Expand Down
4 changes: 4 additions & 0 deletions .pre-commit-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,10 @@ repos:
name: Run Ruff (lint) on Tools/peg_generator/
args: [--exit-non-zero-on-fix, --config=Tools/peg_generator/.ruff.toml]
files: ^Tools/peg_generator/
- id: ruff-check
name: Run Ruff (lint) on Tools/wasm/
args: [--exit-non-zero-on-fix, --config=Tools/wasm/.ruff.toml]
files: ^Tools/wasm/
- id: ruff-format
name: Run Ruff (format) on Doc/
args: [--check]
Expand Down
3 changes: 0 additions & 3 deletions Tools/wasm/.ruff.toml
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,4 @@ select = [
]
ignore = [
"E501", # Line too long
"F541", # f-string without any placeholders
"PYI024", # Use `typing.NamedTuple` instead of `collections.namedtuple`
"PYI025", # Use `from collections.abc import Set as AbstractSet`
]
9 changes: 4 additions & 5 deletions Tools/wasm/emscripten/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,16 +3,16 @@
import argparse
import contextlib
import functools
import hashlib
import os
import shutil
import subprocess
import sys
import sysconfig
import hashlib
import tempfile
from urllib.request import urlopen
from pathlib import Path
from textwrap import dedent
from urllib.request import urlopen

try:
from os import process_cpu_count as cpu_count
Expand All @@ -33,9 +33,7 @@
PREFIX_DIR = CROSS_BUILD_DIR / HOST_TRIPLE / "prefix"

LOCAL_SETUP = CHECKOUT / "Modules" / "Setup.local"
LOCAL_SETUP_MARKER = "# Generated by Tools/wasm/emscripten.py\n".encode(
"utf-8"
)
LOCAL_SETUP_MARKER = b"# Generated by Tools/wasm/emscripten.py\n"


def updated_env(updates={}):
Expand Down Expand Up @@ -432,6 +430,7 @@ def main():
make_build,
configure_host,
make_host,
clean,
):
subcommand.add_argument(
"--quiet",
Expand Down
5 changes: 2 additions & 3 deletions Tools/wasm/emscripten/wasm_assets.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,6 @@
import sys
import sysconfig
import zipfile
from typing import Dict

# source directory
SRCDIR = pathlib.Path(__file__).parents[3].absolute()
Expand Down Expand Up @@ -134,7 +133,7 @@ def filterfunc(filename: str) -> bool:
pzf.writepy(entry, filterfunc=filterfunc)


def detect_extension_modules(args: argparse.Namespace) -> Dict[str, bool]:
def detect_extension_modules(args: argparse.Namespace) -> dict[str, bool]:
modules = {}

# disabled by Modules/Setup.local ?
Expand All @@ -149,7 +148,7 @@ def detect_extension_modules(args: argparse.Namespace) -> Dict[str, bool]:
# disabled by configure?
with open(args.sysconfig_data) as f:
data = f.read()
loc: Dict[str, Dict[str, str]] = {}
loc: dict[str, dict[str, str]] = {}
exec(data, globals(), loc)

for key, value in loc["build_time_vars"].items():
Expand Down
11 changes: 0 additions & 11 deletions Tools/wasm/mypy.ini

This file was deleted.

10 changes: 4 additions & 6 deletions Tools/wasm/wasi/__main__.py
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,6 @@
import sysconfig
import tempfile


CHECKOUT = pathlib.Path(__file__).parent.parent.parent.parent
assert (CHECKOUT / "configure").is_file(), (
"Please update the location of the file"
Expand All @@ -28,9 +27,9 @@

LOCAL_SETUP = CHECKOUT / "Modules" / "Setup.local"
LOCAL_SETUP_MARKER = (
"# Generated by Tools/wasm/wasi .\n"
"# Required to statically build extension modules."
).encode("utf-8")
b"# Generated by Tools/wasm/wasi .\n"
b"# Required to statically build extension modules."
)

WASI_SDK_VERSION = 24

Expand Down Expand Up @@ -154,8 +153,7 @@ def build_python_is_pydebug():
test = "import sys, test.support; sys.exit(test.support.Py_DEBUG)"
result = subprocess.run(
[build_python_path(), "-c", test],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
capture_output=True,
)
return bool(result.returncode)

Expand Down
86 changes: 39 additions & 47 deletions Tools/wasm/wasm_build.py
Original file line number Diff line number Diff line change
Expand Up @@ -23,8 +23,8 @@
"""

import argparse
import enum
import dataclasses
import enum
import logging
import os
import pathlib
Expand All @@ -39,18 +39,12 @@
import time
import warnings
import webbrowser
from collections.abc import Callable, Iterable

# for Python 3.8
from typing import (
cast,
Any,
Callable,
Dict,
Iterable,
List,
Optional,
Tuple,
Union,
cast,
)

logger = logging.getLogger("wasm_build")
Expand Down Expand Up @@ -122,7 +116,7 @@

def parse_emconfig(
emconfig: pathlib.Path = EM_CONFIG,
) -> Tuple[pathlib.Path, pathlib.Path]:
) -> tuple[pathlib.Path, pathlib.Path]:
"""Parse EM_CONFIG file and lookup EMSCRIPTEN_ROOT and NODE_JS.

The ".emscripten" config file is a Python snippet that uses "EM_CONFIG"
Expand All @@ -134,7 +128,7 @@ def parse_emconfig(
with open(emconfig, encoding="utf-8") as f:
code = f.read()
# EM_CONFIG file is a Python snippet
local: Dict[str, Any] = {}
local: dict[str, Any] = {}
exec(code, globals(), local)
emscripten_root = pathlib.Path(local["EMSCRIPTEN_ROOT"])
node_js = pathlib.Path(local["NODE_JS"])
Expand Down Expand Up @@ -192,16 +186,16 @@ class Platform:

name: str
pythonexe: str
config_site: Optional[pathlib.PurePath]
configure_wrapper: Optional[pathlib.Path]
make_wrapper: Optional[pathlib.PurePath]
environ: Dict[str, Any]
config_site: pathlib.PurePath | None
configure_wrapper: pathlib.Path | None
make_wrapper: pathlib.PurePath | None
environ: dict[str, Any]
check: Callable[[], None]
# Used for build_emports().
ports: Optional[pathlib.PurePath]
cc: Optional[pathlib.PurePath]
ports: pathlib.PurePath | None
cc: pathlib.PurePath | None

def getenv(self, profile: "BuildProfile") -> Dict[str, Any]:
def getenv(self, profile: "BuildProfile") -> dict[str, Any]:
return self.environ.copy()


Expand Down Expand Up @@ -264,7 +258,7 @@ def _check_emscripten() -> None:
# git / upstream / tot-upstream installation
version = version[:-4]
version_tuple = cast(
Tuple[int, int, int], tuple(int(v) for v in version.split("."))
tuple[int, int, int], tuple(int(v) for v in version.split("."))
)
if version_tuple < EMSDK_MIN_VERSION:
raise ConditionError(
Expand Down Expand Up @@ -388,7 +382,7 @@ def get_extra_paths(self) -> Iterable[pathlib.PurePath]:
return []

@property
def emport_args(self) -> List[str]:
def emport_args(self) -> list[str]:
"""Host-specific port args (Emscripten)."""
cls = type(self)
if self is cls.wasm64_emscripten:
Expand All @@ -399,7 +393,7 @@ def emport_args(self) -> List[str]:
return []

@property
def embuilder_args(self) -> List[str]:
def embuilder_args(self) -> list[str]:
"""Host-specific embuilder args (Emscripten)."""
cls = type(self)
if self is cls.wasm64_emscripten:
Expand All @@ -422,7 +416,7 @@ def is_browser(self) -> bool:
return self in {cls.browser, cls.browser_debug}

@property
def emport_args(self) -> List[str]:
def emport_args(self) -> list[str]:
"""Target-specific port args."""
cls = type(self)
if self in {cls.browser_debug, cls.node_debug}:
Expand All @@ -448,9 +442,9 @@ class BuildProfile:
name: str
support_level: SupportLevel
host: Host
target: Union[EmscriptenTarget, None] = None
dynamic_linking: Union[bool, None] = None
pthreads: Union[bool, None] = None
target: EmscriptenTarget | None = None
dynamic_linking: bool | None = None
pthreads: bool | None = None
default_testopts: str = "-j2"

@property
Expand All @@ -474,7 +468,7 @@ def makefile(self) -> pathlib.Path:
return self.builddir / "Makefile"

@property
def configure_cmd(self) -> List[str]:
def configure_cmd(self) -> list[str]:
"""Generate configure command"""
# use relative path, so WASI tests can find lib prefix.
# pathlib.Path.relative_to() does not work here.
Expand Down Expand Up @@ -509,15 +503,15 @@ def configure_cmd(self) -> List[str]:
return cmd

@property
def make_cmd(self) -> List[str]:
def make_cmd(self) -> list[str]:
"""Generate make command"""
cmd = ["make"]
platform = self.host.platform
if platform.make_wrapper:
cmd.insert(0, os.fspath(platform.make_wrapper))
return cmd

def getenv(self) -> Dict[str, Any]:
def getenv(self) -> dict[str, Any]:
"""Generate environ dict for platform"""
env = os.environ.copy()
if hasattr(os, "process_cpu_count"):
Expand All @@ -531,7 +525,7 @@ def getenv(self) -> Dict[str, Any]:
env.pop(key, None)
elif key == "PATH":
# list of path items, prefix with extra paths
new_path: List[pathlib.PurePath] = []
new_path: list[pathlib.PurePath] = []
new_path.extend(self.host.get_extra_paths())
new_path.extend(value)
env[key] = os.pathsep.join(os.fspath(p) for p in new_path)
Expand All @@ -549,7 +543,7 @@ def _run_cmd(
self,
cmd: Iterable[str],
args: Iterable[str] = (),
cwd: Optional[pathlib.Path] = None,
cwd: pathlib.Path | None = None,
) -> int:
cmd = list(cmd)
cmd.extend(args)
Expand Down Expand Up @@ -587,7 +581,7 @@ def run_pythoninfo(self, *args: str) -> int:
self._check_execute()
return self.run_make("pythoninfo", *args)

def run_test(self, target: str, testopts: Optional[str] = None) -> int:
def run_test(self, target: str, testopts: str | None = None) -> int:
"""Run buildbottests"""
self._check_execute()
if testopts is None:
Expand Down Expand Up @@ -823,29 +817,27 @@ def build_emports(self, force: bool = False) -> None:
)

# Don't list broken and experimental variants in help
platforms_choices = list(p.name for p in _profiles) + ["cleanall"]
platforms_help = list(p.name for p in _profiles if p.support_level) + [
"cleanall"
]
platforms_choices = [p.name for p in _profiles] + ["cleanall"]
platforms_help = [p.name for p in _profiles if p.support_level] + ["cleanall"]
parser.add_argument(
"platform",
metavar="PLATFORM",
help=f"Build platform: {', '.join(platforms_help)}",
choices=platforms_choices,
)

ops = dict(
build="auto build (build 'build' Python, emports, configure, compile)",
configure="run ./configure",
compile="run 'make all'",
pythoninfo="run 'make pythoninfo'",
test="run 'make buildbottest TESTOPTS=...' (supports parallel tests)",
hostrunnertest="run 'make hostrunnertest TESTOPTS=...'",
repl="start interactive REPL / webserver + browser session",
clean="run 'make clean'",
cleanall="remove all build directories",
emports="build Emscripten port with embuilder (only Emscripten)",
)
ops = {
"build": "auto build (build 'build' Python, emports, configure, compile)",
"configure": "run ./configure",
"compile": "run 'make all'",
"pythoninfo": "run 'make pythoninfo'",
"test": "run 'make buildbottest TESTOPTS=...' (supports parallel tests)",
"hostrunnertest": "run 'make hostrunnertest TESTOPTS=...'",
"repl": "start interactive REPL / webserver + browser session",
"clean": "run 'make clean'",
"cleanall": "remove all build directories",
"emports": "build Emscripten port with embuilder (only Emscripten)",
}
ops_help = "\n".join(f"{op:16s} {help}" for op, help in ops.items())
parser.add_argument(
"ops",
Expand Down
Loading