Compare commits
32 Commits
hs/fix/qua
...
develop-20
Author | SHA1 | Date | |
---|---|---|---|
![]() |
195b869e1c | ||
![]() |
393961ffd6 | ||
![]() |
392a58e9be | ||
![]() |
0e8e97a811 | ||
![]() |
43a0cbe7a2 | ||
![]() |
bb35a98079 | ||
![]() |
fa7e0e8230 | ||
![]() |
2c128751f5 | ||
![]() |
fb0493a366 | ||
![]() |
6d1b6e7087 | ||
![]() |
759518182c | ||
![]() |
7ebabfcf0e | ||
![]() |
6203ae31d2 | ||
![]() |
6b13017ded | ||
![]() |
2c51b5853f | ||
![]() |
d0cbd056a8 | ||
![]() |
e1b579a8b4 | ||
![]() |
b02dcf697d | ||
![]() |
6e046b04c7 | ||
![]() |
d196795437 | ||
![]() |
0d444fb4e7 | ||
![]() |
467e631260 | ||
![]() |
f21de698f7 | ||
![]() |
59532986be | ||
![]() |
36fd547b40 | ||
![]() |
b5f9dea6d0 | ||
![]() |
5904834295 | ||
![]() |
2da8a1d1e3 | ||
![]() |
d50eba40d9 | ||
![]() |
8d3a733b77 | ||
![]() |
dfa86dce08 | ||
![]() |
3d82e5c573 |
18
.github/workflows/build-containers.yml
vendored
18
.github/workflows/build-containers.yml
vendored
@@ -40,17 +40,17 @@ jobs:
|
||||
# 1: Platforms to build for
|
||||
# 2: Base image (e.g. ubuntu:22.04)
|
||||
dockerfile: [[amazon-linux, 'linux/amd64,linux/arm64', 'amazonlinux:2'],
|
||||
[centos-stream9, 'linux/amd64,linux/arm64,linux/ppc64le', 'centos:stream9'],
|
||||
[leap15, 'linux/amd64,linux/arm64,linux/ppc64le', 'opensuse/leap:15'],
|
||||
[ubuntu-focal, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:20.04'],
|
||||
[ubuntu-jammy, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:22.04'],
|
||||
[ubuntu-noble, 'linux/amd64,linux/arm64,linux/ppc64le', 'ubuntu:24.04'],
|
||||
[almalinux8, 'linux/amd64,linux/arm64,linux/ppc64le', 'almalinux:8'],
|
||||
[almalinux9, 'linux/amd64,linux/arm64,linux/ppc64le', 'almalinux:9'],
|
||||
[centos-stream9, 'linux/amd64,linux/arm64', 'centos:stream9'],
|
||||
[leap15, 'linux/amd64,linux/arm64', 'opensuse/leap:15'],
|
||||
[ubuntu-focal, 'linux/amd64,linux/arm64', 'ubuntu:20.04'],
|
||||
[ubuntu-jammy, 'linux/amd64,linux/arm64', 'ubuntu:22.04'],
|
||||
[ubuntu-noble, 'linux/amd64,linux/arm64', 'ubuntu:24.04'],
|
||||
[almalinux8, 'linux/amd64,linux/arm64', 'almalinux:8'],
|
||||
[almalinux9, 'linux/amd64,linux/arm64', 'almalinux:9'],
|
||||
[rockylinux8, 'linux/amd64,linux/arm64', 'rockylinux:8'],
|
||||
[rockylinux9, 'linux/amd64,linux/arm64', 'rockylinux:9'],
|
||||
[fedora39, 'linux/amd64,linux/arm64,linux/ppc64le', 'fedora:39'],
|
||||
[fedora40, 'linux/amd64,linux/arm64,linux/ppc64le', 'fedora:40']]
|
||||
[fedora39, 'linux/amd64,linux/arm64', 'fedora:39'],
|
||||
[fedora40, 'linux/amd64,linux/arm64', 'fedora:40']]
|
||||
name: Build ${{ matrix.dockerfile[0] }}
|
||||
if: github.repository == 'spack/spack'
|
||||
steps:
|
||||
|
@@ -272,9 +272,9 @@ often lists dependencies and the flags needed to locate them. The
|
||||
"environment variables" section lists environment variables that the
|
||||
build system uses to pass flags to the compiler and linker.
|
||||
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Addings flags to configure
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
Adding flags to configure
|
||||
^^^^^^^^^^^^^^^^^^^^^^^^^
|
||||
|
||||
For most of the flags you encounter, you will want a variant to
|
||||
optionally enable/disable them. You can then optionally pass these
|
||||
@@ -285,7 +285,7 @@ function like so:
|
||||
|
||||
def configure_args(self):
|
||||
args = []
|
||||
|
||||
...
|
||||
if self.spec.satisfies("+mpi"):
|
||||
args.append("--enable-mpi")
|
||||
else:
|
||||
@@ -299,7 +299,10 @@ Alternatively, you can use the :ref:`enable_or_disable <autotools_enable_or_dis
|
||||
.. code-block:: python
|
||||
|
||||
def configure_args(self):
|
||||
return [self.enable_or_disable("mpi")]
|
||||
args = []
|
||||
...
|
||||
args.extend(self.enable_or_disable("mpi"))
|
||||
return args
|
||||
|
||||
|
||||
Note that we are explicitly disabling MPI support if it is not
|
||||
@@ -344,7 +347,14 @@ typically used to enable or disable some feature within the package.
|
||||
default=False,
|
||||
description="Memchecker support for debugging [degrades performance]"
|
||||
)
|
||||
config_args.extend(self.enable_or_disable("memchecker"))
|
||||
...
|
||||
|
||||
def configure_args(self):
|
||||
args = []
|
||||
...
|
||||
args.extend(self.enable_or_disable("memchecker"))
|
||||
|
||||
return args
|
||||
|
||||
In this example, specifying the variant ``+memchecker`` will generate
|
||||
the following configuration options:
|
||||
|
@@ -361,7 +361,6 @@ and the tags associated with the class of runners to build on.
|
||||
* ``.linux_neoverse_n1``
|
||||
* ``.linux_neoverse_v1``
|
||||
* ``.linux_neoverse_v2``
|
||||
* ``.linux_power``
|
||||
* ``.linux_skylake``
|
||||
* ``.linux_x86_64``
|
||||
* ``.linux_x86_64_v4``
|
||||
|
@@ -112,6 +112,19 @@ the original but may concretize differently in the presence of different
|
||||
explicit or default configuration settings (e.g., a different version of
|
||||
Spack or for a different user account).
|
||||
|
||||
Environments created from a manifest will copy any included configs
|
||||
from relative paths inside the environment. Relative paths from
|
||||
outside the environment will cause errors, and absolute paths will be
|
||||
kept absolute. For example, if ``spack.yaml`` includes:
|
||||
|
||||
.. code-block:: yaml
|
||||
|
||||
spack:
|
||||
include: [./config.yaml]
|
||||
|
||||
then the created environment will have its own copy of the file
|
||||
``config.yaml`` copied from the location in the original environment.
|
||||
|
||||
Create an environment from a ``spack.lock`` file using:
|
||||
|
||||
.. code-block:: console
|
||||
@@ -160,7 +173,7 @@ accepts. If an environment already exists then spack will simply activate it
|
||||
and ignore the create-specific flags.
|
||||
|
||||
.. code-block:: console
|
||||
|
||||
|
||||
$ spack env activate --create -p myenv
|
||||
# ...
|
||||
# [creates if myenv does not exist yet]
|
||||
@@ -424,8 +437,8 @@ Developing Packages in a Spack Environment
|
||||
|
||||
The ``spack develop`` command allows one to develop Spack packages in
|
||||
an environment. It requires a spec containing a concrete version, and
|
||||
will configure Spack to install the package from local source.
|
||||
If a version is not provided from the command line interface then spack
|
||||
will configure Spack to install the package from local source.
|
||||
If a version is not provided from the command line interface then spack
|
||||
will automatically pick the highest version the package has defined.
|
||||
This means any infinity versions (``develop``, ``main``, ``stable``) will be
|
||||
preferred in this selection process.
|
||||
@@ -435,9 +448,9 @@ set, and Spack will ensure the package and its dependents are rebuilt
|
||||
any time the environment is installed if the package's local source
|
||||
code has been modified. Spack's native implementation to check for modifications
|
||||
is to check if ``mtime`` is newer than the installation.
|
||||
A custom check can be created by overriding the ``detect_dev_src_change`` method
|
||||
in your package class. This is particularly useful for projects using custom spack repo's
|
||||
to drive development and want to optimize performance.
|
||||
A custom check can be created by overriding the ``detect_dev_src_change`` method
|
||||
in your package class. This is particularly useful for projects using custom spack repo's
|
||||
to drive development and want to optimize performance.
|
||||
|
||||
Spack ensures that all instances of a
|
||||
developed package in the environment are concretized to match the
|
||||
@@ -453,7 +466,7 @@ Further development on ``foo`` can be tested by re-installing the environment,
|
||||
and eventually committed and pushed to the upstream git repo.
|
||||
|
||||
If the package being developed supports out-of-source builds then users can use the
|
||||
``--build_directory`` flag to control the location and name of the build directory.
|
||||
``--build_directory`` flag to control the location and name of the build directory.
|
||||
This is a shortcut to set the ``package_attributes:build_directory`` in the
|
||||
``packages`` configuration (see :ref:`assigning-package-attributes`).
|
||||
The supplied location will become the build-directory for that package in all future builds.
|
||||
|
@@ -668,7 +668,7 @@ def copy(src, dest, _permissions=False):
|
||||
_permissions (bool): for internal use only
|
||||
|
||||
Raises:
|
||||
IOError: if *src* does not match any files or directories
|
||||
OSError: if *src* does not match any files or directories
|
||||
ValueError: if *src* matches multiple files but *dest* is
|
||||
not a directory
|
||||
"""
|
||||
@@ -679,7 +679,7 @@ def copy(src, dest, _permissions=False):
|
||||
|
||||
files = glob.glob(src)
|
||||
if not files:
|
||||
raise IOError("No such file or directory: '{0}'".format(src))
|
||||
raise OSError("No such file or directory: '{0}'".format(src))
|
||||
if len(files) > 1 and not os.path.isdir(dest):
|
||||
raise ValueError(
|
||||
"'{0}' matches multiple files but '{1}' is not a directory".format(src, dest)
|
||||
@@ -710,7 +710,7 @@ def install(src, dest):
|
||||
dest (str): the destination file or directory
|
||||
|
||||
Raises:
|
||||
IOError: if *src* does not match any files or directories
|
||||
OSError: if *src* does not match any files or directories
|
||||
ValueError: if *src* matches multiple files but *dest* is
|
||||
not a directory
|
||||
"""
|
||||
@@ -748,7 +748,7 @@ def copy_tree(
|
||||
_permissions (bool): for internal use only
|
||||
|
||||
Raises:
|
||||
IOError: if *src* does not match any files or directories
|
||||
OSError: if *src* does not match any files or directories
|
||||
ValueError: if *src* is a parent directory of *dest*
|
||||
"""
|
||||
if _permissions:
|
||||
@@ -762,7 +762,7 @@ def copy_tree(
|
||||
|
||||
files = glob.glob(src)
|
||||
if not files:
|
||||
raise IOError("No such file or directory: '{0}'".format(src))
|
||||
raise OSError("No such file or directory: '{0}'".format(src))
|
||||
|
||||
# For Windows hard-links and junctions, the source path must exist to make a symlink. Add
|
||||
# all symlinks to this list while traversing the tree, then when finished, make all
|
||||
@@ -843,7 +843,7 @@ def install_tree(src, dest, symlinks=True, ignore=None):
|
||||
ignore (typing.Callable): function indicating which files to ignore
|
||||
|
||||
Raises:
|
||||
IOError: if *src* does not match any files or directories
|
||||
OSError: if *src* does not match any files or directories
|
||||
ValueError: if *src* is a parent directory of *dest*
|
||||
"""
|
||||
copy_tree(src, dest, symlinks=symlinks, ignore=ignore, _permissions=True)
|
||||
|
@@ -308,7 +308,7 @@ class LinkTree:
|
||||
|
||||
def __init__(self, source_root):
|
||||
if not os.path.exists(source_root):
|
||||
raise IOError("No such file or directory: '%s'", source_root)
|
||||
raise OSError("No such file or directory: '%s'", source_root)
|
||||
|
||||
self._root = source_root
|
||||
|
||||
|
@@ -391,7 +391,7 @@ def _poll_lock(self, op: int) -> bool:
|
||||
|
||||
return True
|
||||
|
||||
except IOError as e:
|
||||
except OSError as e:
|
||||
# EAGAIN and EACCES == locked by another process (so try again)
|
||||
if e.errno not in (errno.EAGAIN, errno.EACCES):
|
||||
raise
|
||||
|
@@ -918,7 +918,7 @@ def _writer_daemon(
|
||||
try:
|
||||
if stdin_file.read(1) == "v":
|
||||
echo = not echo
|
||||
except IOError as e:
|
||||
except OSError as e:
|
||||
# If SIGTTIN is ignored, the system gives EIO
|
||||
# to let the caller know the read failed b/c it
|
||||
# was in the bg. Ignore that too.
|
||||
@@ -1013,7 +1013,7 @@ def wrapped(*args, **kwargs):
|
||||
while True:
|
||||
try:
|
||||
return function(*args, **kwargs)
|
||||
except IOError as e:
|
||||
except OSError as e:
|
||||
if e.errno == errno.EINTR:
|
||||
continue
|
||||
raise
|
||||
|
@@ -459,8 +459,16 @@ def cmake(
|
||||
"""Runs ``cmake`` in the build directory"""
|
||||
|
||||
# skip cmake phase if it is an incremental develop build
|
||||
# These are the files that will re-run CMake that are generated from a successful
|
||||
# configure step
|
||||
primary_generator = _extract_primary_generator(self.generator)
|
||||
if primary_generator == "Unix Makefiles":
|
||||
configure_artifact = "Makefile"
|
||||
elif primary_generator == "Ninja":
|
||||
configure_artifact = "ninja.build"
|
||||
|
||||
if spec.is_develop and os.path.isfile(
|
||||
os.path.join(self.build_directory, "CMakeCache.txt")
|
||||
os.path.join(self.build_directory, configure_artifact)
|
||||
):
|
||||
return
|
||||
|
||||
|
@@ -110,10 +110,7 @@ def external_find(args):
|
||||
# Note that KeyboardInterrupt does not subclass Exception
|
||||
# (so CTRL-C will terminate the program as expected).
|
||||
skip_msg = "Skipping manifest and continuing with other external checks"
|
||||
if (isinstance(e, IOError) or isinstance(e, OSError)) and e.errno in [
|
||||
errno.EPERM,
|
||||
errno.EACCES,
|
||||
]:
|
||||
if isinstance(e, OSError) and e.errno in (errno.EPERM, errno.EACCES):
|
||||
# The manifest file does not have sufficient permissions enabled:
|
||||
# print a warning and keep going
|
||||
tty.warn("Unable to read manifest due to insufficient permissions.", skip_msg)
|
||||
|
@@ -177,16 +177,15 @@ def test_run(args):
|
||||
matching = spack.store.STORE.db.query_local(spec, hashes=hashes, explicit=explicit)
|
||||
if spec and not matching:
|
||||
tty.warn("No {0}installed packages match spec {1}".format(explicit_str, spec))
|
||||
"""
|
||||
TODO: Need to write out a log message and/or CDASH Testing
|
||||
output that package not installed IF continue to process
|
||||
these issues here.
|
||||
|
||||
if args.log_format:
|
||||
# Proceed with the spec assuming the test process
|
||||
# to ensure report package as skipped (e.g., for CI)
|
||||
specs_to_test.append(spec)
|
||||
"""
|
||||
# TODO: Need to write out a log message and/or CDASH Testing
|
||||
# output that package not installed IF continue to process
|
||||
# these issues here.
|
||||
|
||||
# if args.log_format:
|
||||
# # Proceed with the spec assuming the test process
|
||||
# # to ensure report package as skipped (e.g., for CI)
|
||||
# specs_to_test.append(spec)
|
||||
|
||||
specs_to_test.extend(matching)
|
||||
|
||||
|
@@ -581,7 +581,7 @@ def _error_on_nonempty_view_dir(new_root):
|
||||
# Check if the target path lexists
|
||||
try:
|
||||
st = os.lstat(new_root)
|
||||
except (IOError, OSError):
|
||||
except OSError:
|
||||
return
|
||||
|
||||
# Empty directories are fine
|
||||
@@ -861,7 +861,7 @@ def regenerate(self, concrete_roots: List[Spec]) -> None:
|
||||
):
|
||||
try:
|
||||
shutil.rmtree(old_root)
|
||||
except (IOError, OSError) as e:
|
||||
except OSError as e:
|
||||
msg = "Failed to remove old view at %s\n" % old_root
|
||||
msg += str(e)
|
||||
tty.warn(msg)
|
||||
@@ -2554,7 +2554,7 @@ def is_latest_format(manifest):
|
||||
try:
|
||||
with open(manifest, encoding="utf-8") as f:
|
||||
data = syaml.load(f)
|
||||
except (OSError, IOError):
|
||||
except OSError:
|
||||
return True
|
||||
top_level_key = _top_level_key(data)
|
||||
changed = spack.schema.env.update(data[top_level_key])
|
||||
@@ -2634,6 +2634,32 @@ def _ensure_env_dir():
|
||||
|
||||
shutil.copy(envfile, target_manifest)
|
||||
|
||||
# Copy relative path includes that live inside the environment dir
|
||||
try:
|
||||
manifest = EnvironmentManifestFile(environment_dir)
|
||||
except Exception:
|
||||
# error handling for bad manifests is handled on other code paths
|
||||
return
|
||||
|
||||
includes = manifest[TOP_LEVEL_KEY].get("include", [])
|
||||
for include in includes:
|
||||
if os.path.isabs(include):
|
||||
continue
|
||||
|
||||
abspath = pathlib.Path(os.path.normpath(environment_dir / include))
|
||||
common_path = pathlib.Path(os.path.commonpath([environment_dir, abspath]))
|
||||
if common_path != environment_dir:
|
||||
tty.debug(f"Will not copy relative include from outside environment: {include}")
|
||||
continue
|
||||
|
||||
orig_abspath = os.path.normpath(envfile.parent / include)
|
||||
if not os.path.exists(orig_abspath):
|
||||
tty.warn(f"Included file does not exist; will not copy: '{include}'")
|
||||
continue
|
||||
|
||||
fs.touchp(abspath)
|
||||
shutil.copy(orig_abspath, abspath)
|
||||
|
||||
|
||||
class EnvironmentManifestFile(collections.abc.Mapping):
|
||||
"""Manages the in-memory representation of a manifest file, and its synchronization
|
||||
|
@@ -187,7 +187,7 @@ def path_for_extension(target_name: str, *, paths: List[str]) -> str:
|
||||
if name == target_name:
|
||||
return path
|
||||
else:
|
||||
raise IOError('extension "{0}" not found'.format(target_name))
|
||||
raise OSError('extension "{0}" not found'.format(target_name))
|
||||
|
||||
|
||||
def get_module(cmd_name):
|
||||
|
@@ -427,7 +427,7 @@ def needs_file(spec, file):
|
||||
try:
|
||||
with open(manifest_file, "r", encoding="utf-8") as f:
|
||||
manifest = s_json.load(f)
|
||||
except (OSError, IOError):
|
||||
except OSError:
|
||||
# if we can't load it, assume it doesn't know about the file.
|
||||
manifest = {}
|
||||
return test_path in manifest
|
||||
@@ -831,7 +831,7 @@ def get_spec_from_file(filename):
|
||||
try:
|
||||
with open(filename, "r", encoding="utf-8") as f:
|
||||
return spack.spec.Spec.from_yaml(f)
|
||||
except IOError:
|
||||
except OSError:
|
||||
return None
|
||||
|
||||
|
||||
|
@@ -26,7 +26,7 @@ def is_shared_library_elf(filepath):
|
||||
with open(filepath, "rb") as f:
|
||||
elf = parse_elf(f, interpreter=True, dynamic_section=True)
|
||||
return elf.has_pt_dynamic and (elf.has_soname or not elf.has_pt_interp)
|
||||
except (IOError, OSError, ElfParsingError):
|
||||
except (OSError, ElfParsingError):
|
||||
return False
|
||||
|
||||
|
||||
|
@@ -166,7 +166,7 @@ def filter_shebangs_in_directory(directory, filenames=None):
|
||||
# Only look at executable, non-symlink files.
|
||||
try:
|
||||
st = os.lstat(path)
|
||||
except (IOError, OSError):
|
||||
except OSError:
|
||||
continue
|
||||
|
||||
if stat.S_ISLNK(st.st_mode) or stat.S_ISDIR(st.st_mode) or not st.st_mode & is_exe:
|
||||
|
@@ -163,7 +163,7 @@ def format_help_sections(self, level):
|
||||
# lazily add all commands to the parser when needed.
|
||||
add_all_commands(self)
|
||||
|
||||
"""Print help on subcommands in neatly formatted sections."""
|
||||
# Print help on subcommands in neatly formatted sections.
|
||||
formatter = self._get_formatter()
|
||||
|
||||
# Create a list of subcommand actions. Argparse internals are nasty!
|
||||
|
@@ -383,6 +383,7 @@ def create_opener():
|
||||
"""Create an opener that can handle OCI authentication."""
|
||||
opener = urllib.request.OpenerDirector()
|
||||
for handler in [
|
||||
urllib.request.ProxyHandler(),
|
||||
urllib.request.UnknownHandler(),
|
||||
urllib.request.HTTPSHandler(context=spack.util.web.ssl_create_default_context()),
|
||||
spack.util.web.SpackHTTPDefaultErrorHandler(),
|
||||
|
@@ -13,6 +13,17 @@
|
||||
# import most common types used in packages
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
|
||||
class tty:
|
||||
import llnl.util.tty as _tty
|
||||
|
||||
debug = _tty.debug
|
||||
error = _tty.error
|
||||
info = _tty.info
|
||||
msg = _tty.msg
|
||||
warn = _tty.warn
|
||||
|
||||
|
||||
from llnl.util.filesystem import (
|
||||
FileFilter,
|
||||
FileList,
|
||||
@@ -49,7 +60,6 @@
|
||||
)
|
||||
from llnl.util.symlink import symlink
|
||||
|
||||
# These props will be overridden when the build env is set up.
|
||||
from spack.build_environment import MakeExecutable
|
||||
from spack.build_systems.aspell_dict import AspellDictPackage
|
||||
from spack.build_systems.autotools import AutotoolsPackage
|
||||
@@ -136,8 +146,10 @@
|
||||
)
|
||||
from spack.phase_callbacks import run_after, run_before
|
||||
from spack.spec import Spec
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
from spack.util.executable import Executable, ProcessError, which, which_string
|
||||
from spack.util.filesystem import fix_darwin_install_name
|
||||
from spack.util.prefix import Prefix
|
||||
from spack.variant import any_combination_of, auto_or_any_combination_of, disjoint_sets
|
||||
from spack.version import Version, ver
|
||||
|
||||
|
@@ -66,10 +66,6 @@
|
||||
]
|
||||
FLAG_HANDLER_TYPE = Callable[[str, Iterable[str]], FLAG_HANDLER_RETURN_TYPE]
|
||||
|
||||
"""Allowed URL schemes for spack packages."""
|
||||
_ALLOWED_URL_SCHEMES = ["http", "https", "ftp", "file", "git"]
|
||||
|
||||
|
||||
#: Filename for the Spack build/install log.
|
||||
_spack_build_logfile = "spack-build-out.txt"
|
||||
|
||||
|
@@ -6,7 +6,7 @@
|
||||
import os
|
||||
import pathlib
|
||||
import sys
|
||||
from typing import Any, Dict, Optional, Set, Tuple, Type, Union
|
||||
from typing import Any, Dict, Optional, Tuple, Type, Union
|
||||
|
||||
import llnl.util.filesystem
|
||||
from llnl.url import allowed_archive
|
||||
@@ -503,38 +503,36 @@ def patch_for_package(self, sha256: str, pkg: "spack.package_base.PackageBase")
|
||||
patch_dict["sha256"] = sha256
|
||||
return from_dict(patch_dict, repository=self.repository)
|
||||
|
||||
def update_packages(self, pkgs_fullname: Set[str]) -> None:
|
||||
def update_package(self, pkg_fullname: str) -> None:
|
||||
"""Update the patch cache.
|
||||
|
||||
Args:
|
||||
pkg_fullname: package to update.
|
||||
"""
|
||||
# remove this package from any patch entries that reference it.
|
||||
if self.index:
|
||||
empty = []
|
||||
for sha256, package_to_patch in self.index.items():
|
||||
remove = []
|
||||
for fullname, patch_dict in package_to_patch.items():
|
||||
if patch_dict["owner"] in pkgs_fullname:
|
||||
remove.append(fullname)
|
||||
empty = []
|
||||
for sha256, package_to_patch in self.index.items():
|
||||
remove = []
|
||||
for fullname, patch_dict in package_to_patch.items():
|
||||
if patch_dict["owner"] == pkg_fullname:
|
||||
remove.append(fullname)
|
||||
|
||||
for fullname in remove:
|
||||
package_to_patch.pop(fullname)
|
||||
for fullname in remove:
|
||||
package_to_patch.pop(fullname)
|
||||
|
||||
if not package_to_patch:
|
||||
empty.append(sha256)
|
||||
if not package_to_patch:
|
||||
empty.append(sha256)
|
||||
|
||||
# remove any entries that are now empty
|
||||
for sha256 in empty:
|
||||
del self.index[sha256]
|
||||
# remove any entries that are now empty
|
||||
for sha256 in empty:
|
||||
del self.index[sha256]
|
||||
|
||||
# update the index with per-package patch indexes
|
||||
for pkg_fullname in pkgs_fullname:
|
||||
pkg_cls = self.repository.get_pkg_class(pkg_fullname)
|
||||
partial_index = self._index_patches(pkg_cls, self.repository)
|
||||
for sha256, package_to_patch in partial_index.items():
|
||||
p2p = self.index.setdefault(sha256, {})
|
||||
p2p.update(package_to_patch)
|
||||
pkg_cls = self.repository.get_pkg_class(pkg_fullname)
|
||||
partial_index = self._index_patches(pkg_cls, self.repository)
|
||||
for sha256, package_to_patch in partial_index.items():
|
||||
p2p = self.index.setdefault(sha256, {})
|
||||
p2p.update(package_to_patch)
|
||||
|
||||
def update(self, other: "PatchCache") -> None:
|
||||
"""Update this cache with the contents of another.
|
||||
|
@@ -2,7 +2,7 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
"""Classes and functions to manage providers of virtual dependencies"""
|
||||
from typing import Dict, Iterable, List, Optional, Set, Union
|
||||
from typing import Dict, List, Optional, Set
|
||||
|
||||
import spack.error
|
||||
import spack.spec
|
||||
@@ -26,7 +26,7 @@ class _IndexBase:
|
||||
#: Calling providers_for(spec) will find specs that provide a
|
||||
#: matching implementation of MPI. Derived class need to construct
|
||||
#: this attribute according to the semantics above.
|
||||
providers: Dict[str, Dict["spack.spec.Spec", Set["spack.spec.Spec"]]]
|
||||
providers: Dict[str, Dict[str, Set[str]]]
|
||||
|
||||
def providers_for(self, virtual_spec):
|
||||
"""Return a list of specs of all packages that provide virtual
|
||||
@@ -99,56 +99,66 @@ def __init__(
|
||||
self.repository = repository
|
||||
self.restrict = restrict
|
||||
self.providers = {}
|
||||
if specs:
|
||||
self.update_packages(specs)
|
||||
|
||||
def update_packages(self, specs: Iterable[Union[str, "spack.spec.Spec"]]):
|
||||
specs = specs or []
|
||||
for spec in specs:
|
||||
if not isinstance(spec, spack.spec.Spec):
|
||||
spec = spack.spec.Spec(spec)
|
||||
|
||||
if self.repository.is_virtual_safe(spec.name):
|
||||
continue
|
||||
|
||||
self.update(spec)
|
||||
|
||||
def update(self, spec):
|
||||
"""Update the provider index with additional virtual specs.
|
||||
|
||||
Args:
|
||||
spec: spec potentially providing additional virtual specs
|
||||
"""
|
||||
for spec in specs:
|
||||
if not isinstance(spec, spack.spec.Spec):
|
||||
spec = spack.spec.Spec(spec)
|
||||
if not isinstance(spec, spack.spec.Spec):
|
||||
spec = spack.spec.Spec(spec)
|
||||
|
||||
if not spec.name or self.repository.is_virtual_safe(spec.name):
|
||||
# Only non-virtual packages with name can provide virtual specs.
|
||||
continue
|
||||
if not spec.name:
|
||||
# Empty specs do not have a package
|
||||
return
|
||||
|
||||
pkg_provided = self.repository.get_pkg_class(spec.name).provided
|
||||
for provider_spec_readonly, provided_specs in pkg_provided.items():
|
||||
for provided_spec in provided_specs:
|
||||
# TODO: fix this comment.
|
||||
# We want satisfaction other than flags
|
||||
provider_spec = provider_spec_readonly.copy()
|
||||
provider_spec.compiler_flags = spec.compiler_flags.copy()
|
||||
msg = "cannot update an index passing the virtual spec '{}'".format(spec.name)
|
||||
assert not self.repository.is_virtual_safe(spec.name), msg
|
||||
|
||||
if spec.intersects(provider_spec, deps=False):
|
||||
provided_name = provided_spec.name
|
||||
pkg_provided = self.repository.get_pkg_class(spec.name).provided
|
||||
for provider_spec_readonly, provided_specs in pkg_provided.items():
|
||||
for provided_spec in provided_specs:
|
||||
# TODO: fix this comment.
|
||||
# We want satisfaction other than flags
|
||||
provider_spec = provider_spec_readonly.copy()
|
||||
provider_spec.compiler_flags = spec.compiler_flags.copy()
|
||||
|
||||
provider_map = self.providers.setdefault(provided_name, {})
|
||||
if provided_spec not in provider_map:
|
||||
provider_map[provided_spec] = set()
|
||||
if spec.intersects(provider_spec, deps=False):
|
||||
provided_name = provided_spec.name
|
||||
|
||||
if self.restrict:
|
||||
provider_set = provider_map[provided_spec]
|
||||
provider_map = self.providers.setdefault(provided_name, {})
|
||||
if provided_spec not in provider_map:
|
||||
provider_map[provided_spec] = set()
|
||||
|
||||
# If this package existed in the index before,
|
||||
# need to take the old versions out, as they're
|
||||
# now more constrained.
|
||||
old = {s for s in provider_set if s.name == spec.name}
|
||||
provider_set.difference_update(old)
|
||||
if self.restrict:
|
||||
provider_set = provider_map[provided_spec]
|
||||
|
||||
# Now add the new version.
|
||||
provider_set.add(spec)
|
||||
# If this package existed in the index before,
|
||||
# need to take the old versions out, as they're
|
||||
# now more constrained.
|
||||
old = set([s for s in provider_set if s.name == spec.name])
|
||||
provider_set.difference_update(old)
|
||||
|
||||
else:
|
||||
# Before putting the spec in the map, constrain
|
||||
# it so that it provides what was asked for.
|
||||
constrained = spec.copy()
|
||||
constrained.constrain(provider_spec)
|
||||
provider_map[provided_spec].add(constrained)
|
||||
# Now add the new version.
|
||||
provider_set.add(spec)
|
||||
|
||||
else:
|
||||
# Before putting the spec in the map, constrain
|
||||
# it so that it provides what was asked for.
|
||||
constrained = spec.copy()
|
||||
constrained.constrain(provider_spec)
|
||||
provider_map[provided_spec].add(constrained)
|
||||
|
||||
def to_json(self, stream=None):
|
||||
"""Dump a JSON representation of this object.
|
||||
@@ -183,13 +193,14 @@ def merge(self, other):
|
||||
|
||||
spdict[provided_spec] = spdict[provided_spec].union(opdict[provided_spec])
|
||||
|
||||
def remove_providers(self, pkgs_fullname: Set[str]):
|
||||
def remove_provider(self, pkg_name):
|
||||
"""Remove a provider from the ProviderIndex."""
|
||||
empty_pkg_dict = []
|
||||
for pkg, pkg_dict in self.providers.items():
|
||||
empty_pset = []
|
||||
for provided, pset in pkg_dict.items():
|
||||
pset.difference_update(pkgs_fullname)
|
||||
same_name = set(p for p in pset if p.fullname == pkg_name)
|
||||
pset.difference_update(same_name)
|
||||
|
||||
if not pset:
|
||||
empty_pset.append(provided)
|
||||
|
@@ -465,7 +465,7 @@ def read(self, stream):
|
||||
"""Read this index from a provided file object."""
|
||||
|
||||
@abc.abstractmethod
|
||||
def update(self, pkgs_fullname: Set[str]):
|
||||
def update(self, pkg_fullname):
|
||||
"""Update the index in memory with information about a package."""
|
||||
|
||||
@abc.abstractmethod
|
||||
@@ -482,8 +482,8 @@ def _create(self):
|
||||
def read(self, stream):
|
||||
self.index = spack.tag.TagIndex.from_json(stream, self.repository)
|
||||
|
||||
def update(self, pkgs_fullname: Set[str]):
|
||||
self.index.update_packages({p.split(".")[-1] for p in pkgs_fullname})
|
||||
def update(self, pkg_fullname):
|
||||
self.index.update_package(pkg_fullname.split(".")[-1])
|
||||
|
||||
def write(self, stream):
|
||||
self.index.to_json(stream)
|
||||
@@ -498,14 +498,15 @@ def _create(self):
|
||||
def read(self, stream):
|
||||
self.index = spack.provider_index.ProviderIndex.from_json(stream, self.repository)
|
||||
|
||||
def update(self, pkgs_fullname: Set[str]):
|
||||
def update(self, pkg_fullname):
|
||||
name = pkg_fullname.split(".")[-1]
|
||||
is_virtual = (
|
||||
lambda name: not self.repository.exists(name)
|
||||
or self.repository.get_pkg_class(name).virtual
|
||||
not self.repository.exists(name) or self.repository.get_pkg_class(name).virtual
|
||||
)
|
||||
non_virtual_pkgs_fullname = {p for p in pkgs_fullname if not is_virtual(p.split(".")[-1])}
|
||||
self.index.remove_providers(non_virtual_pkgs_fullname)
|
||||
self.index.update_packages(non_virtual_pkgs_fullname)
|
||||
if is_virtual:
|
||||
return
|
||||
self.index.remove_provider(pkg_fullname)
|
||||
self.index.update(pkg_fullname)
|
||||
|
||||
def write(self, stream):
|
||||
self.index.to_json(stream)
|
||||
@@ -530,8 +531,8 @@ def read(self, stream):
|
||||
def write(self, stream):
|
||||
self.index.to_json(stream)
|
||||
|
||||
def update(self, pkgs_fullname: Set[str]):
|
||||
self.index.update_packages(pkgs_fullname)
|
||||
def update(self, pkg_fullname):
|
||||
self.index.update_package(pkg_fullname)
|
||||
|
||||
|
||||
class RepoIndex:
|
||||
@@ -621,7 +622,9 @@ def _build_index(self, name: str, indexer: Indexer):
|
||||
if new_index_mtime != index_mtime:
|
||||
needs_update = self.checker.modified_since(new_index_mtime)
|
||||
|
||||
indexer.update({f"{self.namespace}.{pkg_name}" for pkg_name in needs_update})
|
||||
for pkg_name in needs_update:
|
||||
indexer.update(f"{self.namespace}.{pkg_name}")
|
||||
|
||||
indexer.write(new)
|
||||
|
||||
return indexer.index
|
||||
@@ -1038,7 +1041,7 @@ def _read_config(self) -> Dict[str, str]:
|
||||
|
||||
return yaml_data["repo"]
|
||||
|
||||
except IOError:
|
||||
except OSError:
|
||||
tty.die(f"Error reading {self.config_file} when opening {self.root}")
|
||||
|
||||
def get(self, spec: "spack.spec.Spec") -> "spack.package_base.PackageBase":
|
||||
@@ -1366,7 +1369,7 @@ def create_repo(root, namespace=None, subdir=packages_dir_name):
|
||||
if subdir != packages_dir_name:
|
||||
config.write(f" subdirectory: '{subdir}'\n")
|
||||
|
||||
except (IOError, OSError) as e:
|
||||
except OSError as e:
|
||||
# try to clean up.
|
||||
if existed:
|
||||
shutil.rmtree(config_path, ignore_errors=True)
|
||||
|
@@ -4726,7 +4726,10 @@ def __str__(self):
|
||||
bool_keys = []
|
||||
kv_keys = []
|
||||
for key in sorted_keys:
|
||||
bool_keys.append(key) if isinstance(self[key].value, bool) else kv_keys.append(key)
|
||||
if isinstance(self[key].value, bool):
|
||||
bool_keys.append(key)
|
||||
else:
|
||||
kv_keys.append(key)
|
||||
|
||||
# add spaces before and after key/value variants.
|
||||
string = io.StringIO()
|
||||
|
@@ -5,7 +5,6 @@
|
||||
import collections
|
||||
import copy
|
||||
from collections.abc import Mapping
|
||||
from typing import Set
|
||||
|
||||
import spack.error
|
||||
import spack.repo
|
||||
@@ -111,20 +110,23 @@ def merge(self, other):
|
||||
spkgs, opkgs = self.tags[tag], other.tags[tag]
|
||||
self.tags[tag] = sorted(list(set(spkgs + opkgs)))
|
||||
|
||||
def update_packages(self, pkg_names: Set[str]):
|
||||
"""Updates a package in the tag index."""
|
||||
def update_package(self, pkg_name):
|
||||
"""Updates a package in the tag index.
|
||||
|
||||
Args:
|
||||
pkg_name (str): name of the package to be removed from the index
|
||||
"""
|
||||
pkg_cls = self.repository.get_pkg_class(pkg_name)
|
||||
|
||||
# Remove the package from the list of packages, if present
|
||||
for pkg_list in self._tag_dict.values():
|
||||
if pkg_names.isdisjoint(pkg_list):
|
||||
continue
|
||||
pkg_list[:] = [pkg for pkg in pkg_list if pkg not in pkg_names]
|
||||
if pkg_name in pkg_list:
|
||||
pkg_list.remove(pkg_name)
|
||||
|
||||
# Add it again under the appropriate tags
|
||||
for pkg_name in pkg_names:
|
||||
pkg_cls = self.repository.get_pkg_class(pkg_name)
|
||||
for tag in getattr(pkg_cls, "tags", []):
|
||||
tag = tag.lower()
|
||||
self._tag_dict[tag].append(pkg_cls.name)
|
||||
for tag in getattr(pkg_cls, "tags", []):
|
||||
tag = tag.lower()
|
||||
self._tag_dict[tag].append(pkg_cls.name)
|
||||
|
||||
|
||||
class TagIndexError(spack.error.SpackError):
|
||||
|
@@ -328,16 +328,14 @@ def test_get_spec_filter_list(mutable_mock_env_path, mutable_mock_repo):
|
||||
e1.add("hypre")
|
||||
e1.concretize()
|
||||
|
||||
"""
|
||||
Concretizing the above environment results in the following graphs:
|
||||
# Concretizing the above environment results in the following graphs:
|
||||
|
||||
mpileaks -> mpich (provides mpi virtual dep of mpileaks)
|
||||
-> callpath -> dyninst -> libelf
|
||||
-> libdwarf -> libelf
|
||||
-> mpich (provides mpi dep of callpath)
|
||||
# mpileaks -> mpich (provides mpi virtual dep of mpileaks)
|
||||
# -> callpath -> dyninst -> libelf
|
||||
# -> libdwarf -> libelf
|
||||
# -> mpich (provides mpi dep of callpath)
|
||||
|
||||
hypre -> openblas-with-lapack (provides lapack and blas virtual deps of hypre)
|
||||
"""
|
||||
# hypre -> openblas-with-lapack (provides lapack and blas virtual deps of hypre)
|
||||
|
||||
touched = ["libdwarf"]
|
||||
|
||||
|
@@ -1038,6 +1038,58 @@ def test_init_from_yaml(environment_from_manifest):
|
||||
assert not e2.specs_by_hash
|
||||
|
||||
|
||||
def test_init_from_yaml_relative_includes(tmp_path):
|
||||
files = [
|
||||
"relative_copied/packages.yaml",
|
||||
"./relative_copied/compilers.yaml",
|
||||
"repos.yaml",
|
||||
"./config.yaml",
|
||||
]
|
||||
|
||||
manifest = f"""
|
||||
spack:
|
||||
specs: []
|
||||
include: {files}
|
||||
"""
|
||||
|
||||
e1_path = tmp_path / "e1"
|
||||
e1_manifest = e1_path / "spack.yaml"
|
||||
fs.mkdirp(e1_path)
|
||||
with open(e1_manifest, "w", encoding="utf-8") as f:
|
||||
f.write(manifest)
|
||||
|
||||
for f in files:
|
||||
fs.touchp(e1_path / f)
|
||||
|
||||
e2 = _env_create("test2", init_file=e1_manifest)
|
||||
|
||||
for f in files:
|
||||
assert os.path.exists(os.path.join(e2.path, f))
|
||||
|
||||
|
||||
def test_init_from_yaml_relative_includes_outside_env(tmp_path):
|
||||
files = ["../outside_env_not_copied/repos.yaml"]
|
||||
|
||||
manifest = f"""
|
||||
spack:
|
||||
specs: []
|
||||
include: {files}
|
||||
"""
|
||||
|
||||
# subdir to ensure parent of environment dir is not shared
|
||||
e1_path = tmp_path / "e1_subdir" / "e1"
|
||||
e1_manifest = e1_path / "spack.yaml"
|
||||
fs.mkdirp(e1_path)
|
||||
with open(e1_manifest, "w", encoding="utf-8") as f:
|
||||
f.write(manifest)
|
||||
|
||||
for f in files:
|
||||
fs.touchp(e1_path / f)
|
||||
|
||||
with pytest.raises(spack.config.ConfigFileError, match="Detected 1 missing include"):
|
||||
_ = _env_create("test2", init_file=e1_manifest)
|
||||
|
||||
|
||||
def test_env_view_external_prefix(tmp_path, mutable_database, mock_packages):
|
||||
fake_prefix = tmp_path / "a-prefix"
|
||||
fake_bin = fake_prefix / "bin"
|
||||
|
@@ -139,7 +139,7 @@ def test_gc_except_specific_environments(mutable_database, mutable_mock_env_path
|
||||
def test_gc_except_nonexisting_dir_env(mutable_database, mutable_mock_env_path, tmpdir):
|
||||
output = gc("-ye", tmpdir.strpath, fail_on_error=False)
|
||||
assert "No such environment" in output
|
||||
gc.returncode == 1
|
||||
assert gc.returncode == 1
|
||||
|
||||
|
||||
@pytest.mark.db
|
||||
|
@@ -26,9 +26,9 @@ def test_manpath_trailing_colon(
|
||||
else ("--sh", "export %s=%s", ";")
|
||||
)
|
||||
|
||||
"""Test that the commands generated by load add the MANPATH prefix
|
||||
inspections. Also test that Spack correctly preserves the default/existing
|
||||
manpath search path via a trailing colon"""
|
||||
# Test that the commands generated by load add the MANPATH prefix
|
||||
# inspections. Also test that Spack correctly preserves the default/existing
|
||||
# manpath search path via a trailing colon
|
||||
install("mpileaks")
|
||||
|
||||
sh_out = load(shell, "mpileaks")
|
||||
@@ -81,7 +81,9 @@ def extract_value(output, variable):
|
||||
|
||||
# Finally, do we list them in topo order?
|
||||
for i, pkg in enumerate(pkgs):
|
||||
set(s.name for s in mpileaks_spec[pkg].traverse(direction="parents")) in set(pkgs[:i])
|
||||
assert {s.name for s in mpileaks_spec[pkg].traverse(direction="parents")}.issubset(
|
||||
pkgs[: i + 1]
|
||||
)
|
||||
|
||||
# Lastly, do we keep track that mpileaks was loaded?
|
||||
assert (
|
||||
|
@@ -1,17 +1,6 @@
|
||||
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
import pathlib
|
||||
|
||||
import pytest
|
||||
|
||||
import spack.concretize
|
||||
import spack.config
|
||||
import spack.environment as ev
|
||||
import spack.paths
|
||||
import spack.repo
|
||||
import spack.spec
|
||||
import spack.util.spack_yaml as syaml
|
||||
|
||||
"""
|
||||
These tests include the following package DAGs:
|
||||
@@ -42,6 +31,18 @@
|
||||
y
|
||||
"""
|
||||
|
||||
import pathlib
|
||||
|
||||
import pytest
|
||||
|
||||
import spack.concretize
|
||||
import spack.config
|
||||
import spack.environment as ev
|
||||
import spack.paths
|
||||
import spack.repo
|
||||
import spack.spec
|
||||
import spack.util.spack_yaml as syaml
|
||||
|
||||
|
||||
@pytest.fixture
|
||||
def test_repo(mutable_config, monkeypatch, mock_stage):
|
||||
|
@@ -458,7 +458,7 @@ def test_log_install_without_build_files(install_mockery):
|
||||
spec = spack.concretize.concretize_one("trivial-install-test-package")
|
||||
|
||||
# Attempt installing log without the build log file
|
||||
with pytest.raises(IOError, match="No such file or directory"):
|
||||
with pytest.raises(OSError, match="No such file or directory"):
|
||||
spack.installer.log(spec.package)
|
||||
|
||||
|
||||
|
@@ -470,7 +470,7 @@ def _repoerr(repo, name):
|
||||
|
||||
# The call to install_tree will raise the exception since not mocking
|
||||
# creation of dependency package files within *install* directories.
|
||||
with pytest.raises(IOError, match=path if sys.platform != "win32" else ""):
|
||||
with pytest.raises(OSError, match=path if sys.platform != "win32" else ""):
|
||||
inst.dump_packages(spec, path)
|
||||
|
||||
# Now try the error path, which requires the mock directory structure
|
||||
|
@@ -82,7 +82,7 @@ def test_non_existing_src(self, stage):
|
||||
"""Test using a non-existing source."""
|
||||
|
||||
with fs.working_dir(str(stage)):
|
||||
with pytest.raises(IOError, match="No such file or directory"):
|
||||
with pytest.raises(OSError, match="No such file or directory"):
|
||||
fs.copy("source/none", "dest")
|
||||
|
||||
def test_multiple_src_file_dest(self, stage):
|
||||
@@ -139,7 +139,7 @@ def test_non_existing_src(self, stage):
|
||||
"""Test using a non-existing source."""
|
||||
|
||||
with fs.working_dir(str(stage)):
|
||||
with pytest.raises(IOError, match="No such file or directory"):
|
||||
with pytest.raises(OSError, match="No such file or directory"):
|
||||
fs.install("source/none", "dest")
|
||||
|
||||
def test_multiple_src_file_dest(self, stage):
|
||||
@@ -220,7 +220,7 @@ def test_non_existing_src(self, stage):
|
||||
"""Test using a non-existing source."""
|
||||
|
||||
with fs.working_dir(str(stage)):
|
||||
with pytest.raises(IOError, match="No such file or directory"):
|
||||
with pytest.raises(OSError, match="No such file or directory"):
|
||||
fs.copy_tree("source/none", "dest")
|
||||
|
||||
def test_parent_dir(self, stage):
|
||||
@@ -301,7 +301,7 @@ def test_non_existing_src(self, stage):
|
||||
"""Test using a non-existing source."""
|
||||
|
||||
with fs.working_dir(str(stage)):
|
||||
with pytest.raises(IOError, match="No such file or directory"):
|
||||
with pytest.raises(OSError, match="No such file or directory"):
|
||||
fs.install_tree("source/none", "dest")
|
||||
|
||||
def test_parent_dir(self, stage):
|
||||
|
@@ -93,28 +93,26 @@
|
||||
pass
|
||||
|
||||
|
||||
"""This is a list of filesystem locations to test locks in. Paths are
|
||||
expanded so that %u is replaced with the current username. '~' is also
|
||||
legal and will be expanded to the user's home directory.
|
||||
|
||||
Tests are skipped for directories that don't exist, so you'll need to
|
||||
update this with the locations of NFS, Lustre, and other mounts on your
|
||||
system.
|
||||
"""
|
||||
#: This is a list of filesystem locations to test locks in. Paths are
|
||||
#: expanded so that %u is replaced with the current username. '~' is also
|
||||
#: legal and will be expanded to the user's home directory.
|
||||
#:
|
||||
#: Tests are skipped for directories that don't exist, so you'll need to
|
||||
#: update this with the locations of NFS, Lustre, and other mounts on your
|
||||
#: system.
|
||||
locations = [
|
||||
tempfile.gettempdir(),
|
||||
os.path.join("/nfs/tmp2/", getpass.getuser()),
|
||||
os.path.join("/p/lscratch*/", getpass.getuser()),
|
||||
]
|
||||
|
||||
"""This is the longest a failed multiproc test will take.
|
||||
Barriers will time out and raise an exception after this interval.
|
||||
In MPI mode, barriers don't time out (they hang). See mpi_multiproc_test.
|
||||
"""
|
||||
#: This is the longest a failed multiproc test will take.
|
||||
#: Barriers will time out and raise an exception after this interval.
|
||||
#: In MPI mode, barriers don't time out (they hang). See mpi_multiproc_test.
|
||||
barrier_timeout = 5
|
||||
|
||||
"""This is the lock timeout for expected failures.
|
||||
This may need to be higher for some filesystems."""
|
||||
#: This is the lock timeout for expected failures.
|
||||
#: This may need to be higher for some filesystems.
|
||||
lock_fail_timeout = 0.1
|
||||
|
||||
|
||||
@@ -286,9 +284,8 @@ def wait(self):
|
||||
comm.Barrier() # barrier after each MPI test.
|
||||
|
||||
|
||||
"""``multiproc_test()`` should be called by tests below.
|
||||
``multiproc_test()`` will work for either MPI runs or for local runs.
|
||||
"""
|
||||
#: ``multiproc_test()`` should be called by tests below.
|
||||
#: ``multiproc_test()`` will work for either MPI runs or for local runs.
|
||||
multiproc_test = mpi_multiproc_test if mpi else local_multiproc_test
|
||||
|
||||
|
||||
@@ -1339,7 +1336,7 @@ def test_poll_lock_exception(tmpdir, monkeypatch, err_num, err_msg):
|
||||
"""Test poll lock exception handling."""
|
||||
|
||||
def _lockf(fd, cmd, len, start, whence):
|
||||
raise IOError(err_num, err_msg)
|
||||
raise OSError(err_num, err_msg)
|
||||
|
||||
with tmpdir.as_cwd():
|
||||
lockfile = "lockfile"
|
||||
@@ -1351,7 +1348,7 @@ def _lockf(fd, cmd, len, start, whence):
|
||||
if err_num in [errno.EAGAIN, errno.EACCES]:
|
||||
assert not lock._poll_lock(fcntl.LOCK_EX)
|
||||
else:
|
||||
with pytest.raises(IOError, match=err_msg):
|
||||
with pytest.raises(OSError, match=err_msg):
|
||||
lock._poll_lock(fcntl.LOCK_EX)
|
||||
|
||||
monkeypatch.undo()
|
||||
|
@@ -238,10 +238,7 @@ def test_exclude(self, modulefile_content, module_configuration, host_architectu
|
||||
|
||||
assert len([x for x in content if "module load " in x]) == 1
|
||||
|
||||
# Catch "Exception" to avoid using FileNotFoundError on Python 3
|
||||
# and IOError on Python 2 or common bases like EnvironmentError
|
||||
# which are not officially documented
|
||||
with pytest.raises(Exception):
|
||||
with pytest.raises(FileNotFoundError):
|
||||
modulefile_content(f"callpath target={host_architecture_str}")
|
||||
|
||||
content = modulefile_content(f"zmpi target={host_architecture_str}")
|
||||
|
@@ -132,7 +132,8 @@ def test_reporters_extract_skipped(state):
|
||||
parts = spack.reporters.extract.extract_test_parts("fake", outputs)
|
||||
|
||||
assert len(parts) == 1
|
||||
parts[0]["completed"] == expected
|
||||
|
||||
assert parts[0]["completed"] == spack.reporters.extract.completed["skipped"]
|
||||
|
||||
|
||||
def test_reporters_skip_new():
|
||||
|
@@ -198,7 +198,7 @@ def script_dir(sbang_line):
|
||||
],
|
||||
)
|
||||
def test_shebang_interpreter_regex(shebang, interpreter):
|
||||
sbang.get_interpreter(shebang) == interpreter
|
||||
assert sbang.get_interpreter(shebang) == interpreter
|
||||
|
||||
|
||||
def test_shebang_handling(script_dir, sbang_line):
|
||||
|
@@ -428,31 +428,29 @@ def test_copy_through_spec_build_interface(self):
|
||||
c2 = s["mpileaks"]["mpileaks"].copy()
|
||||
assert c0 == c1 == c2 == s
|
||||
|
||||
"""
|
||||
Here is the graph with deptypes labeled (assume all packages have a 'dt'
|
||||
prefix). Arrows are marked with the deptypes ('b' for 'build', 'l' for
|
||||
'link', 'r' for 'run').
|
||||
# Here is the graph with deptypes labeled (assume all packages have a 'dt'
|
||||
# prefix). Arrows are marked with the deptypes ('b' for 'build', 'l' for
|
||||
# 'link', 'r' for 'run').
|
||||
|
||||
use -bl-> top
|
||||
# use -bl-> top
|
||||
|
||||
top -b-> build1
|
||||
top -bl-> link1
|
||||
top -r-> run1
|
||||
# top -b-> build1
|
||||
# top -bl-> link1
|
||||
# top -r-> run1
|
||||
|
||||
build1 -b-> build2
|
||||
build1 -bl-> link2
|
||||
build1 -r-> run2
|
||||
# build1 -b-> build2
|
||||
# build1 -bl-> link2
|
||||
# build1 -r-> run2
|
||||
|
||||
link1 -bl-> link3
|
||||
# link1 -bl-> link3
|
||||
|
||||
run1 -bl-> link5
|
||||
run1 -r-> run3
|
||||
# run1 -bl-> link5
|
||||
# run1 -r-> run3
|
||||
|
||||
link3 -b-> build2
|
||||
link3 -bl-> link4
|
||||
# link3 -b-> build2
|
||||
# link3 -bl-> link4
|
||||
|
||||
run3 -b-> build3
|
||||
"""
|
||||
# run3 -b-> build3
|
||||
|
||||
@pytest.mark.parametrize(
|
||||
"spec_str,deptypes,expected",
|
||||
|
@@ -125,7 +125,7 @@ def check_expand_archive(stage, stage_name, expected_file_list):
|
||||
|
||||
assert os.path.isfile(fn)
|
||||
with open(fn, encoding="utf-8") as _file:
|
||||
_file.read() == contents
|
||||
assert _file.read() == contents
|
||||
|
||||
|
||||
def check_fetch(stage, stage_name):
|
||||
|
@@ -154,6 +154,7 @@ def test_tag_no_tags(mock_packages):
|
||||
def test_tag_update_package(mock_packages):
|
||||
mock_index = mock_packages.tag_index
|
||||
index = spack.tag.TagIndex(repository=mock_packages)
|
||||
index.update_packages(set(spack.repo.all_package_names()))
|
||||
for name in spack.repo.all_package_names():
|
||||
index.update_package(name)
|
||||
|
||||
ensure_tags_results_equal(mock_index.tags, index.tags)
|
||||
|
@@ -20,12 +20,7 @@
|
||||
|
||||
datadir = os.path.join(spack_root, "lib", "spack", "spack", "test", "data", "compression")
|
||||
|
||||
ext_archive = {}
|
||||
[
|
||||
ext_archive.update({ext: ".".join(["Foo", ext])})
|
||||
for ext in llnl.url.ALLOWED_ARCHIVE_TYPES
|
||||
if "TAR" not in ext
|
||||
]
|
||||
ext_archive = {ext: f"Foo.{ext}" for ext in llnl.url.ALLOWED_ARCHIVE_TYPES if "TAR" not in ext}
|
||||
# Spack does not use Python native handling for tarballs or zip
|
||||
# Don't test tarballs or zip in native test
|
||||
native_archive_list = [
|
||||
|
@@ -204,13 +204,13 @@ def test_no_editor():
|
||||
def assert_exec(exe, args):
|
||||
assert False
|
||||
|
||||
with pytest.raises(EnvironmentError, match=r"No text editor found.*"):
|
||||
with pytest.raises(OSError, match=r"No text editor found.*"):
|
||||
ed.editor("/path/to/file", exec_fn=assert_exec)
|
||||
|
||||
def assert_exec(exe, args):
|
||||
return False
|
||||
|
||||
with pytest.raises(EnvironmentError, match=r"No text editor found.*"):
|
||||
with pytest.raises(OSError, match=r"No text editor found.*"):
|
||||
ed.editor("/path/to/file", exec_fn=assert_exec)
|
||||
|
||||
|
||||
@@ -220,5 +220,5 @@ def test_exec_fn_executable(editor_var, good_exe, bad_exe):
|
||||
assert ed.editor(exec_fn=ed.executable)
|
||||
|
||||
os.environ[editor_var] = bad_exe
|
||||
with pytest.raises(EnvironmentError, match=r"No text editor found.*"):
|
||||
with pytest.raises(OSError, match=r"No text editor found.*"):
|
||||
ed.editor(exec_fn=ed.executable)
|
||||
|
@@ -9,7 +9,7 @@
|
||||
defined by the EDITOR environment variable if VISUAL is not set or the
|
||||
specified editor fails (e.g. no DISPLAY for a graphical editor). If
|
||||
neither variable is set, we fall back to one of several common editors,
|
||||
raising an EnvironmentError if we are unable to find one.
|
||||
raising an OSError if we are unable to find one.
|
||||
"""
|
||||
import os
|
||||
import shlex
|
||||
@@ -141,7 +141,7 @@ def try_env_var(var):
|
||||
return True
|
||||
|
||||
# Fail if nothing could be found
|
||||
raise EnvironmentError(
|
||||
raise OSError(
|
||||
"No text editor found! Please set the VISUAL and/or EDITOR "
|
||||
"environment variable(s) to your preferred text editor."
|
||||
)
|
||||
|
@@ -46,7 +46,7 @@ def _process_ld_so_conf_queue(queue):
|
||||
try:
|
||||
with open(p, "rb") as f:
|
||||
lines = f.readlines()
|
||||
except (IOError, OSError):
|
||||
except OSError:
|
||||
continue
|
||||
|
||||
for line in lines:
|
||||
@@ -132,7 +132,7 @@ def host_dynamic_linker_search_paths():
|
||||
|
||||
if os.path.exists(possible_conf):
|
||||
conf_file = possible_conf
|
||||
except (IOError, OSError, elf_utils.ElfParsingError):
|
||||
except (OSError, elf_utils.ElfParsingError):
|
||||
pass
|
||||
|
||||
# Note: ld_so_conf doesn't error if the file does not exist.
|
||||
|
@@ -59,11 +59,6 @@ default:
|
||||
SPACK_TARGET_PLATFORM: "linux"
|
||||
SPACK_TARGET_ARCH: "aarch64"
|
||||
|
||||
.linux_power:
|
||||
variables:
|
||||
SPACK_TARGET_PLATFORM: "linux"
|
||||
SPACK_TARGET_ARCH: "ppc64le"
|
||||
|
||||
.win64-msvc2019:
|
||||
variables:
|
||||
SPACK_TARGET_PLATFORM: "win64"
|
||||
@@ -352,35 +347,6 @@ e4s-oneapi-build:
|
||||
- artifacts: True
|
||||
job: e4s-oneapi-generate
|
||||
|
||||
########################################
|
||||
# E4S on Power
|
||||
########################################
|
||||
.e4s-power-generate-tags-and-image:
|
||||
image: { "name": "ghcr.io/spack/ubuntu20.04-runner-ppc64-gcc-11.4:2023.08.01", "entrypoint": [""] }
|
||||
tags: ["spack", "public", "large", "ppc64le"]
|
||||
|
||||
.e4s-power:
|
||||
extends: [".linux_power"]
|
||||
variables:
|
||||
SPACK_CI_STACK_NAME: e4s-power
|
||||
|
||||
e4s-power-generate:
|
||||
extends: [ ".e4s-power", ".generate-x86_64", ".e4s-power-generate-tags-and-image"]
|
||||
variables:
|
||||
# Override concretization pool for metal runners
|
||||
SPACK_CONCRETIZE_JOBS: 16
|
||||
|
||||
e4s-power-build:
|
||||
extends: [ ".e4s-power", ".build" ]
|
||||
trigger:
|
||||
include:
|
||||
- artifact: jobs_scratch_dir/cloud-ci-pipeline.yml
|
||||
job: e4s-power-generate
|
||||
strategy: depend
|
||||
needs:
|
||||
- artifacts: True
|
||||
job: e4s-power-generate
|
||||
|
||||
#########################################
|
||||
# Build tests for different build-systems
|
||||
#########################################
|
||||
|
@@ -1,22 +0,0 @@
|
||||
ci:
|
||||
pipeline-gen:
|
||||
- build-job:
|
||||
tags: ["ppc64le"]
|
||||
# Power runners overrides the default script
|
||||
# - don't download make
|
||||
# - no intermediate keys
|
||||
script::
|
||||
- uname -a || true
|
||||
- grep -E 'vendor|model name' /proc/cpuinfo 2>/dev/null | sort -u || head -n10 /proc/cpuinfo 2>/dev/null || true
|
||||
- nproc
|
||||
- . "./share/spack/setup-env.sh"
|
||||
- spack --version
|
||||
- spack arch
|
||||
- cd ${SPACK_CONCRETE_ENV_DIR}
|
||||
- spack env activate --without-view .
|
||||
- if [ -n "$SPACK_BUILD_JOBS" ]; then spack config add "config:build_jobs:$SPACK_BUILD_JOBS"; fi
|
||||
- spack config add "config:install_tree:projections:${SPACK_JOB_SPEC_PKG_NAME}:'morepadding/{architecture}/{compiler.name}-{compiler.version}/{name}-{version}-{hash}'"
|
||||
- mkdir -p ${SPACK_ARTIFACTS_ROOT}/user_data
|
||||
- if [[ -r /mnt/key/e4s.gpg ]]; then spack gpg trust /mnt/key/e4s.gpg; fi
|
||||
- if [[ -r /mnt/key/spack_public_key.gpg ]]; then spack gpg trust /mnt/key/spack_public_key.gpg; fi
|
||||
- spack --color=always --backtrace ci rebuild > >(tee ${SPACK_ARTIFACTS_ROOT}/user_data/pipeline_out.txt) 2> >(tee ${SPACK_ARTIFACTS_ROOT}/user_data/pipeline_err.txt >&2)
|
@@ -1,3 +0,0 @@
|
||||
concretizer:
|
||||
targets:
|
||||
granularity: generic
|
@@ -1,271 +0,0 @@
|
||||
spack:
|
||||
view: false
|
||||
|
||||
concretizer:
|
||||
reuse: false
|
||||
unify: false
|
||||
|
||||
packages:
|
||||
all:
|
||||
require: "%gcc@9.4.0 target=ppc64le"
|
||||
compiler: [gcc@9.4.0]
|
||||
providers:
|
||||
blas: [openblas]
|
||||
mpi: [mpich]
|
||||
variants: +mpi cuda_arch=70
|
||||
binutils:
|
||||
variants: +ld +gold +headers +libiberty ~nls
|
||||
hdf5:
|
||||
variants: +fortran +hl +shared
|
||||
libfabric:
|
||||
variants: fabrics=sockets,tcp,udp,rxm
|
||||
openblas:
|
||||
variants: threads=openmp
|
||||
trilinos:
|
||||
variants: +amesos +amesos2 +anasazi +aztec +belos +boost +epetra +epetraext
|
||||
+ifpack +ifpack2 +intrepid +intrepid2 +isorropia +kokkos +ml +minitensor +muelu
|
||||
+nox +piro +phalanx +rol +rythmos +sacado +stk +shards +shylu +stokhos +stratimikos
|
||||
+teko +tempus +tpetra +trilinoscouplings +zoltan +zoltan2 +superlu-dist gotype=long_long
|
||||
xz:
|
||||
variants: +pic
|
||||
mpi:
|
||||
require: mpich
|
||||
mpich:
|
||||
require: '~wrapperrpath ~hwloc %gcc@9.4.0 target=ppc64le'
|
||||
ncurses:
|
||||
require: '@6.3 +termlib %gcc@9.4.0 target=ppc64le'
|
||||
faodel:
|
||||
require: "~tcmalloc %gcc@9.4.0 target=ppc64le"
|
||||
tbb:
|
||||
require: intel-tbb
|
||||
vtk-m:
|
||||
require: "+examples %gcc@9.4.0 target=ppc64le"
|
||||
cuda:
|
||||
require: "@11.4.4 %gcc@9.4.0 target=ppc64le"
|
||||
paraview:
|
||||
require: "+examples %gcc@9.4.0 target=ppc64le"
|
||||
|
||||
|
||||
specs:
|
||||
# CPU
|
||||
- adios
|
||||
- alquimia
|
||||
- aml
|
||||
- amrex
|
||||
- arborx
|
||||
- argobots
|
||||
- axom
|
||||
- bolt
|
||||
- boost
|
||||
- bricks
|
||||
- butterflypack
|
||||
- cabana
|
||||
- caliper
|
||||
- chai
|
||||
- chapel ~rocm ~cuda
|
||||
- charliecloud
|
||||
- conduit
|
||||
- cp2k +mpi
|
||||
- datatransferkit
|
||||
- drishti
|
||||
- dxt-explorer
|
||||
- dyninst
|
||||
- exaworks
|
||||
- fftx
|
||||
- flecsi
|
||||
- flit
|
||||
- flux-core
|
||||
- fortrilinos
|
||||
- gasnet
|
||||
- ginkgo
|
||||
- globalarrays
|
||||
- gmp
|
||||
- gotcha
|
||||
- gptune
|
||||
- gromacs +cp2k ^cp2k +mpi build_system=cmake
|
||||
- h5bench
|
||||
- hdf5-vol-async
|
||||
- hdf5-vol-cache
|
||||
- hdf5-vol-log
|
||||
- heffte +fftw
|
||||
- hpctoolkit
|
||||
- hpx networking=mpi
|
||||
- hypre
|
||||
- kokkos +openmp
|
||||
- kokkos-kernels +openmp
|
||||
- laghos
|
||||
- lammps
|
||||
- lbann
|
||||
- legion
|
||||
- libnrm
|
||||
- libquo
|
||||
- libunwind
|
||||
- loki
|
||||
- mercury
|
||||
- metall
|
||||
- mfem
|
||||
- mgard +serial +openmp +timing +unstructured ~cuda
|
||||
- mpark-variant
|
||||
- mpifileutils ~xattr
|
||||
- nccmp
|
||||
- nco
|
||||
- netlib-scalapack
|
||||
- nrm
|
||||
- nvhpc
|
||||
- nwchem
|
||||
- omega-h
|
||||
- openfoam
|
||||
- openmpi
|
||||
- openpmd-api
|
||||
- papi
|
||||
- papyrus
|
||||
- paraview ~cuda ~rocm
|
||||
- parsec ~cuda
|
||||
- pdt
|
||||
- petsc
|
||||
- plasma
|
||||
- plumed
|
||||
- precice
|
||||
- pruners-ninja
|
||||
- pumi
|
||||
- py-amrex
|
||||
- py-h5py
|
||||
- py-jupyterhub
|
||||
- py-libensemble
|
||||
- py-petsc4py
|
||||
- qthreads scheduler=distrib
|
||||
- quantum-espresso
|
||||
- raja
|
||||
- rempi
|
||||
- scr
|
||||
- slate ~cuda
|
||||
- slepc
|
||||
- stc
|
||||
- strumpack ~slate
|
||||
- sundials
|
||||
- superlu
|
||||
- superlu-dist
|
||||
- swig@4.0.2-fortran
|
||||
- sz3
|
||||
- tasmanian
|
||||
- tau +mpi +python # +syscall fails: https://github.com/spack/spack/pull/40830#issuecomment-1790799772; tau: has issue with `spack env depfile` build
|
||||
- trilinos +amesos +amesos2 +anasazi +aztec +belos +boost +epetra +epetraext +ifpack +ifpack2 +intrepid +intrepid2 +isorropia +kokkos +ml +minitensor +muelu +nox +piro +phalanx +rol +rythmos +sacado +stk +shards +shylu +stokhos +stratimikos +teko +tempus +tpetra +trilinoscouplings +zoltan +zoltan2 +superlu-dist gotype=long_long
|
||||
- turbine
|
||||
- umap
|
||||
- umpire
|
||||
- upcxx
|
||||
- wannier90
|
||||
- warpx +python
|
||||
- wps
|
||||
- wrf
|
||||
- xyce +mpi +shared +pymi +pymi_static_tpls
|
||||
# INCLUDED IN ECP DAV CPU
|
||||
- adios2
|
||||
- ascent
|
||||
- darshan-runtime
|
||||
- darshan-util
|
||||
- faodel
|
||||
- hdf5
|
||||
- libcatalyst
|
||||
- parallel-netcdf
|
||||
- py-cinemasci
|
||||
- sz
|
||||
- unifyfs
|
||||
- veloc
|
||||
# - visit # libext, libxkbfile, libxrender, libxt, silo (https://github.com/spack/spack/issues/39538), cairo
|
||||
- vtk-m
|
||||
- zfp
|
||||
# - ecp-data-vis-sdk ~cuda ~rocm +adios2 +ascent +cinema +darshan +faodel +hdf5 ~paraview +pnetcdf +sz +unifyfs +veloc ~visit +vtkm +zfp # +visit: libext, libxkbfile, libxrender, libxt, silo (https://github.com/spack/spack/issues/39538), cairo
|
||||
# --
|
||||
# - dealii # fltk: https://github.com/spack/spack/issues/38791
|
||||
# - geopm-runtime # cairo: *** No autoreconf found, please install it ***
|
||||
# - glvis # glvis: https://github.com/spack/spack/issues/42839
|
||||
# - libpressio +bitgrooming +bzip2 ~cuda ~cusz +fpzip +hdf5 +libdistributed +lua +openmp +python +sz +sz3 +unix +zfp # py-numcodecs: gcc: error: unrecognized command line option '-mno-sse2'; did you mean '-mno-isel'? gcc: error: unrecognized command line option '-mno-avx2'
|
||||
# - phist +mpi # ghost@develop: gcc-9: error: unrecognized command line option '-march=native'; did you mean '-mcpu=native'?
|
||||
# - variorum # variorum: https://github.com/spack/spack/issues/38786
|
||||
|
||||
# PYTHON PACKAGES
|
||||
- opencv +python3
|
||||
- py-jax
|
||||
- py-jupyterlab
|
||||
- py-matplotlib
|
||||
- py-mpi4py
|
||||
- py-notebook
|
||||
- py-numba
|
||||
- py-numpy
|
||||
- py-openai
|
||||
- py-pandas
|
||||
- py-plotly
|
||||
- py-pooch
|
||||
- py-pytest
|
||||
- py-scikit-learn
|
||||
- py-scipy
|
||||
- py-seaborn
|
||||
# - py-horovod # py-torch, py-tensorflow
|
||||
# - py-tensorflow # error
|
||||
# - py-torch # error
|
||||
|
||||
# CUDA NOARCH
|
||||
- bricks +cuda
|
||||
- cabana +cuda ^kokkos +wrapper +cuda_lambda +cuda cuda_arch=70
|
||||
- flux-core +cuda
|
||||
- hpctoolkit +cuda
|
||||
- papi +cuda
|
||||
- tau +mpi +cuda
|
||||
# --
|
||||
# - legion +cuda # legion: needs NVIDIA driver
|
||||
|
||||
# CUDA 70
|
||||
- amrex +cuda cuda_arch=70
|
||||
- arborx +cuda cuda_arch=70 ^kokkos +wrapper
|
||||
- caliper +cuda cuda_arch=70
|
||||
- chai +cuda cuda_arch=70 ^umpire ~shared
|
||||
- ecp-data-vis-sdk ~rocm +adios2 ~ascent +hdf5 +vtkm +zfp ~paraview +cuda cuda_arch=70
|
||||
- exago +mpi +python +raja +hiop ~rocm +cuda cuda_arch=70 ~ipopt ^hiop@1.0.0 ~sparse +mpi +raja ~rocm +cuda cuda_arch=70 #^raja@0.14.0
|
||||
- flecsi +cuda cuda_arch=70
|
||||
- ginkgo +cuda cuda_arch=70
|
||||
- gromacs +cuda cuda_arch=70
|
||||
- heffte +cuda cuda_arch=70
|
||||
- hpx +cuda cuda_arch=70
|
||||
- hypre +cuda cuda_arch=70
|
||||
- kokkos +wrapper +cuda cuda_arch=70
|
||||
- kokkos-kernels +cuda cuda_arch=70 ^kokkos +wrapper +cuda cuda_arch=70
|
||||
- magma +cuda cuda_arch=70
|
||||
- mfem +cuda cuda_arch=70
|
||||
- mgard +serial +openmp +timing +unstructured +cuda cuda_arch=70
|
||||
- omega-h +cuda cuda_arch=70
|
||||
- parsec +cuda cuda_arch=70
|
||||
- petsc +cuda cuda_arch=70
|
||||
- raja +cuda cuda_arch=70
|
||||
- slate +cuda cuda_arch=70
|
||||
- slepc +cuda cuda_arch=70
|
||||
- strumpack ~slate +cuda cuda_arch=70
|
||||
- sundials +cuda cuda_arch=70
|
||||
- superlu-dist +cuda cuda_arch=70
|
||||
- tasmanian +cuda cuda_arch=70
|
||||
- umpire ~shared +cuda cuda_arch=70
|
||||
# INCLUDED IN ECP DAV CUDA
|
||||
- adios2 +cuda cuda_arch=70
|
||||
# - ascent +cuda cuda_arch=70 # ascent: https://github.com/spack/spack/issues/38045
|
||||
- paraview +cuda cuda_arch=70
|
||||
- vtk-m +cuda cuda_arch=70
|
||||
- zfp +cuda cuda_arch=70
|
||||
# --
|
||||
# - axom +cuda cuda_arch=70 # axom: https://github.com/spack/spack/issues/29520
|
||||
# - cp2k +mpi +cuda cuda_arch=70 # dbcsr
|
||||
# - cusz +cuda cuda_arch=70 # cusz: https://github.com/spack/spack/issues/38787
|
||||
# - dealii +cuda cuda_arch=70 # fltk: https://github.com/spack/spack/issues/38791
|
||||
# - lammps +cuda cuda_arch=70 # lammps: needs NVIDIA driver
|
||||
# - lbann +cuda cuda_arch=70 # lbann: https://github.com/spack/spack/issues/38788
|
||||
# - libpressio +bitgrooming +bzip2 +fpzip +hdf5 +libdistributed +lua +openmp +python +sz +sz3 +unix +zfp +json +remote +netcdf +cusz +mgard +cuda cuda_arch=70 ^cusz +cuda cuda_arch=70 # depends_on("cuda@11.7.1:", when="+cuda")
|
||||
# - py-torch +cuda cuda_arch=70 # skipped
|
||||
# - trilinos +cuda cuda_arch=70 # trilinos: https://github.com/trilinos/Trilinos/issues/11630
|
||||
# - upcxx +cuda cuda_arch=70 # upcxx: needs NVIDIA driver
|
||||
|
||||
ci:
|
||||
pipeline-gen:
|
||||
- build-job:
|
||||
image: ghcr.io/spack/ubuntu20.04-runner-ppc64-gcc-11.4:2023.08.01
|
||||
|
||||
cdash:
|
||||
build-group: E4S Power
|
@@ -100,10 +100,8 @@ def install(self, spec, prefix):
|
||||
for ext in exts:
|
||||
glob_str = os.path.join(pth, ext)
|
||||
files = glob.glob(glob_str)
|
||||
[
|
||||
for x in files:
|
||||
shutil.copy(
|
||||
os.path.join(self._7z_src_dir, x),
|
||||
os.path.join(prefix, os.path.basename(x)),
|
||||
)
|
||||
for x in files
|
||||
]
|
||||
|
@@ -179,7 +179,7 @@ def configure_args(self):
|
||||
if spec.satisfies("@:8"):
|
||||
oapp("--with-dft-flavor=atompaw+libxc")
|
||||
else:
|
||||
"--without-wannier90",
|
||||
oapp("--without-wannier90")
|
||||
|
||||
if spec.satisfies("+mpi"):
|
||||
oapp(f"CC={spec['mpi'].mpicc}")
|
||||
|
@@ -5,11 +5,8 @@
|
||||
import inspect
|
||||
import os
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
import spack.pkg.builtin.openfoam as openfoam
|
||||
from spack.package import *
|
||||
from spack.version import Version
|
||||
|
||||
|
||||
class Additivefoam(Package):
|
||||
|
@@ -202,8 +202,8 @@ def configure_args(self):
|
||||
args.append("--enable-void-return-complex")
|
||||
|
||||
if spec.satisfies("@3.0:3.1 %aocc"):
|
||||
"""To enabled Fortran to C calling convention for
|
||||
complex types when compiling with aocc flang"""
|
||||
# To enable Fortran to C calling convention for complex types when compiling with
|
||||
# aocc flang
|
||||
args.append("--enable-f2c-dotc")
|
||||
|
||||
if spec.satisfies("@3.0.1: +ilp64"):
|
||||
|
@@ -6,7 +6,6 @@
|
||||
from os.path import split
|
||||
|
||||
from spack.package import *
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
|
||||
class Anaconda3(Package):
|
||||
|
@@ -2,7 +2,6 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
from llnl.util import tty
|
||||
|
||||
from spack.package import *
|
||||
from spack.pkg.builtin.llvm import LlvmDetection
|
||||
|
@@ -5,7 +5,6 @@
|
||||
import os
|
||||
|
||||
from spack.package import *
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
|
||||
class AoclDa(CMakePackage):
|
||||
|
@@ -6,8 +6,6 @@
|
||||
import os
|
||||
import socket
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.build_systems.cmake import CMakeBuilder
|
||||
from spack.package import *
|
||||
|
||||
|
@@ -3,8 +3,6 @@
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
from spack.util.environment import set_env
|
||||
|
||||
|
@@ -9,8 +9,6 @@
|
||||
import sys
|
||||
from os import environ as env
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
|
@@ -5,8 +5,6 @@
|
||||
import glob
|
||||
import os
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
from spack.pkg.builtin.boost import Boost
|
||||
|
||||
|
@@ -160,8 +160,11 @@ class Binutils(AutotoolsPackage, GNUMirrorPackage):
|
||||
|
||||
with when("platform=darwin"):
|
||||
conflicts("+gold", msg="Binutils cannot build linkers on macOS")
|
||||
# 2.41 doesn't seem to have any problems.
|
||||
conflicts(
|
||||
"libs=shared", when="@2.37:2.40", msg="https://github.com/spack/spack/issues/35817"
|
||||
"libs=shared",
|
||||
when="@2.37:2.40,2.42:",
|
||||
msg="https://github.com/spack/spack/issues/35817",
|
||||
)
|
||||
|
||||
conflicts(
|
||||
|
@@ -4,8 +4,6 @@
|
||||
|
||||
import os
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
from spack.package_test import compare_output
|
||||
from spack.pkg.builtin.boost import Boost
|
||||
|
@@ -19,6 +19,11 @@ class Cdo(AutotoolsPackage):
|
||||
|
||||
maintainers("skosukhin", "Try2Code")
|
||||
|
||||
version(
|
||||
"2.5.0",
|
||||
sha256="e865c05c1b52fd76b80e33421554db81b38b75210820bdc40e8690f4552f68e2",
|
||||
url="https://code.mpimet.mpg.de/attachments/download/29786/cdo-2.5.0.tar.gz",
|
||||
)
|
||||
version(
|
||||
"2.4.4",
|
||||
sha256="49f50bd18dacd585e9518cfd4f55548f692426edfb3b27ddcd1c653eab53d063",
|
||||
|
@@ -396,7 +396,7 @@ def install(self, spec, prefix):
|
||||
copy(filepath, tmppath)
|
||||
os.remove(filepath)
|
||||
os.rename(tmppath, filepath)
|
||||
except (IOError, OSError):
|
||||
except OSError:
|
||||
pass
|
||||
|
||||
tmp_path = join_path(builddir, "tmp")
|
||||
|
@@ -8,7 +8,6 @@
|
||||
import spack.user_environment
|
||||
from spack.package import *
|
||||
from spack.pkg.builtin.clingo import Clingo
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
|
||||
class ClingoBootstrap(Clingo):
|
||||
|
@@ -30,11 +30,13 @@ class Cmake(Package):
|
||||
license("BSD-3-Clause")
|
||||
|
||||
version("master", branch="master")
|
||||
version("3.31.5", sha256="66fb53a145648be56b46fa9e8ccade3a4d0dfc92e401e52ce76bdad1fea43d27")
|
||||
version("3.31.4", sha256="a6130bfe75f5ba5c73e672e34359f7c0a1931521957e8393a5c2922c8b0f7f25")
|
||||
version("3.31.3", sha256="fac45bc6d410b49b3113ab866074888d6c9e9dc81a141874446eb239ac38cb87")
|
||||
version("3.31.2", sha256="42abb3f48f37dbd739cdfeb19d3712db0c5935ed5c2aef6c340f9ae9114238a2")
|
||||
version("3.31.1", sha256="c4fc2a9bd0cd5f899ccb2fb81ec422e175090bc0de5d90e906dd453b53065719")
|
||||
version("3.31.0", sha256="300b71db6d69dcc1ab7c5aae61cbc1aa2778a3e00cbd918bc720203e311468c3")
|
||||
version("3.30.7", sha256="470e44d9c7caa3bd869ef953071b84f565b5d378d0a9eccbbbcd72031f21b9de")
|
||||
version("3.30.6", sha256="a7aa25cdd8545156fe0fec95ebbd53cb2b5173a8717e227f6e8a755185c168cf")
|
||||
version("3.30.5", sha256="9f55e1a40508f2f29b7e065fa08c29f82c402fa0402da839fffe64a25755a86d")
|
||||
version("3.30.4", sha256="c759c97274f1e7aaaafcb1f0d261f9de9bf3a5d6ecb7e2df616324a46fe704b2")
|
||||
|
@@ -3,7 +3,6 @@
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
from spack.package import *
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
|
||||
class Conda4aarch64(Package):
|
||||
|
@@ -8,8 +8,6 @@
|
||||
import socket
|
||||
from os import environ as env
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
|
@@ -38,10 +38,11 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage):
|
||||
git = "https://github.com/cp2k/cp2k.git"
|
||||
list_url = "https://github.com/cp2k/cp2k/releases"
|
||||
|
||||
maintainers("dev-zero", "mtaillefumier")
|
||||
maintainers("dev-zero", "mtaillefumier", "RMeli", "abussy")
|
||||
|
||||
license("GPL-2.0-or-later")
|
||||
|
||||
version("2025.1", sha256="65c8ad5488897b0f995919b9fa77f2aba4b61677ba1e3c19bb093d5c08a8ce1d")
|
||||
version("2024.3", sha256="a6eeee773b6b1fb417def576e4049a89a08a0ed5feffcd7f0b33c7d7b48f19ba")
|
||||
version("2024.2", sha256="cc3e56c971dee9e89b705a1103765aba57bf41ad39a11c89d3de04c8b8cdf473")
|
||||
version("2024.1", sha256="a7abf149a278dfd5283dc592a2c4ae803b37d040df25d62a5e35af5c4557668f")
|
||||
@@ -115,7 +116,9 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage):
|
||||
)
|
||||
variant("pytorch", default=False, description="Enable libtorch support")
|
||||
variant("quip", default=False, description="Enable quip support")
|
||||
variant("dftd4", when="@2024.2:", default=False, description="Enable DFT-D4 support")
|
||||
variant("mpi_f08", default=False, description="Use MPI F08 module")
|
||||
variant("smeagol", default=False, description="Enable libsmeagol support", when="@2025.2:")
|
||||
|
||||
variant(
|
||||
"enable_regtests",
|
||||
@@ -260,6 +263,8 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage):
|
||||
depends_on("plumed+mpi", when="+mpi")
|
||||
depends_on("plumed~mpi", when="~mpi")
|
||||
|
||||
depends_on("libsmeagol", when="+smeagol")
|
||||
|
||||
# while we link statically against PEXSI, its own deps may be linked in
|
||||
# dynamically, therefore can't set this as pure build-type dependency.
|
||||
depends_on("pexsi+fortran@0.10.0:", when="+pexsi")
|
||||
@@ -290,6 +295,8 @@ class Cp2k(MakefilePackage, CMakePackage, CudaPackage, ROCmPackage):
|
||||
|
||||
depends_on("spglib", when="+spglib")
|
||||
|
||||
depends_on("dftd4@3.6.0: build_system=cmake", when="+dftd4")
|
||||
|
||||
with when("build_system=cmake"):
|
||||
depends_on("cmake@3.22:", type="build")
|
||||
|
||||
@@ -621,6 +628,18 @@ def edit(self, pkg, spec, prefix):
|
||||
ldflags += [spglib.search_flags]
|
||||
libs.append(spglib.ld_flags)
|
||||
|
||||
if spec.satisfies("+dftd4"):
|
||||
cppflags += ["-D__DFTD4"]
|
||||
dftd4 = spec["dftd4"].libs
|
||||
ldflags += [dftd4.search_flags]
|
||||
libs.append(dftd4.ld_flags)
|
||||
|
||||
if spec.satisfies("+smeagol"):
|
||||
cppflags += ["-D__SMEAGOL"]
|
||||
smeagol = spec["libsmeagol"].libs
|
||||
ldflags += [smeagol.search_flags]
|
||||
libs.append(smeagol.ld_flags)
|
||||
|
||||
cc = spack_cc if "~mpi" in spec else spec["mpi"].mpicc
|
||||
cxx = spack_cxx if "~mpi" in spec else spec["mpi"].mpicxx
|
||||
fc = spack_fc if "~mpi" in spec else spec["mpi"].mpifc
|
||||
@@ -763,8 +782,8 @@ def edit(self, pkg, spec, prefix):
|
||||
"Point environment variable LIBSMM_PATH to "
|
||||
"the absolute path of the libsmm.a file"
|
||||
)
|
||||
except IOError:
|
||||
raise IOError(
|
||||
except OSError:
|
||||
raise OSError(
|
||||
"The file LIBSMM_PATH pointed to does not "
|
||||
"exist. Note that it must be absolute path."
|
||||
)
|
||||
@@ -994,7 +1013,9 @@ def cmake_args(self):
|
||||
self.define_from_variant("CP2K_USE_VORI", "libvori"),
|
||||
self.define_from_variant("CP2K_USE_SPLA", "spla"),
|
||||
self.define_from_variant("CP2K_USE_QUIP", "quip"),
|
||||
self.define_from_variant("CP2K_USE_DFTD4", "dftd4"),
|
||||
self.define_from_variant("CP2K_USE_MPI_F08", "mpi_f08"),
|
||||
self.define_from_variant("CP2K_USE_LIBSMEAGOL", "smeagol"),
|
||||
]
|
||||
|
||||
# we force the use elpa openmp threading support. might need to be revisited though
|
||||
|
@@ -7,8 +7,6 @@
|
||||
import re
|
||||
from glob import glob
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
|
||||
# FIXME Remove hack for polymorphic versions
|
||||
@@ -741,7 +739,7 @@ def install(self, spec, prefix):
|
||||
os.remove("/tmp/cuda-installer.log")
|
||||
except OSError:
|
||||
if spec.satisfies("@10.1:"):
|
||||
tty.die(
|
||||
raise InstallError(
|
||||
"The cuda installer will segfault due to the "
|
||||
"presence of /tmp/cuda-installer.log "
|
||||
"please remove the file and try again "
|
||||
|
@@ -5,8 +5,6 @@
|
||||
import os
|
||||
import socket
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.build_systems.cmake import CMakeBuilder
|
||||
from spack.package import *
|
||||
|
||||
|
@@ -63,8 +63,9 @@ class Dyninst(CMakePackage):
|
||||
|
||||
variant("stat_dysect", default=False, description="Patch for STAT's DySectAPI")
|
||||
|
||||
boost_libs = "+atomic+chrono+date_time+filesystem+system+thread+timer"
|
||||
"+container+random+exception"
|
||||
boost_libs = (
|
||||
"+atomic+chrono+date_time+filesystem+system+thread+timer+container+random+exception"
|
||||
)
|
||||
|
||||
depends_on("boost@1.61.0:" + boost_libs, when="@10.1.0:")
|
||||
depends_on("boost@1.61.0:1.69" + boost_libs, when="@:10.0")
|
||||
|
@@ -150,7 +150,7 @@ def cmake_args(self):
|
||||
),
|
||||
"-DCUSTOM_BLAS_SUFFIX:BOOL=TRUE",
|
||||
]
|
||||
),
|
||||
)
|
||||
if spec.satisfies("+scalapack"):
|
||||
args.extend(
|
||||
[
|
||||
@@ -159,7 +159,7 @@ def cmake_args(self):
|
||||
),
|
||||
"-DCUSTOM_LAPACK_SUFFIX:BOOL=TRUE",
|
||||
]
|
||||
),
|
||||
)
|
||||
else:
|
||||
math_libs = spec["lapack"].libs + spec["blas"].libs
|
||||
|
||||
|
@@ -80,7 +80,7 @@ def cmake_args(self):
|
||||
avx512_suffix = ""
|
||||
if spec.satisfies("@:3.12"):
|
||||
avx512_suffix = "SKX"
|
||||
args.append(self.define("EMBREE_ISA_AVX512" + avx512_suffix, True)),
|
||||
args.append(self.define("EMBREE_ISA_AVX512" + avx512_suffix, True))
|
||||
if spec.satisfies("%gcc@:7"):
|
||||
# remove unsupported -mprefer-vector-width=256, otherwise copied
|
||||
# from common/cmake/gnu.cmake
|
||||
|
@@ -41,7 +41,7 @@ def makefile_name(self):
|
||||
elif self.spec.satisfies("platform=linux target=x86_64:"):
|
||||
name = "Makefile.linux64_sse2"
|
||||
else:
|
||||
tty.die(
|
||||
raise InstallError(
|
||||
"""Unsupported platform/target, must be
|
||||
Darwin (assumes 64-bit)
|
||||
Linux x86_64
|
||||
|
@@ -118,12 +118,7 @@ def cmake_args(self):
|
||||
args.append("-DBUILD_SHARED_LIBS=ON")
|
||||
|
||||
if spec.satisfies("+pic"):
|
||||
args.extend(
|
||||
[
|
||||
"-DCMAKE_C_FLAGS={0}".format(self.compiler.cc_pic_flag),
|
||||
"-DCMAKE_CXX_FLAGS={0}".format(self.compiler.cxx_pic_flag),
|
||||
]
|
||||
)
|
||||
args.append(self.define("CMAKE_POSITION_INDEPENDENT_CODE", True))
|
||||
|
||||
args.append("-DCMAKE_CXX_STANDARD={0}".format(spec.variants["cxxstd"].value))
|
||||
# Require standard at configure time to guarantee the
|
||||
|
@@ -32,8 +32,6 @@
|
||||
import os
|
||||
import re
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
from spack.pkg.builtin.openfoam import (
|
||||
OpenfoamArch,
|
||||
@@ -41,7 +39,6 @@
|
||||
rewrite_environ_files,
|
||||
write_environ,
|
||||
)
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
|
||||
class FoamExtend(Package):
|
||||
@@ -173,7 +170,7 @@ def setup_run_environment(self, env):
|
||||
if minimal:
|
||||
# pre-build or minimal environment
|
||||
tty.info("foam-extend minimal env {0}".format(self.prefix))
|
||||
env.set("FOAM_INST_DIR", os.path.dirname(self.projectdir)),
|
||||
env.set("FOAM_INST_DIR", os.path.dirname(self.projectdir))
|
||||
env.set("FOAM_PROJECT_DIR", self.projectdir)
|
||||
env.set("WM_PROJECT_DIR", self.projectdir)
|
||||
for d in ["wmake", self.archbin]: # bin added automatically
|
||||
|
@@ -2,7 +2,6 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
@@ -6,7 +6,6 @@
|
||||
import os
|
||||
|
||||
from spack.package import *
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
|
||||
class Freesurfer(Package):
|
||||
|
@@ -7,7 +7,6 @@
|
||||
|
||||
import spack.util.environment
|
||||
from spack.package import *
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
|
||||
class Fsl(Package, CudaPackage):
|
||||
|
@@ -3,8 +3,8 @@
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
import os
|
||||
import warnings
|
||||
|
||||
import spack.main
|
||||
from spack.package import *
|
||||
|
||||
|
||||
@@ -147,7 +147,7 @@ def install(self, spec, prefix):
|
||||
git = which("git")
|
||||
git("describe", "--long", "--always", output="version.git")
|
||||
except ProcessError:
|
||||
spack.main.send_warning_to_tty("Omitting version stamp due to git error")
|
||||
warnings.warn("Omitting version stamp due to git error")
|
||||
|
||||
# The GASNet-EX library has a highly multi-dimensional configure space,
|
||||
# to accomodate the varying behavioral requirements of each client runtime.
|
||||
|
@@ -5,8 +5,6 @@
|
||||
|
||||
import os
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
import spack.tengine
|
||||
from spack.package import *
|
||||
|
||||
|
@@ -8,8 +8,6 @@
|
||||
|
||||
from macholib import MachO, mach_o
|
||||
|
||||
from llnl.util import tty
|
||||
|
||||
from spack.package import *
|
||||
from spack.util.elf import delete_needed_from_elf, parse_elf
|
||||
|
||||
|
@@ -7,7 +7,6 @@
|
||||
|
||||
import archspec.cpu
|
||||
|
||||
import llnl.util.tty as tty
|
||||
from llnl.util.symlink import readlink
|
||||
|
||||
import spack.compiler
|
||||
@@ -801,11 +800,6 @@ def configure_args(self):
|
||||
"--with-as=" + binutils.join("as"),
|
||||
]
|
||||
)
|
||||
elif spec.satisfies("%apple-clang@15:"):
|
||||
# https://github.com/iains/gcc-darwin-arm64/issues/117
|
||||
# https://github.com/iains/gcc-12-branch/issues/22
|
||||
# https://github.com/iains/gcc-13-branch/issues/8
|
||||
options.append("--with-ld=/Library/Developer/CommandLineTools/usr/bin/ld-classic")
|
||||
|
||||
# enable_bootstrap
|
||||
if spec.satisfies("+bootstrap"):
|
||||
|
@@ -3,7 +3,6 @@
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
|
||||
import spack.config
|
||||
from spack.package import *
|
||||
|
||||
|
||||
@@ -64,7 +63,7 @@ def install(self, spec, prefix):
|
||||
def build_args(self, spec, prefix):
|
||||
args = []
|
||||
args.append("build/ALL/gem5.opt")
|
||||
args.append(f"-j{spack.config.determine_number_of_jobs(parallel=True)}")
|
||||
args.append(f"-j{determine_number_of_jobs(parallel=True)}")
|
||||
args.append("--ignore-style")
|
||||
|
||||
return args
|
||||
|
@@ -6,7 +6,6 @@
|
||||
import os
|
||||
|
||||
from spack.package import *
|
||||
from spack.version import Version
|
||||
|
||||
|
||||
class Genie(Package):
|
||||
|
@@ -4,8 +4,6 @@
|
||||
|
||||
import os
|
||||
|
||||
import llnl.util.filesystem as fs
|
||||
|
||||
import spack.build_systems.cmake
|
||||
from spack.package import *
|
||||
|
||||
@@ -660,7 +658,7 @@ def build_test_binaries(self):
|
||||
not be intended with ``--test``.
|
||||
"""
|
||||
if self.pkg.run_tests:
|
||||
with fs.working_dir(self.build_directory):
|
||||
with working_dir(self.build_directory):
|
||||
make("tests")
|
||||
|
||||
def check(self):
|
||||
@@ -669,7 +667,7 @@ def check(self):
|
||||
Override the standard CMakeBuilder behavior. GROMACS has both `test`
|
||||
and `check` targets, but we are only interested in the latter.
|
||||
"""
|
||||
with fs.working_dir(self.build_directory):
|
||||
with working_dir(self.build_directory):
|
||||
if self.generator == "Unix Makefiles":
|
||||
make("check")
|
||||
elif self.generator == "Ninja":
|
||||
|
@@ -53,7 +53,7 @@ def patch(self):
|
||||
def setup_run_environment(self, env):
|
||||
env.set("GUROBI_HOME", self.prefix)
|
||||
env.set("GRB_LICENSE_FILE", join_path(self.prefix, "gurobi.lic"))
|
||||
env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib),
|
||||
env.prepend_path("LD_LIBRARY_PATH", self.prefix.lib)
|
||||
|
||||
def install(self, spec, prefix):
|
||||
install_tree("linux64", prefix)
|
||||
|
@@ -74,8 +74,8 @@ def setup_build_tests(self):
|
||||
filter_file("mpirun", f"{launcher}", filename)
|
||||
filter_file(r"-n 2", "-n 1 --timeout 240", filename)
|
||||
|
||||
"""Copy the example source files after the package is installed to an
|
||||
install test subdirectory for use during `spack test run`."""
|
||||
# Copy the example source files after the package is installed to an
|
||||
# install test subdirectory for use during `spack test run`.
|
||||
cache_extra_test_sources(self, ["tests", "samples"])
|
||||
|
||||
def mpi_launcher(self):
|
||||
|
@@ -8,7 +8,6 @@
|
||||
import sys
|
||||
|
||||
import llnl.util.lang
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
@@ -4,10 +4,7 @@
|
||||
|
||||
import os
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
from spack.package import *
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
|
||||
class Heasoft(AutotoolsPackage):
|
||||
|
@@ -8,7 +8,6 @@
|
||||
import spack.build_environment
|
||||
from spack.hooks.sbang import filter_shebang
|
||||
from spack.package import *
|
||||
from spack.util.prefix import Prefix
|
||||
|
||||
|
||||
class Hip(CMakePackage):
|
||||
@@ -667,12 +666,12 @@ def cmake_args(self):
|
||||
if self.spec.satisfies("@5.6.0:"):
|
||||
args.append(self.define("ROCCLR_PATH", self.stage.source_path + "/clr/rocclr"))
|
||||
args.append(self.define("AMD_OPENCL_PATH", self.stage.source_path + "/clr/opencl"))
|
||||
args.append(self.define("CLR_BUILD_HIP", True)),
|
||||
args.append(self.define("CLR_BUILD_OCL", False)),
|
||||
args.append(self.define("CLR_BUILD_HIP", True))
|
||||
args.append(self.define("CLR_BUILD_OCL", False))
|
||||
if self.spec.satisfies("@5.6:5.7"):
|
||||
args.append(self.define("HIPCC_BIN_DIR", self.stage.source_path + "/hipcc/bin")),
|
||||
args.append(self.define("HIPCC_BIN_DIR", self.stage.source_path + "/hipcc/bin"))
|
||||
if self.spec.satisfies("@6.0:"):
|
||||
args.append(self.define("HIPCC_BIN_DIR", self.spec["hipcc"].prefix.bin)),
|
||||
args.append(self.define("HIPCC_BIN_DIR", self.spec["hipcc"].prefix.bin))
|
||||
return args
|
||||
|
||||
test_src_dir_old = "samples"
|
||||
|
@@ -29,6 +29,7 @@ class Hipblaslt(CMakePackage):
|
||||
|
||||
depends_on("c", type="build")
|
||||
depends_on("cxx", type="build")
|
||||
depends_on("cmake@3.25.2:", type="build", when="@6.2.0:")
|
||||
|
||||
amdgpu_targets = ROCmPackage.amdgpu_targets
|
||||
|
||||
|
@@ -6,8 +6,6 @@
|
||||
import os
|
||||
import tempfile
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
import spack.build_systems.autotools
|
||||
import spack.build_systems.meson
|
||||
from spack.package import *
|
||||
@@ -118,6 +116,12 @@ class Hpctoolkit(AutotoolsPackage, MesonPackage):
|
||||
when="build_system=autotools",
|
||||
)
|
||||
variant("viewer", default=True, description="Include hpcviewer.")
|
||||
variant(
|
||||
"docs",
|
||||
default=False,
|
||||
description="Include extra documentation (user's manual)",
|
||||
when="@develop",
|
||||
)
|
||||
|
||||
variant(
|
||||
"python", default=False, description="Support unwinding Python source.", when="@2023.03:"
|
||||
@@ -185,6 +189,10 @@ class Hpctoolkit(AutotoolsPackage, MesonPackage):
|
||||
depends_on("zlib-api")
|
||||
depends_on("zlib+shared", when="^[virtuals=zlib-api] zlib")
|
||||
|
||||
depends_on("py-docutils", type="build", when="@develop")
|
||||
depends_on("py-sphinx", type="build", when="+docs")
|
||||
depends_on("py-myst-parser@0.19:", type="build", when="+docs")
|
||||
|
||||
depends_on("cuda", when="+cuda")
|
||||
depends_on("oneapi-level-zero", when="+level_zero")
|
||||
depends_on("oneapi-igc", when="+gtpin")
|
||||
@@ -402,6 +410,8 @@ def meson_args(self):
|
||||
spec = self.spec
|
||||
|
||||
args = [
|
||||
"-Dmanpages=enabled",
|
||||
"-Dmanual=" + ("enabled" if spec.satisfies("+docs") else "disabled"),
|
||||
"-Dhpcprof_mpi=" + ("enabled" if spec.satisfies("+mpi") else "disabled"),
|
||||
"-Dpython=" + ("enabled" if spec.satisfies("+python") else "disabled"),
|
||||
"-Dpapi=" + ("enabled" if spec.satisfies("+papi") else "disabled"),
|
||||
|
@@ -2,8 +2,6 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
import llnl.util.filesystem as fs
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
@@ -95,7 +93,7 @@ def cmake_args(self):
|
||||
|
||||
def check(self):
|
||||
if self.run_tests:
|
||||
with fs.working_dir(self.build_directory):
|
||||
with working_dir(self.build_directory):
|
||||
cmake("--build", ".", "--target", "tests")
|
||||
cmake("--build", ".", "--target", "benchmarks")
|
||||
ctest("--output-on-failure")
|
||||
|
@@ -7,7 +7,6 @@
|
||||
|
||||
from spack.build_environment import dso_suffix
|
||||
from spack.package import *
|
||||
from spack.util.environment import EnvironmentModifications
|
||||
|
||||
versions = [
|
||||
{
|
||||
|
@@ -3,8 +3,6 @@
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
import os
|
||||
|
||||
from llnl.util import tty
|
||||
|
||||
from spack.package import *
|
||||
from spack.pkg.builtin.gcc_runtime import get_elf_libraries
|
||||
|
||||
|
@@ -3,8 +3,6 @@
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
import re
|
||||
|
||||
import llnl.util.tty as tty
|
||||
|
||||
import spack.compiler
|
||||
from spack.package import *
|
||||
|
||||
|
@@ -6,7 +6,6 @@
|
||||
import re
|
||||
|
||||
from spack.package import *
|
||||
from spack.util.prefix import Prefix
|
||||
|
||||
|
||||
class Jdk(Package):
|
||||
|
@@ -6,7 +6,6 @@
|
||||
import os
|
||||
|
||||
from spack.package import *
|
||||
from spack.version import ver
|
||||
|
||||
|
||||
def get_best_target(microarch, compiler_name, compiler_version):
|
||||
|
@@ -20,6 +20,8 @@ class KokkosNvccWrapper(Package):
|
||||
|
||||
license("BSD-3-Clause")
|
||||
|
||||
version("4.5.01", sha256="e0008c89d7f03ebbe31eb3c89d40fe529b4e4072b40331ae6b9d6599f02dff44")
|
||||
version("4.5.00", sha256="7f7d8db54e5d2b0d4109ac6aa05732abd25b17d004cce5e21f56005952954e68")
|
||||
version("4.4.01", sha256="3f7096d17eaaa4004c7497ac082bf1ae3ff47b5104149e54af021a89414c3682")
|
||||
version("4.4.00", sha256="c638980cb62c34969b8c85b73e68327a2cb64f763dd33e5241f5fd437170205a")
|
||||
version("4.3.01", sha256="5998b7c732664d6b5e219ccc445cd3077f0e3968b4be480c29cd194b4f45ec70")
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user