def main(config=None): parser = argparse.ArgumentParser( description= "Boa, the fast, mamba powered-build tool for conda packages.") subparsers = parser.add_subparsers(help="sub-command help", dest="command") parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument("--recipe-dir", type=str) parent_parser.add_argument("target", type=str, default="") parent_parser.add_argument("--features", type=str) parent_parser.add_argument("--offline", action="store_true") parent_parser.add_argument("--target-platform", type=str) parent_parser.add_argument("--json", action="store_true") variant_parser = argparse.ArgumentParser(add_help=False) variant_parser.add_argument( "-m", "--variant-config-files", action="append", help= """Additional variant config files to add. These yaml files can contain keys such as `c_compiler` and `target_platform` to form a build matrix.""", ) subparsers.add_parser("render", parents=[parent_parser, variant_parser], help="render a recipe") subparsers.add_parser( "convert", parents=[parent_parser], help="convert recipe.yaml to old-style meta.yaml", ) subparsers.add_parser( "validate", parents=[parent_parser], help="Validate recipe.yaml", ) build_parser = argparse.ArgumentParser(add_help=False) build_parser.add_argument( "-i", "--interactive", action="store_true", help="Use interactive mode if build fails", ) build_parser.add_argument( "--skip-existing", action="store_true", help="Skip building existing packages", ) build_parser.add_argument( "--no-test", action="store_true", dest="notest", help="Do not test the package.", ) subparsers.add_parser( "build", parents=[parent_parser, build_parser, variant_parser], help="build a recipe", ) transmute_parser = subparsers.add_parser( "transmute", parents=(), help= "transmute one or many tar.bz2 packages into a conda packages (or vice versa!)", ) transmute_parser.add_argument("files", type=str, nargs="+") transmute_parser.add_argument("-o", "--output-directory", type=str, default=".") transmute_parser.add_argument("-c", "--compression-level", type=int, default=22) transmute_parser.add_argument( "-n_jobs", "--num_jobs", type=int, default=1, help="the number of parallel processing elements", ) args = parser.parse_args() command = args.command init_api_context() init_global_config(args) from boa.core.run_build import run_build from boa.cli import convert from boa.cli import transmute from boa.cli import validate if command == "convert": convert.main(args.target) exit() if command == "validate": validate.main(args.target) exit() if command == "transmute": transmute.main(args) exit() from boa.core.config import boa_config boa_config.console.print(banner) if command == "build" or command == "render": run_build(args)
def main(config=None): print(banner) parser = argparse.ArgumentParser( description="Boa, the fast, mamba powered-build tool for conda packages." ) subparsers = parser.add_subparsers(help="sub-command help", dest="command") parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument("recipe_dir", type=str) render_parser = subparsers.add_parser( "render", parents=[parent_parser], help="render a recipe" ) convert_parser = subparsers.add_parser( "convert", parents=[parent_parser], help="convert recipe.yaml to old-style meta.yaml" ) build_parser = subparsers.add_parser( "build", parents=[parent_parser], help="build a recipe" ) args = parser.parse_args() command = args.command if command == 'convert': from boa.cli import convert convert.main(args.recipe_dir) exit() folder = args.recipe_dir cbc, config = get_config(folder) if not os.path.exists(config.output_folder): mkdir_p(config.output_folder) print(f"Updating build index: {(config.output_folder)}\n") update_index(config.output_folder, verbose=config.debug, threads=1) recipe_path = os.path.join(folder, "recipe.yaml") # step 1: parse YAML with open(recipe_path) as fi: loader = YAML(typ="safe") ydoc = loader.load(fi) # step 2: fill out context dict context_dict = ydoc.get("context") or {} jenv = jinja2.Environment() for key, value in context_dict.items(): if isinstance(value, str): tmpl = jenv.from_string(value) context_dict[key] = tmpl.render(context_dict) if ydoc.get("context"): del ydoc["context"] # step 3: recursively loop over the entire recipe and render jinja with context jenv.globals.update(jinja_functions(config, context_dict)) for key in ydoc: render_recursive(ydoc[key], context_dict, jenv) flatten_selectors(ydoc, ns_cfg(config)) normalize_recipe(ydoc) # pprint(ydoc) # We need to assemble the variants for each output variants = {} # if we have a outputs section, use that order the outputs if ydoc.get("outputs"): for o in ydoc["outputs"]: # inherit from global package pkg_meta = {} pkg_meta.update(ydoc["package"]) pkg_meta.update(o["package"]) o["package"] = pkg_meta build_meta = {} build_meta.update(ydoc.get("build")) build_meta.update(o.get("build") or {}) o["build"] = build_meta variants[o["package"]["name"]] = get_dependency_variants( o.get("requirements", {}), cbc, config ) else: # we only have one output variants[ydoc["package"]["name"]] = get_dependency_variants( ydoc.get("requirements", {}), cbc, config ) # this takes in all variants and outputs, builds a dependency tree and returns # the final metadata sorted_outputs = to_build_tree(ydoc, variants, config) # then we need to solve and build from the bottom up # we can't first solve all packages without finalizing everything # # FLOW: # ===== # - solve the package # - solv build, add weak run exports to # - add run exports from deps! print('\n') if command == "render": for o in sorted_outputs: print(o) exit() # TODO this should be done cleaner top_name = ydoc['package']['name'] o0 = sorted_outputs[0] o0.is_first = True o0.config.compute_build_id(top_name) solver = MambaSolver(["conda-forge"], context.subdir) print("\n") download_source(MetaData(recipe_path, o0)) cached_source = o0.sections['source'] for o in sorted_outputs: solver.replace_channels() o.finalize_solve(sorted_outputs, solver) # print(o) o.config._build_id = o0.config.build_id if "build" in o.transactions: if isdir(o.config.build_prefix): utils.rm_rf(o.config.build_prefix) mkdir_p(o.config.build_prefix) o.transactions['build'].execute(PrefixData(o.config.build_prefix), PackageCacheData.first_writable().pkgs_dir) if "host" in o.transactions: mkdir_p(o.config.host_prefix) o.transactions['host'].execute(PrefixData(o.config.host_prefix), PackageCacheData.first_writable().pkgs_dir) meta = MetaData(recipe_path, o) o.final_build_id = meta.build_id() if cached_source != o.sections['source']: download_source(meta) build(meta, None) for o in sorted_outputs: print("\n") print(o)
def main(config=None): parser = argparse.ArgumentParser( description= "Boa, the fast, mamba powered-build tool for conda packages.") subparsers = parser.add_subparsers(help="sub-command help", dest="command") parent_parser = argparse.ArgumentParser(add_help=False) parent_parser.add_argument("--recipe-dir", type=str, default=os.getcwd()) parent_parser.add_argument("target", type=str, default="") parent_parser.add_argument("--features", type=str) parent_parser.add_argument("--offline", action="store_true") parent_parser.add_argument("--target-platform", type=str) subparsers.add_parser("render", parents=[parent_parser], help="render a recipe") subparsers.add_parser( "convert", parents=[parent_parser], help="convert recipe.yaml to old-style meta.yaml", ) subparsers.add_parser( "validate", parents=[parent_parser], help="Validate recipe.yaml", ) build_parser = argparse.ArgumentParser(add_help=False) build_parser.add_argument( "-i", "--interactive", action="store_true", help="Use interactive mode if build fails", ) build_parser.add_argument( "--skip-existing", action="store_true", help="Skip building existing packages", ) subparsers.add_parser("build", parents=[parent_parser, build_parser], help="build a recipe") transmute_parser = subparsers.add_parser( "transmute", parents=(), help= "transmute one or many tar.bz2 packages into a conda packages (or vice versa!)", ) transmute_parser.add_argument("files", type=str, nargs="+") transmute_parser.add_argument("-o", "--output-directory", type=str, default=".") transmute_parser.add_argument("-c", "--compression-level", type=int, default=22) transmute_parser.add_argument( "-n_jobs", "--num_jobs", type=int, default=1, help="the number of parallel processing elements", ) args = parser.parse_args() command = args.command if command == "convert": convert.main(args.target) exit() if command == "validate": validate.main(args.target) exit() if command == "transmute": transmute.main(args) exit() console.print(banner) if command == "build" or command == "render": run_build(args)