예제 #1
0
Usage:
   $ build_feedstock.py [ arguments ]
For usage description of arguments, this script supports use of --help:
   $ build_feedstock.py --help

*******************************************************************************
"""

import sys
import os
import traceback
import yaml

import utils
from errors import OpenCEError, Error
utils.check_if_conda_build_exists()

# pylint: disable=wrong-import-position
import conda_build.api
from conda_build.config import get_or_merge_config
# pylint: enable=wrong-import-position


def make_parser():
    ''' Parser input arguments '''
    arguments = [
        utils.Argument.CONDA_BUILD_CONFIG, utils.Argument.OUTPUT_FOLDER,
        utils.Argument.CHANNELS, utils.Argument.PYTHON_VERSIONS,
        utils.Argument.BUILD_TYPES, utils.Argument.MPI_TYPES
    ]
    parser = utils.make_parser(
예제 #2
0
def build_env(arg_strings=None):
    '''
    Entry function.
    '''
    parser = make_parser()
    args = parser.parse_args(arg_strings)

    if args.docker_build:
        docker_build.build_with_docker(args.output_folder, sys.argv)
        return

    # Checking conda-build existence if --docker_build is not specified
    utils.check_if_conda_build_exists()

    # Here, importing BuildTree is intentionally done after checking
    # existence of conda-build as BuildTree uses conda_build APIs.
    from build_tree import BuildTree  # pylint: disable=import-outside-toplevel

    common_package_build_args = []
    common_package_build_args += [
        "--output_folder",
        os.path.abspath(args.output_folder)
    ]
    common_package_build_args += [
        "--channel", os.path.abspath(args.output_folder)
    ]
    common_package_build_args += [
        "--conda_build_config",
        os.path.abspath(args.conda_build_config)
    ]

    for channel in args.channels_list:
        common_package_build_args += ["--channels", channel]

    # If repository_folder doesn't exist, create it
    if args.repository_folder and not os.path.exists(args.repository_folder):
        os.mkdir(args.repository_folder)

    # Create the build tree
    build_tree = BuildTree(env_config_files=args.env_config_file,
                           python_versions=utils.parse_arg_list(
                               args.python_versions),
                           build_types=utils.parse_arg_list(args.build_types),
                           mpi_types=utils.parse_arg_list(args.mpi_types),
                           repository_folder=args.repository_folder,
                           git_location=args.git_location,
                           git_tag_for_env=args.git_tag_for_env,
                           conda_build_config=args.conda_build_config)

    conda_env_data = CondaEnvFileGenerator(
        python_versions=args.python_versions,
        build_types=args.build_types,
        mpi_types=args.mpi_types,
        channels=args.channels_list,
        output_folder=os.path.abspath(args.output_folder),
    )

    # Build each package in the packages list
    for build_command in build_tree:
        build_args = common_package_build_args + build_command.feedstock_args()
        try:
            build_feedstock.build_feedstock(build_args)
        except OpenCEError as exc:
            raise OpenCEError(Error.BUILD_RECIPE, build_command.repository,
                              exc.msg) from exc

        conda_env_data.update_conda_env_file_content(build_command, build_tree)

    conda_env_files = conda_env_data.write_conda_env_files()
    print(
        "Generated conda environment files from the selected build arguments:",
        conda_env_files)
    print("INFO: One can use these environment files to create a conda" \
          " environment using \"conda env create -f <conda_env_file_name>.\"")
예제 #3
0
def build_env(arg_strings=None):
    '''
    Entry function.
    '''
    parser = make_parser()
    args = parser.parse_args(arg_strings)

    if args.docker_build:
        return docker_build.build_with_docker(args.output_folder, sys.argv)

    # Checking conda-build existence if --docker_build is not specified
    utils.check_if_conda_build_exists()

    # Here, importing BuildTree is intentionally done after checking
    # existence of conda-build as BuildTree uses conda_build APIs.
    from build_tree import BuildTree  # pylint: disable=import-outside-toplevel

    result = 0

    common_package_build_args = []
    common_package_build_args += [
        "--output_folder",
        os.path.abspath(args.output_folder)
    ]
    common_package_build_args += [
        "--channel", os.path.abspath(args.output_folder)
    ]
    common_package_build_args += [
        "--conda_build_config",
        os.path.abspath(args.conda_build_config)
    ]

    for channel in args.channels_list:
        common_package_build_args += ["--channels", channel]

    # If repository_folder doesn't exist, create it
    if args.repository_folder and not os.path.exists(args.repository_folder):
        os.mkdir(args.repository_folder)

    # Create the build tree
    try:
        build_tree = BuildTree(
            env_config_files=args.env_config_file,
            python_versions=utils.parse_arg_list(args.python_versions),
            build_types=utils.parse_arg_list(args.build_types),
            repository_folder=args.repository_folder,
            git_location=args.git_location,
            git_tag_for_env=args.git_tag_for_env,
            conda_build_config=args.conda_build_config)
    except OpenCEError as err:
        print(err.msg)
        return 1

    # Build each package in the packages list
    for build_command in build_tree:
        build_args = common_package_build_args + build_command.feedstock_args()
        result = build_feedstock.build_feedstock(build_args)
        if result != 0:
            print("Unable to build recipe: " + build_command.repository)
            return result

    return result
예제 #4
0
def build_env(args):
    '''Entry Function'''
    if args.docker_build:
        if len(args.cuda_versions.split(',')) > 1:
            raise OpenCEError(Error.TOO_MANY_CUDA)
        docker_build.build_with_docker(os.path.abspath(args.output_folder),
                                       args.build_types, args.cuda_versions,
                                       sys.argv)
        for conda_env_file in glob.glob(
                os.path.join(args.output_folder, "*.yaml")):
            utils.replace_conda_env_channels(
                conda_env_file,
                os.path.abspath(
                    os.path.join(docker_build.HOME_PATH,
                                 utils.DEFAULT_OUTPUT_FOLDER)),
                os.path.abspath(args.output_folder))
        return

    # Checking conda-build existence if --docker_build is not specified
    utils.check_if_conda_build_exists()

    # Here, importing BuildTree is intentionally done after checking
    # existence of conda-build as BuildTree uses conda_build APIs.
    from build_tree import BuildTree  # pylint: disable=import-outside-toplevel

    # If repository_folder doesn't exist, create it
    if args.repository_folder and not os.path.exists(args.repository_folder):
        os.mkdir(args.repository_folder)

    variants = utils.make_variants(args.python_versions, args.build_types,
                                   args.mpi_types, args.cuda_versions)
    validate_config.validate_env_config(args.conda_build_config,
                                        args.env_config_file, variants,
                                        args.repository_folder)

    # Create the build tree
    build_tree = BuildTree(
        env_config_files=args.env_config_file,
        python_versions=inputs.parse_arg_list(args.python_versions),
        build_types=inputs.parse_arg_list(args.build_types),
        mpi_types=inputs.parse_arg_list(args.mpi_types),
        cuda_versions=inputs.parse_arg_list(args.cuda_versions),
        repository_folder=args.repository_folder,
        git_location=args.git_location,
        git_tag_for_env=args.git_tag_for_env,
        conda_build_config=args.conda_build_config,
        test_labels=inputs.parse_arg_list(args.test_labels))

    # Generate conda environment files
    conda_env_files = build_tree.write_conda_env_files(
        channels=args.channels_list,
        output_folder=os.path.abspath(args.output_folder),
        path=os.path.abspath(args.output_folder))
    print(
        "Generated conda environment files from the selected build arguments:",
        conda_env_files.values())
    print("INFO: One can use these environment files to create a conda" \
          " environment using \"conda env create -f <conda_env_file_name>.\"")

    if not args.skip_build_packages:
        # Build each package in the packages list
        for build_command in build_tree:
            if not _all_outputs_exist(args.output_folder,
                                      build_command.output_files):
                try:
                    print("Building " + build_command.recipe)
                    build_feedstock.build_feedstock_from_command(
                        build_command,
                        output_folder=os.path.abspath(args.output_folder),
                        extra_channels=[os.path.abspath(args.output_folder)] +
                        args.channels_list,
                        conda_build_config=os.path.abspath(
                            args.conda_build_config))
                except OpenCEError as exc:
                    raise OpenCEError(Error.BUILD_RECIPE,
                                      build_command.repository,
                                      exc.msg) from exc
            else:
                print("Skipping build of " + build_command.recipe +
                      " because it already exists")

    if args.run_tests:
        _run_tests(build_tree, conda_env_files)