#!/usr/bin/env python3 __lazy_modules__ = ["_build"] import argparse import os import pathlib import _build HERE = pathlib.Path(__file__).parent def main(): default_host_runner = ( "{WASMTIME} run " # Set argv0 so that getpath.py can auto-discover the sysconfig data directory. "--argv0 {ARGV0} " # Map the checkout to / to load the stdlib from /Lib. "--dir {CHECKOUT}::/ " # Flags involving --optimize, --codegen, --debug, --wasm, and --wasi can be kept # in a config file. # We are using such a file to act as defaults in case a user wants to override # only some of the settings themselves, make it easy to modify settings # post-build so that they immediately apply to the Makefile instead of having to # regenerate it, and allow for easy copying of the settings for anyone else who # may want to use them. "--config {WASMTIME_CONFIG_PATH}" ) parser = argparse.ArgumentParser() subcommands = parser.add_subparsers(dest="subcommand") build = subcommands.add_parser("build", help="Build everything") configure_build = subcommands.add_parser( "configure-build-python", help="Run `configure` for the build Python" ) make_build = subcommands.add_parser( "make-build-python", help="Run `make` for the build Python" ) build_python = subcommands.add_parser( "build-python", help="Build the build Python" ) configure_host = subcommands.add_parser( "configure-host", help="Run `configure` for the " "host/WASI (pydebug builds " "are inferred from the build " "Python)", ) make_host = subcommands.add_parser( "make-host", help="Run `make` for the host/WASI" ) build_host = subcommands.add_parser( "build-host", help="Build the host/WASI Python" ) subcommands.add_parser( "clean", help="Delete files and directories created by this script" ) for subcommand in ( build, configure_build, make_build, build_python, configure_host, make_host, build_host, ): subcommand.add_argument( "--quiet", action="store_true", default=False, dest="quiet", help="Redirect output from subprocesses to a log file", ) subcommand.add_argument( "--logdir", type=pathlib.Path, default=None, help="Directory to store log files", ) for subcommand in ( configure_build, configure_host, build_python, build_host, ): subcommand.add_argument( "--clean", action="store_true", default=False, dest="clean", help="Delete any relevant directories before building", ) for subcommand in ( build, configure_build, configure_host, build_python, build_host, ): subcommand.add_argument( "args", nargs="*", help="Extra arguments to pass to `configure`" ) for subcommand in build, configure_host, build_host: subcommand.add_argument( "--wasi-sdk", type=pathlib.Path, dest="wasi_sdk_path", default=None, help="Path to the WASI SDK; defaults to WASI_SDK_PATH environment variable " "or the appropriate version found in /opt", ) subcommand.add_argument( "--host-runner", action="store", default=default_host_runner, dest="host_runner", help="Command template for running the WASI host; defaults to " f"`{default_host_runner}`", ) for subcommand in build, configure_host, make_host, build_host: subcommand.add_argument( "--host-triple", action="store", default=None, help="The target triple for the WASI host build; " f"defaults to the value found in {os.fsdecode(HERE / 'config.toml')}", ) context = parser.parse_args() match context.subcommand: case "configure-build-python": _build.configure_build_python(context) case "make-build-python": _build.make_build_python(context) case "build-python": _build.configure_build_python(context) _build.make_build_python(context) case "configure-host": _build.configure_wasi_python(context) case "make-host": _build.make_wasi_python(context) case "build-host": _build.configure_wasi_python(context) _build.make_wasi_python(context) case "build": _build.configure_build_python(context) _build.make_build_python(context) _build.configure_wasi_python(context) _build.make_wasi_python(context) case "clean": _build.clean_contents(context) case _: raise ValueError(f"Unknown subcommand {context.subcommand!r}") if __name__ == "__main__": main()