#!/bin/sh """exec" "python3" "$0" "$@" #""" # fmt: off # fmt: on # # This file has been generated by conda-smithy in order to build the recipe # locally. # # The line above this comment is a bash / sh / zsh guard # to stop people from running it with the wrong interpreter import glob import os import platform import subprocess import sys from argparse import ArgumentParser def setup_environment(ns): os.environ["CONFIG"] = ns.config os.environ["UPLOAD_PACKAGES"] = "False" os.environ["IS_PR_BUILD"] = "True" if ns.debug: os.environ["BUILD_WITH_CONDA_DEBUG"] = "1" if ns.output_id: os.environ["BUILD_OUTPUT_ID"] = ns.output_id if "MINIFORGE_HOME" not in os.environ: os.environ["MINIFORGE_HOME"] = os.path.join( os.path.dirname(__file__), "miniforge3" ) # The default cache location might not be writable using docker on macOS. if ns.config.startswith("linux") and platform.system() == "Darwin": os.environ["CONDA_FORGE_DOCKER_RUN_ARGS"] = ( os.environ.get("CONDA_FORGE_DOCKER_RUN_ARGS", "") + " -e RATTLER_CACHE_DIR=/tmp/rattler_cache" ) def run_docker_build(ns): script = ".scripts/run_docker_build.sh" subprocess.check_call([script]) def run_osx_build(ns): script = ".scripts/run_osx_build.sh" subprocess.check_call([script]) def run_win_build(ns): script = ".scripts/run_win_build.bat" subprocess.check_call(["cmd", "/D", "/Q", "/C", f"CALL {script}"]) def verify_config(ns): choices_filter = ns.filter or "*" valid_configs = { os.path.basename(f)[:-5] for f in glob.glob(f".ci_support/{choices_filter}.yaml") } if choices_filter != "*": print(f"filtering for '{choices_filter}.yaml' configs") print(f"valid configs are {valid_configs}") if ns.config in valid_configs: print("Using " + ns.config + " configuration") return elif len(valid_configs) == 1: ns.config = valid_configs.pop() print("Found " + ns.config + " configuration") elif ns.config is None: print("config not selected, please choose from the following:\n") selections = list(enumerate(sorted(valid_configs), 1)) for i, c in selections: print(f"{i}. {c}") try: s = input("\n> ") except KeyboardInterrupt: print("\nno option selected, bye!", file=sys.stderr) sys.exit(1) idx = int(s) - 1 ns.config = selections[idx][1] print(f"selected {ns.config}") else: raise ValueError("config " + ns.config + " is not valid") if ( ns.config.startswith("osx") and platform.system() == "Darwin" and not os.environ.get("OSX_SDK_DIR") ): raise RuntimeError( "Need OSX_SDK_DIR env variable set. Run 'export OSX_SDK_DIR=$PWD/SDKs' " "to download the SDK automatically to '$PWD/SDKs/MacOSX.sdk'. " "Note: OSX_SDK_DIR must be set to an absolute path. " "Setting this variable implies agreement to the licensing terms of the SDK by Apple." ) def main(args=None): p = ArgumentParser("build-locally") p.add_argument("config", default=None, nargs="?") p.add_argument( "--filter", default=None, help="Glob string to filter which build choices are presented in interactive mode.", ) p.add_argument( "--debug", action="store_true", help="Setup debug environment using `conda debug`", ) p.add_argument( "--output-id", help="If running debug, specify the output to setup." ) ns = p.parse_args(args=args) verify_config(ns) setup_environment(ns) try: if ns.config.startswith("linux") or ( ns.config.startswith("osx") and platform.system() == "Linux" ): run_docker_build(ns) elif ns.config.startswith("osx"): run_osx_build(ns) elif ns.config.startswith("win"): run_win_build(ns) finally: recipe_license_file = os.path.join( "recipe", "recipe-scripts-license.txt" ) if os.path.exists(recipe_license_file): os.remove(recipe_license_file) if __name__ == "__main__": main()