Source code for spack.platforms
# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import contextlib
from typing import Callable
from ._functions import _host, by_name, platforms, reset
from ._platform import Platform
from .darwin import Darwin
from .freebsd import FreeBSD
from .linux import Linux
from .test import Test
from .windows import Windows
__all__ = [
"Platform",
"Darwin",
"Linux",
"FreeBSD",
"Test",
"Windows",
"platforms",
"host",
"by_name",
"reset",
"using_libc_compatibility",
]
#: The "real" platform of the host running Spack. This should not be changed
#: by any method and is here as a convenient way to refer to the host platform.
real_host = _host
#: The current platform used by Spack. May be swapped by the use_platform
#: context manager.
host: Callable[[], Platform] = _host
class _PickleableCallable:
"""Class used to pickle a callable that may substitute either
_platform or _all_platforms. Lambda or nested functions are
not pickleable.
"""
def __init__(self, return_value):
self.return_value = return_value
def __call__(self):
return self.return_value
[docs]
def using_libc_compatibility() -> bool:
"""Returns True if we are using libc compatibility on this platform."""
return host().name == "linux"
@contextlib.contextmanager
def use_platform(new_platform):
global host
import spack.config
assert isinstance(new_platform, Platform), f'"{new_platform}" must be an instance of Platform'
original_host_fn = host
try:
host = _PickleableCallable(new_platform)
spack.config.CONFIG.clear_caches()
yield new_platform
finally:
host = original_host_fn
spack.config.CONFIG.clear_caches()