Source code for spack.installer_dispatch

# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

import sys
from typing import TYPE_CHECKING, List, Optional, Set, Union

from spack.vendor.typing_extensions import Literal

import spack.config
import spack.sandbox
import spack.traverse

if TYPE_CHECKING:
    import spack.installer
    import spack.new_installer
    import spack.package_base


[docs] def create_installer( packages: List["spack.package_base.PackageBase"], *, dirty: bool = False, explicit: Union[Set[str], bool] = False, overwrite: Optional[Union[List[str], Set[str]]] = None, fail_fast: bool = False, fake: bool = False, include_build_deps: bool = False, install_deps: bool = True, install_package: bool = True, install_source: bool = False, keep_prefix: bool = False, keep_stage: bool = False, restage: bool = True, skip_patch: bool = False, stop_at: Optional[str] = None, stop_before: Optional[str] = None, tests: Union[bool, List[str], Set[str]] = False, unsigned: Optional[bool] = None, verbose: bool = False, concurrent_packages: Optional[int] = None, root_policy: Literal["auto", "cache_only", "source_only"] = "auto", dependencies_policy: Literal["auto", "cache_only", "source_only"] = "auto", create_reports: bool = False, ) -> Union["spack.installer.PackageInstaller", "spack.new_installer.PackageInstaller"]: """Create an installer based on the current configuration and feature support.""" use_old_installer = ( sys.platform == "win32" or spack.config.get("config:installer", "new") == "old" ) # Use the old installer if splicing is used. if not use_old_installer: specs = [pkg.spec for pkg in packages] for s in spack.traverse.traverse_nodes(specs): if s.build_spec is not s: use_old_installer = True break if spack.config.get("config:sandbox:enable", False): if use_old_installer: raise spack.sandbox.SandboxError( "config:sandbox:enable is only supported with config:installer:new" ) # Probe sandbox support now so builds don't fail later inside a subprocess. spack.sandbox.get_sandbox() if use_old_installer: from spack.installer import PackageInstaller # type: ignore else: from spack.new_installer import PackageInstaller # type: ignore return PackageInstaller( packages, dirty=dirty, explicit=explicit, overwrite=overwrite, fail_fast=fail_fast, fake=fake, include_build_deps=include_build_deps, install_deps=install_deps, install_package=install_package, install_source=install_source, keep_prefix=keep_prefix, keep_stage=keep_stage, restage=restage, skip_patch=skip_patch, stop_at=stop_at, stop_before=stop_before, tests=tests, unsigned=unsigned, verbose=verbose, concurrent_packages=concurrent_packages, root_policy=root_policy, dependencies_policy=dependencies_policy, create_reports=create_reports, )