|
|
|
@ -23,13 +23,11 @@
|
|
|
|
|
# License along with this program; if not, write to the Free Software
|
|
|
|
|
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
|
|
|
|
##############################################################################
|
|
|
|
|
import multiprocessing
|
|
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
import tempfile
|
|
|
|
|
import getpass
|
|
|
|
|
from llnl.util.filesystem import *
|
|
|
|
|
import llnl.util.tty as tty
|
|
|
|
|
import multiprocessing
|
|
|
|
|
|
|
|
|
|
from llnl.util.filesystem import ancestor
|
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# Variables describing how Spack is laid out in its prefix.
|
|
|
|
@ -38,102 +36,73 @@
|
|
|
|
|
spack_root = ancestor(__file__, 4)
|
|
|
|
|
|
|
|
|
|
# The spack script itself
|
|
|
|
|
spack_file = join_path(spack_root, "bin", "spack")
|
|
|
|
|
spack_file = os.path.join(spack_root, "bin", "spack")
|
|
|
|
|
|
|
|
|
|
# spack directory hierarchy
|
|
|
|
|
lib_path = join_path(spack_root, "lib", "spack")
|
|
|
|
|
external_path = join_path(lib_path, "external")
|
|
|
|
|
build_env_path = join_path(lib_path, "env")
|
|
|
|
|
module_path = join_path(lib_path, "spack")
|
|
|
|
|
platform_path = join_path(module_path, 'platforms')
|
|
|
|
|
compilers_path = join_path(module_path, "compilers")
|
|
|
|
|
build_systems_path = join_path(module_path, 'build_systems')
|
|
|
|
|
operating_system_path = join_path(module_path, 'operating_systems')
|
|
|
|
|
test_path = join_path(module_path, "test")
|
|
|
|
|
hooks_path = join_path(module_path, "hooks")
|
|
|
|
|
var_path = join_path(spack_root, "var", "spack")
|
|
|
|
|
stage_path = join_path(var_path, "stage")
|
|
|
|
|
repos_path = join_path(var_path, "repos")
|
|
|
|
|
share_path = join_path(spack_root, "share", "spack")
|
|
|
|
|
lib_path = os.path.join(spack_root, "lib", "spack")
|
|
|
|
|
external_path = os.path.join(lib_path, "external")
|
|
|
|
|
build_env_path = os.path.join(lib_path, "env")
|
|
|
|
|
module_path = os.path.join(lib_path, "spack")
|
|
|
|
|
platform_path = os.path.join(module_path, 'platforms')
|
|
|
|
|
compilers_path = os.path.join(module_path, "compilers")
|
|
|
|
|
build_systems_path = os.path.join(module_path, 'build_systems')
|
|
|
|
|
operating_system_path = os.path.join(module_path, 'operating_systems')
|
|
|
|
|
test_path = os.path.join(module_path, "test")
|
|
|
|
|
hooks_path = os.path.join(module_path, "hooks")
|
|
|
|
|
var_path = os.path.join(spack_root, "var", "spack")
|
|
|
|
|
stage_path = os.path.join(var_path, "stage")
|
|
|
|
|
repos_path = os.path.join(var_path, "repos")
|
|
|
|
|
share_path = os.path.join(spack_root, "share", "spack")
|
|
|
|
|
|
|
|
|
|
# Paths to built-in Spack repositories.
|
|
|
|
|
packages_path = join_path(repos_path, "builtin")
|
|
|
|
|
mock_packages_path = join_path(repos_path, "builtin.mock")
|
|
|
|
|
packages_path = os.path.join(repos_path, "builtin")
|
|
|
|
|
mock_packages_path = os.path.join(repos_path, "builtin.mock")
|
|
|
|
|
|
|
|
|
|
# User configuration location
|
|
|
|
|
user_config_path = os.path.expanduser('~/.spack')
|
|
|
|
|
|
|
|
|
|
prefix = spack_root
|
|
|
|
|
opt_path = join_path(prefix, "opt")
|
|
|
|
|
etc_path = join_path(prefix, "etc")
|
|
|
|
|
opt_path = os.path.join(prefix, "opt")
|
|
|
|
|
etc_path = os.path.join(prefix, "etc")
|
|
|
|
|
system_etc_path = '/etc'
|
|
|
|
|
|
|
|
|
|
# GPG paths.
|
|
|
|
|
gpg_keys_path = join_path(var_path, "gpg")
|
|
|
|
|
mock_gpg_data_path = join_path(var_path, "gpg.mock", "data")
|
|
|
|
|
mock_gpg_keys_path = join_path(var_path, "gpg.mock", "keys")
|
|
|
|
|
gpg_path = join_path(opt_path, "spack", "gpg")
|
|
|
|
|
gpg_keys_path = os.path.join(var_path, "gpg")
|
|
|
|
|
mock_gpg_data_path = os.path.join(var_path, "gpg.mock", "data")
|
|
|
|
|
mock_gpg_keys_path = os.path.join(var_path, "gpg.mock", "keys")
|
|
|
|
|
gpg_path = os.path.join(opt_path, "spack", "gpg")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# Initial imports (only for use in this file -- see __all__ below.)
|
|
|
|
|
# Below code imports spack packages.
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# The imports depend on paths above, or on each other, so ordering is tricky.
|
|
|
|
|
# TODO: refactor everything below to be more init order agnostic.
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# Import spack.config first, as other modules may rely on its options.
|
|
|
|
|
# TODO: Below code should not import modules other than spack.config
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# These imports depend on the paths above, or on each other
|
|
|
|
|
# Group them here so it's easy to understand the order.
|
|
|
|
|
# TODO: refactor this stuff to be more init order agnostic.
|
|
|
|
|
import spack.repository
|
|
|
|
|
import spack.error
|
|
|
|
|
import spack.config
|
|
|
|
|
import spack.fetch_strategy
|
|
|
|
|
from spack.file_cache import FileCache
|
|
|
|
|
from spack.abi import ABI
|
|
|
|
|
from spack.concretize import DefaultConcretizer
|
|
|
|
|
from spack.version import Version
|
|
|
|
|
from spack.util.path import canonicalize_path
|
|
|
|
|
from spack.package_prefs import PackageTesting
|
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# Initialize various data structures & objects at the core of Spack.
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# Version information
|
|
|
|
|
spack_version = Version("0.11.2")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Set up the default packages database.
|
|
|
|
|
try:
|
|
|
|
|
repo = spack.repository.RepoPath()
|
|
|
|
|
sys.meta_path.append(repo)
|
|
|
|
|
except spack.error.SpackError as e:
|
|
|
|
|
tty.die('while initializing Spack RepoPath:', e.message)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Tests ABI compatibility between packages
|
|
|
|
|
abi = ABI()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# This controls how things are concretized in spack.
|
|
|
|
|
# Replace it with a subclass if you want different
|
|
|
|
|
# policies.
|
|
|
|
|
concretizer = DefaultConcretizer()
|
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# config.yaml options
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# handle basic configuration first
|
|
|
|
|
_config = spack.config.get_config('config')
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Path where downloaded source code is cached
|
|
|
|
|
cache_path = canonicalize_path(
|
|
|
|
|
_config.get('source_cache', join_path(var_path, "cache")))
|
|
|
|
|
fetch_cache = spack.fetch_strategy.FsCache(cache_path)
|
|
|
|
|
_config.get('source_cache', os.path.join(var_path, "cache")))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# cache for miscellaneous stuff.
|
|
|
|
|
misc_cache_path = canonicalize_path(
|
|
|
|
|
_config.get('misc_cache', join_path(user_config_path, 'cache')))
|
|
|
|
|
misc_cache = FileCache(misc_cache_path)
|
|
|
|
|
_config.get('misc_cache', os.path.join(user_config_path, 'cache')))
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# TODO: get this out of __init__.py
|
|
|
|
|
binary_cache_retrieved_specs = set()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -141,13 +110,14 @@
|
|
|
|
|
template_dirs = spack.config.get_config('config')['template_dirs']
|
|
|
|
|
template_dirs = [canonicalize_path(x) for x in template_dirs]
|
|
|
|
|
|
|
|
|
|
# If this is enabled, tools that use SSL should not verify
|
|
|
|
|
# certifiates. e.g., curl should use the -k option.
|
|
|
|
|
|
|
|
|
|
#: If this is enabled, tools that use SSL should not verify
|
|
|
|
|
#: certifiates. e.g., curl should use the -k option.
|
|
|
|
|
insecure = not _config.get('verify_ssl', True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Whether spack should allow installation of unsafe versions of software.
|
|
|
|
|
# "Unsafe" versions are ones it doesn't have a checksum for.
|
|
|
|
|
#: Whether spack should allow installation of unsafe versions of software.
|
|
|
|
|
#: "Unsafe" versions are ones it doesn't have a checksum for.
|
|
|
|
|
do_checksum = _config.get('checksum', True)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@ -156,17 +126,57 @@
|
|
|
|
|
dirty = _config.get('dirty', False)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# The number of jobs to use when building in parallel.
|
|
|
|
|
# By default, use all cores on the machine.
|
|
|
|
|
#: The number of jobs to use when building in parallel.
|
|
|
|
|
#: By default, use all cores on the machine.
|
|
|
|
|
build_jobs = _config.get('build_jobs', multiprocessing.cpu_count())
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Needed for test dependencies
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# Initialize various data structures & objects at the core of Spack.
|
|
|
|
|
#
|
|
|
|
|
# TODO: move all of these imports out of __init__ to avoid importing the whole
|
|
|
|
|
# TODO: world on Spack startup. There are some design changes that need to be
|
|
|
|
|
# TODO: made to enable this (decoupling Spec, repo, DB, and store state).
|
|
|
|
|
#
|
|
|
|
|
# TODO: Spack probably needs some kind of object to manage this state so that
|
|
|
|
|
# TODO: this stuff doesn't have to be at module scope.
|
|
|
|
|
# -----------------------------------------------------------------------------
|
|
|
|
|
# Version information
|
|
|
|
|
from spack.version import Version
|
|
|
|
|
spack_version = Version("0.11.2")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# set up the caches after getting all config options
|
|
|
|
|
import spack.fetch_strategy
|
|
|
|
|
from spack.file_cache import FileCache
|
|
|
|
|
misc_cache = FileCache(misc_cache_path)
|
|
|
|
|
fetch_cache = spack.fetch_strategy.FsCache(cache_path)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
# Set up the default packages database.
|
|
|
|
|
import spack.error
|
|
|
|
|
try:
|
|
|
|
|
import spack.repository
|
|
|
|
|
repo = spack.repository.RepoPath()
|
|
|
|
|
sys.meta_path.append(repo)
|
|
|
|
|
except spack.error.SpackError as e:
|
|
|
|
|
import llnl.util.tty as tty
|
|
|
|
|
tty.die('while initializing Spack RepoPath:', e.message)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#: Concretizer class implements policy decisions for concretization
|
|
|
|
|
from spack.concretize import Concretizer
|
|
|
|
|
concretizer = Concretizer()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#: Needed for test dependencies
|
|
|
|
|
from spack.package_prefs import PackageTesting
|
|
|
|
|
package_testing = PackageTesting()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#-----------------------------------------------------------------------------
|
|
|
|
|
# When packages call 'from spack import *', this extra stuff is brought in.
|
|
|
|
|
# When packages call 'from spack import *', we import a set of things that
|
|
|
|
|
# should be useful for builds.
|
|
|
|
|
#
|
|
|
|
|
# Spack internal code should call 'import spack' and accesses other
|
|
|
|
|
# variables (spack.repo, paths, etc.) directly.
|
|
|
|
|