2323"""
2424
2525import argparse
26- import enum
2726import dataclasses
27+ import enum
2828import logging
2929import os
3030import pathlib
3939import time
4040import warnings
4141import webbrowser
42+ from collections .abc import Callable , Iterable
4243
4344# for Python 3.8
4445from typing import (
45- cast ,
4646 Any ,
47- Callable ,
48- Dict ,
49- Iterable ,
50- List ,
51- Optional ,
52- Tuple ,
53- Union ,
47+ cast ,
5448)
5549
5650logger = logging .getLogger ("wasm_build" )
122116
123117def parse_emconfig (
124118 emconfig : pathlib .Path = EM_CONFIG ,
125- ) -> Tuple [pathlib .Path , pathlib .Path ]:
119+ ) -> tuple [pathlib .Path , pathlib .Path ]:
126120 """Parse EM_CONFIG file and lookup EMSCRIPTEN_ROOT and NODE_JS.
127121
128122 The ".emscripten" config file is a Python snippet that uses "EM_CONFIG"
@@ -134,7 +128,7 @@ def parse_emconfig(
134128 with open (emconfig , encoding = "utf-8" ) as f :
135129 code = f .read ()
136130 # EM_CONFIG file is a Python snippet
137- local : Dict [str , Any ] = {}
131+ local : dict [str , Any ] = {}
138132 exec (code , globals (), local )
139133 emscripten_root = pathlib .Path (local ["EMSCRIPTEN_ROOT" ])
140134 node_js = pathlib .Path (local ["NODE_JS" ])
@@ -192,16 +186,16 @@ class Platform:
192186
193187 name : str
194188 pythonexe : str
195- config_site : Optional [ pathlib .PurePath ]
196- configure_wrapper : Optional [ pathlib .Path ]
197- make_wrapper : Optional [ pathlib .PurePath ]
198- environ : Dict [str , Any ]
189+ config_site : pathlib .PurePath | None
190+ configure_wrapper : pathlib .Path | None
191+ make_wrapper : pathlib .PurePath | None
192+ environ : dict [str , Any ]
199193 check : Callable [[], None ]
200194 # Used for build_emports().
201- ports : Optional [ pathlib .PurePath ]
202- cc : Optional [ pathlib .PurePath ]
195+ ports : pathlib .PurePath | None
196+ cc : pathlib .PurePath | None
203197
204- def getenv (self , profile : "BuildProfile" ) -> Dict [str , Any ]:
198+ def getenv (self , profile : "BuildProfile" ) -> dict [str , Any ]:
205199 return self .environ .copy ()
206200
207201
@@ -264,7 +258,7 @@ def _check_emscripten() -> None:
264258 # git / upstream / tot-upstream installation
265259 version = version [:- 4 ]
266260 version_tuple = cast (
267- Tuple [int , int , int ], tuple (int (v ) for v in version .split ("." ))
261+ tuple [int , int , int ], tuple (int (v ) for v in version .split ("." ))
268262 )
269263 if version_tuple < EMSDK_MIN_VERSION :
270264 raise ConditionError (
@@ -388,7 +382,7 @@ def get_extra_paths(self) -> Iterable[pathlib.PurePath]:
388382 return []
389383
390384 @property
391- def emport_args (self ) -> List [str ]:
385+ def emport_args (self ) -> list [str ]:
392386 """Host-specific port args (Emscripten)."""
393387 cls = type (self )
394388 if self is cls .wasm64_emscripten :
@@ -399,7 +393,7 @@ def emport_args(self) -> List[str]:
399393 return []
400394
401395 @property
402- def embuilder_args (self ) -> List [str ]:
396+ def embuilder_args (self ) -> list [str ]:
403397 """Host-specific embuilder args (Emscripten)."""
404398 cls = type (self )
405399 if self is cls .wasm64_emscripten :
@@ -422,7 +416,7 @@ def is_browser(self) -> bool:
422416 return self in {cls .browser , cls .browser_debug }
423417
424418 @property
425- def emport_args (self ) -> List [str ]:
419+ def emport_args (self ) -> list [str ]:
426420 """Target-specific port args."""
427421 cls = type (self )
428422 if self in {cls .browser_debug , cls .node_debug }:
@@ -448,9 +442,9 @@ class BuildProfile:
448442 name : str
449443 support_level : SupportLevel
450444 host : Host
451- target : Union [ EmscriptenTarget , None ] = None
452- dynamic_linking : Union [ bool , None ] = None
453- pthreads : Union [ bool , None ] = None
445+ target : EmscriptenTarget | None = None
446+ dynamic_linking : bool | None = None
447+ pthreads : bool | None = None
454448 default_testopts : str = "-j2"
455449
456450 @property
@@ -474,7 +468,7 @@ def makefile(self) -> pathlib.Path:
474468 return self .builddir / "Makefile"
475469
476470 @property
477- def configure_cmd (self ) -> List [str ]:
471+ def configure_cmd (self ) -> list [str ]:
478472 """Generate configure command"""
479473 # use relative path, so WASI tests can find lib prefix.
480474 # pathlib.Path.relative_to() does not work here.
@@ -509,15 +503,15 @@ def configure_cmd(self) -> List[str]:
509503 return cmd
510504
511505 @property
512- def make_cmd (self ) -> List [str ]:
506+ def make_cmd (self ) -> list [str ]:
513507 """Generate make command"""
514508 cmd = ["make" ]
515509 platform = self .host .platform
516510 if platform .make_wrapper :
517511 cmd .insert (0 , os .fspath (platform .make_wrapper ))
518512 return cmd
519513
520- def getenv (self ) -> Dict [str , Any ]:
514+ def getenv (self ) -> dict [str , Any ]:
521515 """Generate environ dict for platform"""
522516 env = os .environ .copy ()
523517 if hasattr (os , "process_cpu_count" ):
@@ -531,7 +525,7 @@ def getenv(self) -> Dict[str, Any]:
531525 env .pop (key , None )
532526 elif key == "PATH" :
533527 # list of path items, prefix with extra paths
534- new_path : List [pathlib .PurePath ] = []
528+ new_path : list [pathlib .PurePath ] = []
535529 new_path .extend (self .host .get_extra_paths ())
536530 new_path .extend (value )
537531 env [key ] = os .pathsep .join (os .fspath (p ) for p in new_path )
@@ -549,7 +543,7 @@ def _run_cmd(
549543 self ,
550544 cmd : Iterable [str ],
551545 args : Iterable [str ] = (),
552- cwd : Optional [ pathlib .Path ] = None ,
546+ cwd : pathlib .Path | None = None ,
553547 ) -> int :
554548 cmd = list (cmd )
555549 cmd .extend (args )
@@ -587,7 +581,7 @@ def run_pythoninfo(self, *args: str) -> int:
587581 self ._check_execute ()
588582 return self .run_make ("pythoninfo" , * args )
589583
590- def run_test (self , target : str , testopts : Optional [ str ] = None ) -> int :
584+ def run_test (self , target : str , testopts : str | None = None ) -> int :
591585 """Run buildbottests"""
592586 self ._check_execute ()
593587 if testopts is None :
@@ -823,29 +817,27 @@ def build_emports(self, force: bool = False) -> None:
823817)
824818
825819# Don't list broken and experimental variants in help
826- platforms_choices = list (p .name for p in _profiles ) + ["cleanall" ]
827- platforms_help = list (p .name for p in _profiles if p .support_level ) + [
828- "cleanall"
829- ]
820+ platforms_choices = [p .name for p in _profiles ] + ["cleanall" ]
821+ platforms_help = [p .name for p in _profiles if p .support_level ] + ["cleanall" ]
830822parser .add_argument (
831823 "platform" ,
832824 metavar = "PLATFORM" ,
833825 help = f"Build platform: { ', ' .join (platforms_help )} " ,
834826 choices = platforms_choices ,
835827)
836828
837- ops = dict (
838- build = "auto build (build 'build' Python, emports, configure, compile)" ,
839- configure = "run ./configure" ,
840- compile = "run 'make all'" ,
841- pythoninfo = "run 'make pythoninfo'" ,
842- test = "run 'make buildbottest TESTOPTS=...' (supports parallel tests)" ,
843- hostrunnertest = "run 'make hostrunnertest TESTOPTS=...'" ,
844- repl = "start interactive REPL / webserver + browser session" ,
845- clean = "run 'make clean'" ,
846- cleanall = "remove all build directories" ,
847- emports = "build Emscripten port with embuilder (only Emscripten)" ,
848- )
829+ ops = {
830+ " build" : "auto build (build 'build' Python, emports, configure, compile)" ,
831+ " configure" : "run ./configure" ,
832+ " compile" : "run 'make all'" ,
833+ " pythoninfo" : "run 'make pythoninfo'" ,
834+ " test" : "run 'make buildbottest TESTOPTS=...' (supports parallel tests)" ,
835+ " hostrunnertest" : "run 'make hostrunnertest TESTOPTS=...'" ,
836+ " repl" : "start interactive REPL / webserver + browser session" ,
837+ " clean" : "run 'make clean'" ,
838+ " cleanall" : "remove all build directories" ,
839+ " emports" : "build Emscripten port with embuilder (only Emscripten)" ,
840+ }
849841ops_help = "\n " .join (f"{ op :16s} { help } " for op , help in ops .items ())
850842parser .add_argument (
851843 "ops" ,
0 commit comments