pyodide/pyodide-build/pyodide_build/cli/build_recipes.py

80 lines
2.8 KiB
Python

import argparse
from pathlib import Path
import typer # type: ignore[import]
from .. import buildall
app = typer.Typer()
@app.command() # type: ignore[misc]
def recipe(
packages: list[str] = typer.Argument(
..., help="Packages to build, or * for all packages in recipe directory"
),
recipe_dir: str = typer.Option(
None,
help="The directory containing the recipe of packages. "
"If not specified, the default is `./packages`",
),
install: bool = typer.Option(
False,
help="If true, install the built packages into the install_dir. "
"If false, build packages without installing.",
),
install_dir: str = typer.Option(
None,
help="Path to install built packages and repodata.json. "
"If not specified, the default is `./dist`.",
),
cflags: str = typer.Option(
None, help="Extra compiling flags. Default: SIDE_MODULE_CFLAGS"
),
cxxflags: str = typer.Option(
None, help="Extra compiling flags. Default: SIDE_MODULE_CXXFLAGS"
),
ldflags: str = typer.Option(
None, help="Extra linking flags. Default: SIDE_MODULE_LDFLAGS"
),
target_install_dir: str = typer.Option(
None,
help="The path to the target Python installation. Default: TARGETINSTALLDIR",
),
host_install_dir: str = typer.Option(
None,
help="Directory for installing built host packages. Default: HOSTINSTALLDIR",
),
log_dir: str = typer.Option(None, help="Directory to place log files"),
force_rebuild: bool = typer.Option(
False,
help="Force rebuild of all packages regardless of whether they appear to have been updated",
),
n_jobs: int = typer.Option(4, help="Number of packages to build in parallel"),
ctx: typer.Context = typer.Context,
) -> None:
"""Build packages using yaml recipes and create repodata.json"""
root = Path.cwd()
recipe_dir_ = root / "packages" if not recipe_dir else Path(recipe_dir)
install_dir_ = root / "dist" if not install_dir else Path(install_dir)
# Note: to make minimal changes to the existing pyodide-build entrypoint,
# keep arguments of buildall unghanged.
# TODO: refactor this when we remove pyodide-build entrypoint.
args = argparse.Namespace(**ctx.params)
args.dir = args.recipe_dir
if len(args.packages) == 1 and "," in args.packages[0]:
# Handle packages passed with old comma separated syntax.
# This is to support `PYODIDE_PACKAGES="pkg1,pkg2,..." make` syntax.
args.only = args.packages[0].replace(" ", "")
else:
args.only = ",".join(args.packages)
args = buildall.set_default_args(args)
pkg_map = buildall.build_packages(recipe_dir_, args)
if install:
buildall.install_packages(pkg_map, install_dir_)