diff --git a/pyodide_build/buildall.py b/pyodide_build/buildall.py index c2db5902..2566a5c4 100755 --- a/pyodide_build/buildall.py +++ b/pyodide_build/buildall.py @@ -33,8 +33,13 @@ from pyodide_build.build_env import BuildArgs, get_pyodide_root from pyodide_build.buildpkg import needs_rebuild from pyodide_build.common import ( +<<<<<<< HEAD download_and_unpack_archive, exit_with_stdio, +||||||| 632c8e6 +======= + exit_with_stdio, +>>>>>>> main extract_wheel_metadata_file, find_matching_wheels, find_missing_executables, @@ -160,6 +165,8 @@ def build(self, build_args: BuildArgs, build_dir: Path) -> None: # been updated and should be rebuilt even though its own # files haven't been updated. "--force-rebuild", + # We already did the rust setup in buildall + "--skip-rust-setup", ], check=False, stdout=subprocess.DEVNULL, diff --git a/pyodide_build/cli/build_recipes.py b/pyodide_build/cli/build_recipes.py index b92a6220..23bfcb15 100644 --- a/pyodide_build/cli/build_recipes.py +++ b/pyodide_build/cli/build_recipes.py @@ -4,7 +4,7 @@ import typer -from pyodide_build import build_env, buildall +from pyodide_build import build_env, buildall, recipe from pyodide_build.build_env import BuildArgs, init_environment from pyodide_build.buildpkg import RecipeBuilder from pyodide_build.common import get_num_cores @@ -17,6 +17,7 @@ class Args: build_dir: Path install_dir: Path build_args: BuildArgs + skip_rust_setup: bool force_rebuild: bool n_jobs: int @@ -28,6 +29,7 @@ def __init__( install_dir: Path | str | None = None, build_args: BuildArgs, force_rebuild: bool, + skip_rust_setup: bool = False, n_jobs: int | None = None, ): cwd = Path.cwd() @@ -41,6 +43,7 @@ def __init__( ) self.build_args = build_args self.force_rebuild = force_rebuild + self.skip_rust_setup = skip_rust_setup self.n_jobs = n_jobs or get_num_cores() if not self.recipe_dir.is_dir(): raise FileNotFoundError(f"Recipe directory {self.recipe_dir} not found") @@ -93,6 +96,11 @@ def build_recipes_no_deps( "--continue", help="Continue a build from the middle. For debugging. Implies '--force-rebuild'", ), + skip_rust_setup: bool = typer.Option( + False, + "--skip-rust-setup", + help="Don't setup rust environment when building a rust package", + ), ) -> None: """Build packages using yaml recipes but don't try to resolve dependencies""" init_environment() @@ -113,15 +121,25 @@ def build_recipes_no_deps( build_dir=build_dir, recipe_dir=recipe_dir, force_rebuild=force_rebuild, + skip_rust_setup=skip_rust_setup, ) return build_recipes_no_deps_impl(packages, args, continue_) +def _rust_setup(recipe_dir: Path, packages: list[str]): + recipes = recipe.load_recipes(recipe_dir, packages, False) + if any(recipe.is_rust_package() for recipe in recipes.values()): + buildall._ensure_rust_toolchain() + + def build_recipes_no_deps_impl( packages: list[str], args: Args, continue_: bool ) -> None: # TODO: use multiprocessing? + if not args.skip_rust_setup: + _rust_setup(args.recipe_dir, packages) + for package in packages: package_path = args.recipe_dir / package package_build_dir = args.build_dir / package / "build"