diff --git a/bob/devtools/build.py b/bob/devtools/build.py index fdc8d86e6a410c2610e87cc209b2da864a5c9c55..986634b4aa975461f3f8b710617b60a7ec2e9a42 100644 --- a/bob/devtools/build.py +++ b/bob/devtools/build.py @@ -716,7 +716,9 @@ def base_build( return conda_build.api.build(recipe_dir, config=conda_config) -def load_packages_from_conda_build_config(conda_build_config, condarc_options): +def load_packages_from_conda_build_config( + conda_build_config, condarc_options, with_pins=False +): with open(conda_build_config, "r") as f: content = f.read() @@ -734,7 +736,15 @@ def load_packages_from_conda_build_config(conda_build_config, condarc_options): package_names_map = package_pins.pop("package_names_map") - packages = [package_names_map.get(p, p) for p in package_pins.keys()] + if with_pins: + # NB : in pins, need to strip the occasional " cuda*" suffix + # tensorflow=x.x.x cuda* -> tensorflow=x.x.x + packages = [ + f"{package_names_map.get(p, p)}={str(v[0]).split(' ')[0]}" + for p, v in package_pins.items() + ] + else: + packages = [package_names_map.get(p, p) for p in package_pins.keys()] return packages, package_names_map diff --git a/bob/devtools/scripts/install_deps.py b/bob/devtools/scripts/install_deps.py new file mode 100644 index 0000000000000000000000000000000000000000..ac266ddc751b3d3b39ca6aff66a5968f1dbc680a --- /dev/null +++ b/bob/devtools/scripts/install_deps.py @@ -0,0 +1,52 @@ +"""Create an environment with all external dependencies listed in bob/devtools/data/conda_build_config.yaml""" +import click + + +@click.command( + epilog="""Example: + 1. Creates an environment called `myenv' containing all external bob dependencies: + +python bob/devtools/scripts/install_deps.py myenv + +2. The version of python to solve with can be provided as option: + +python bob/devtools/scripts/install_deps.py myenv --python=3.8 + +""" +) +@click.argument("env_name", nargs=1) +@click.option("--python", required=True, help="Python version to pin, e.g. 3.8") +def install_deps(env_name, python): + import subprocess + + from bob.devtools.build import load_packages_from_conda_build_config + + conda_config_path = "bob/devtools/data/conda_build_config.yaml" + + packages, package_names_map = load_packages_from_conda_build_config( + conda_config_path, {"channels": []}, with_pins=True + ) + + # ask mamba to create an environment with the packages + try: + _ = subprocess.run( + [ + "mamba", + "create", + "--override-channels", + "-c", + "conda-forge", + "-n", + env_name, + f"python={python}", + ] + + packages, + check=True, + ) + except subprocess.CalledProcessError as e: + print(e.output.decode()) + raise e + + +if __name__ == "__main__": + install_deps()