Compare commits
22 Commits
hs/crypto/
...
hs/fix/cma
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
25c74506a3 | ||
|
|
e37e53cfe8 | ||
|
|
cf31d20d4c | ||
|
|
b74db341c8 | ||
|
|
e88a3f6f85 | ||
|
|
9bd7483e73 | ||
|
|
04c76fab63 | ||
|
|
ecbf9fcacf | ||
|
|
69fb594699 | ||
|
|
d28614151f | ||
|
|
f1d6af6c94 | ||
|
|
192821f361 | ||
|
|
18790ca397 | ||
|
|
c22d77a38e | ||
|
|
d82bdb3bf7 | ||
|
|
a042bdfe0b | ||
|
|
60e3e645e8 | ||
|
|
51785437bc | ||
|
|
2e8db0815d | ||
|
|
8a6428746f | ||
|
|
6b9c099af8 | ||
|
|
30814fb4e0 |
2
.github/workflows/build-containers.yml
vendored
2
.github/workflows/build-containers.yml
vendored
@@ -120,7 +120,7 @@ jobs:
|
||||
password: ${{ secrets.DOCKERHUB_TOKEN }}
|
||||
|
||||
- name: Build & Deploy ${{ matrix.dockerfile[0] }}
|
||||
uses: docker/build-push-action@4f58ea79222b3b9dc2c8bbdd6debcef730109a75
|
||||
uses: docker/build-push-action@48aba3b46d1b1fec4febb7c5d0c644b249a11355
|
||||
with:
|
||||
context: dockerfiles/${{ matrix.dockerfile[0] }}
|
||||
platforms: ${{ matrix.dockerfile[1] }}
|
||||
|
||||
@@ -24,6 +24,7 @@
|
||||
Callable,
|
||||
Deque,
|
||||
Dict,
|
||||
Generator,
|
||||
Iterable,
|
||||
List,
|
||||
Match,
|
||||
@@ -2838,6 +2839,25 @@ def temporary_dir(
|
||||
remove_directory_contents(tmp_dir)
|
||||
|
||||
|
||||
@contextmanager
|
||||
def edit_in_place_through_temporary_file(file_path: str) -> Generator[str, None, None]:
|
||||
"""Context manager for modifying ``file_path`` in place, preserving its inode and hardlinks,
|
||||
for functions or external tools that do not support in-place editing. Notice that this function
|
||||
is unsafe in that it works with paths instead of a file descriptors, but this is by design,
|
||||
since we assume the call site will create a new inode at the same path."""
|
||||
tmp_fd, tmp_path = tempfile.mkstemp(
|
||||
dir=os.path.dirname(file_path), prefix=f"{os.path.basename(file_path)}."
|
||||
)
|
||||
# windows cannot replace a file with open fds, so close since the call site needs to replace.
|
||||
os.close(tmp_fd)
|
||||
try:
|
||||
shutil.copyfile(file_path, tmp_path, follow_symlinks=True)
|
||||
yield tmp_path
|
||||
shutil.copyfile(tmp_path, file_path, follow_symlinks=True)
|
||||
finally:
|
||||
os.unlink(tmp_path)
|
||||
|
||||
|
||||
def filesummary(path, print_bytes=16) -> Tuple[int, bytes]:
|
||||
"""Create a small summary of the given file. Does not error
|
||||
when file does not exist.
|
||||
|
||||
@@ -2334,7 +2334,9 @@ def is_backup_file(file):
|
||||
if not codesign:
|
||||
return
|
||||
for binary in changed_files:
|
||||
codesign("-fs-", binary)
|
||||
# preserve the original inode by running codesign on a copy
|
||||
with fsys.edit_in_place_through_temporary_file(binary) as tmp_binary:
|
||||
codesign("-fs-", tmp_binary)
|
||||
|
||||
# If we are installing back to the same location
|
||||
# relocate the sbang location if the spack directory changed
|
||||
|
||||
@@ -9,7 +9,7 @@
|
||||
import re
|
||||
import sys
|
||||
from itertools import chain
|
||||
from typing import Any, List, Optional, Set, Tuple
|
||||
from typing import Any, List, Optional, Tuple
|
||||
|
||||
import llnl.util.filesystem as fs
|
||||
from llnl.util.lang import stable_partition
|
||||
@@ -21,6 +21,7 @@
|
||||
import spack.phase_callbacks
|
||||
import spack.spec
|
||||
import spack.util.prefix
|
||||
from spack import traverse
|
||||
from spack.directives import build_system, conflicts, depends_on, variant
|
||||
from spack.multimethod import when
|
||||
from spack.util.environment import filter_system_paths
|
||||
@@ -166,15 +167,18 @@ def _values(x):
|
||||
def get_cmake_prefix_path(pkg: spack.package_base.PackageBase) -> List[str]:
|
||||
"""Obtain the CMAKE_PREFIX_PATH entries for a package, based on the cmake_prefix_path package
|
||||
attribute of direct build/test and transitive link dependencies."""
|
||||
# Add direct build/test deps
|
||||
selected: Set[str] = {s.dag_hash() for s in pkg.spec.dependencies(deptype=dt.BUILD | dt.TEST)}
|
||||
# Add transitive link deps
|
||||
selected.update(s.dag_hash() for s in pkg.spec.traverse(root=False, deptype=dt.LINK))
|
||||
# Separate out externals so they do not shadow Spack prefixes
|
||||
externals, spack_built = stable_partition(
|
||||
(s for s in pkg.spec.traverse(root=False, order="topo") if s.dag_hash() in selected),
|
||||
lambda x: x.external,
|
||||
edges = traverse.traverse_topo_edges_generator(
|
||||
traverse.with_artificial_edges([pkg.spec]),
|
||||
visitor=traverse.MixedDepthVisitor(
|
||||
direct=dt.BUILD | dt.TEST, transitive=dt.LINK | dt.RUN, key=traverse.by_dag_hash
|
||||
),
|
||||
key=traverse.by_dag_hash,
|
||||
root=False,
|
||||
all_edges=False, # cover all nodes, not all edges
|
||||
)
|
||||
ordered_specs = [edge.spec for edge in edges]
|
||||
# Separate out externals so they do not shadow Spack prefixes
|
||||
externals, spack_built = stable_partition((s for s in ordered_specs), lambda x: x.external)
|
||||
|
||||
return filter_system_paths(
|
||||
path for spec in chain(spack_built, externals) for path in spec.package.cmake_prefix_paths
|
||||
|
||||
@@ -13,6 +13,7 @@
|
||||
import macholib.mach_o
|
||||
import macholib.MachO
|
||||
|
||||
import llnl.util.filesystem as fs
|
||||
import llnl.util.lang
|
||||
import llnl.util.tty as tty
|
||||
from llnl.util.lang import memoized
|
||||
@@ -275,10 +276,10 @@ def modify_macho_object(cur_path, rpaths, deps, idpath, paths_to_paths):
|
||||
|
||||
# Deduplicate and flatten
|
||||
args = list(itertools.chain.from_iterable(llnl.util.lang.dedupe(args)))
|
||||
install_name_tool = executable.Executable("install_name_tool")
|
||||
if args:
|
||||
args.append(str(cur_path))
|
||||
install_name_tool = executable.Executable("install_name_tool")
|
||||
install_name_tool(*args)
|
||||
with fs.edit_in_place_through_temporary_file(cur_path) as temp_path:
|
||||
install_name_tool(*args, temp_path)
|
||||
|
||||
|
||||
def macholib_get_paths(cur_path):
|
||||
@@ -717,8 +718,8 @@ def fixup_macos_rpath(root, filename):
|
||||
# No fixes needed
|
||||
return False
|
||||
|
||||
args.append(abspath)
|
||||
executable.Executable("install_name_tool")(*args)
|
||||
with fs.edit_in_place_through_temporary_file(abspath) as temp_path:
|
||||
executable.Executable("install_name_tool")(*args, temp_path)
|
||||
return True
|
||||
|
||||
|
||||
|
||||
@@ -1249,3 +1249,14 @@ def test_find_input_types(tmp_path: pathlib.Path):
|
||||
|
||||
with pytest.raises(TypeError):
|
||||
fs.find(1, "file.txt") # type: ignore
|
||||
|
||||
|
||||
def test_edit_in_place_through_temporary_file(tmp_path):
|
||||
(tmp_path / "example.txt").write_text("Hello")
|
||||
current_ino = os.stat(tmp_path / "example.txt").st_ino
|
||||
with fs.edit_in_place_through_temporary_file(tmp_path / "example.txt") as temporary:
|
||||
os.unlink(temporary)
|
||||
with open(temporary, "w") as f:
|
||||
f.write("World")
|
||||
assert (tmp_path / "example.txt").read_text() == "World"
|
||||
assert os.stat(tmp_path / "example.txt").st_ino == current_ino
|
||||
|
||||
@@ -20,9 +20,8 @@ def create_dag(nodes, edges):
|
||||
"""
|
||||
specs = {name: Spec(name) for name in nodes}
|
||||
for parent, child, deptypes in edges:
|
||||
specs[parent].add_dependency_edge(
|
||||
specs[child], depflag=dt.canonicalize(deptypes), virtuals=()
|
||||
)
|
||||
depflag = deptypes if isinstance(deptypes, dt.DepFlag) else dt.canonicalize(deptypes)
|
||||
specs[parent].add_dependency_edge(specs[child], depflag=depflag, virtuals=())
|
||||
return specs
|
||||
|
||||
|
||||
@@ -454,3 +453,61 @@ def test_topo_is_bfs_for_trees(cover):
|
||||
assert list(traverse.traverse_nodes([binary_tree["A"]], order="topo", cover=cover)) == list(
|
||||
traverse.traverse_nodes([binary_tree["A"]], order="breadth", cover=cover)
|
||||
)
|
||||
|
||||
|
||||
@pytest.mark.parametrize("roots", [["A"], ["A", "B"], ["B", "A"], ["A", "B", "A"]])
|
||||
@pytest.mark.parametrize("order", ["breadth", "post", "pre"])
|
||||
@pytest.mark.parametrize("include_root", [True, False])
|
||||
def test_mixed_depth_visitor(roots, order, include_root):
|
||||
"""Test that the MixedDepthVisitor lists unique edges that are reachable either directly from
|
||||
roots through build type edges, or transitively through link type edges. The tests ensures that
|
||||
unique edges are listed exactly once."""
|
||||
my_graph = create_dag(
|
||||
nodes=["A", "B", "C", "D", "E", "F", "G", "H", "I"],
|
||||
edges=(
|
||||
("A", "B", dt.LINK | dt.RUN),
|
||||
("A", "C", dt.BUILD),
|
||||
("A", "D", dt.BUILD | dt.RUN),
|
||||
("A", "H", dt.LINK),
|
||||
("A", "I", dt.RUN),
|
||||
("B", "D", dt.BUILD | dt.LINK),
|
||||
("C", "E", dt.BUILD | dt.LINK | dt.RUN),
|
||||
("D", "F", dt.LINK),
|
||||
("D", "G", dt.BUILD | dt.RUN),
|
||||
("H", "B", dt.LINK),
|
||||
),
|
||||
)
|
||||
starting_points = traverse.with_artificial_edges([my_graph[root] for root in roots])
|
||||
visitor = traverse.MixedDepthVisitor(direct=dt.BUILD, transitive=dt.LINK)
|
||||
|
||||
if order == "pre":
|
||||
edges = traverse.traverse_depth_first_edges_generator(
|
||||
starting_points, visitor, post_order=False, root=include_root
|
||||
)
|
||||
elif order == "post":
|
||||
edges = traverse.traverse_depth_first_edges_generator(
|
||||
starting_points, visitor, post_order=True, root=include_root
|
||||
)
|
||||
elif order == "breadth":
|
||||
edges = traverse.traverse_breadth_first_edges_generator(
|
||||
starting_points, visitor, root=include_root
|
||||
)
|
||||
|
||||
artificial_edges = [(None, root) for root in roots] if include_root else []
|
||||
simple_edges = [
|
||||
(None if edge.parent is None else edge.parent.name, edge.spec.name) for edge in edges
|
||||
]
|
||||
|
||||
# make sure that every edge is listed exactly once and that the right edges are listed
|
||||
assert len(simple_edges) == len(set(simple_edges))
|
||||
assert set(simple_edges) == {
|
||||
# the roots
|
||||
*artificial_edges,
|
||||
("A", "B"),
|
||||
("A", "C"),
|
||||
("A", "D"),
|
||||
("A", "H"),
|
||||
("B", "D"),
|
||||
("D", "F"),
|
||||
("H", "B"),
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
from collections import defaultdict
|
||||
from typing import NamedTuple, Union
|
||||
from typing import Any, Callable, List, NamedTuple, Set, Union
|
||||
|
||||
import spack.deptypes as dt
|
||||
import spack.spec
|
||||
@@ -115,6 +115,64 @@ def neighbors(self, item):
|
||||
return self.visitor.neighbors(item)
|
||||
|
||||
|
||||
class MixedDepthVisitor:
|
||||
"""Visits all unique edges of the sub-DAG induced by direct dependencies of type ``direct``
|
||||
and transitive dependencies of type ``transitive``. An example use for this is traversing build
|
||||
type dependencies non-recursively, and link dependencies recursively."""
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
*,
|
||||
direct: dt.DepFlag,
|
||||
transitive: dt.DepFlag,
|
||||
key: Callable[["spack.spec.Spec"], Any] = id,
|
||||
) -> None:
|
||||
self.direct_type = direct
|
||||
self.transitive_type = transitive
|
||||
self.key = key
|
||||
self.seen: Set[Any] = set()
|
||||
self.seen_roots: Set[Any] = set()
|
||||
|
||||
def accept(self, item: EdgeAndDepth) -> bool:
|
||||
# Do not accept duplicate root nodes. This only happens if the user starts iterating from
|
||||
# multiple roots and lists one of the roots multiple times.
|
||||
if item.edge.parent is None:
|
||||
node_id = self.key(item.edge.spec)
|
||||
if node_id in self.seen_roots:
|
||||
return False
|
||||
self.seen_roots.add(node_id)
|
||||
return True
|
||||
|
||||
def neighbors(self, item: EdgeAndDepth) -> List[EdgeAndDepth]:
|
||||
# If we're here through an artificial source node, it's a root, and we return all
|
||||
# direct_type and transitive_type edges. If we're here through a transitive_type edge, we
|
||||
# return all transitive_type edges. To avoid returning the same edge twice:
|
||||
# 1. If we had already encountered the current node through a transitive_type edge, we
|
||||
# don't need to return transitive_type edges again.
|
||||
# 2. If we encounter the current node through a direct_type edge, and we had already seen
|
||||
# it through a transitive_type edge, only return the non-transitive_type, direct_type
|
||||
# edges.
|
||||
node_id = self.key(item.edge.spec)
|
||||
seen = node_id in self.seen
|
||||
is_root = item.edge.parent is None
|
||||
follow_transitive = is_root or bool(item.edge.depflag & self.transitive_type)
|
||||
follow = self.direct_type if is_root else dt.NONE
|
||||
|
||||
if follow_transitive and not seen:
|
||||
follow |= self.transitive_type
|
||||
self.seen.add(node_id)
|
||||
elif follow == dt.NONE:
|
||||
return []
|
||||
|
||||
edges = item.edge.spec.edges_to_dependencies(depflag=follow)
|
||||
|
||||
# filter direct_type edges already followed before becuase they were also transitive_type.
|
||||
if seen:
|
||||
edges = [edge for edge in edges if not edge.depflag & self.transitive_type]
|
||||
|
||||
return sort_edges(edges)
|
||||
|
||||
|
||||
def get_visitor_from_args(
|
||||
cover, direction, depflag: Union[dt.DepFlag, dt.DepTypes], key=id, visited=None, visitor=None
|
||||
):
|
||||
@@ -342,9 +400,7 @@ def traverse_topo_edges_generator(edges, visitor, key=id, root=True, all_edges=F
|
||||
# maps parent identifier to a list of edges, where None is a special identifier
|
||||
# for the artificial root/source.
|
||||
node_to_edges = defaultdict(list)
|
||||
for edge in traverse_breadth_first_edges_generator(
|
||||
edges, CoverEdgesVisitor(visitor, key=key), root=True, depth=False
|
||||
):
|
||||
for edge in traverse_breadth_first_edges_generator(edges, visitor, root=True, depth=False):
|
||||
in_edge_count[key(edge.spec)] += 1
|
||||
parent_id = key(edge.parent) if edge.parent is not None else None
|
||||
node_to_edges[parent_id].append(edge)
|
||||
@@ -422,9 +478,9 @@ def traverse_edges(
|
||||
elif order not in ("post", "pre", "breadth"):
|
||||
raise ValueError(f"Unknown order {order}")
|
||||
|
||||
# In topo traversal we need to construct a sub-DAG including all edges even if we are yielding
|
||||
# a subset of them, hence "paths".
|
||||
_cover = "paths" if order == "topo" else cover
|
||||
# In topo traversal we need to construct a sub-DAG including all unique edges even if we are
|
||||
# yielding a subset of them, hence "edges".
|
||||
_cover = "edges" if order == "topo" else cover
|
||||
visitor = get_visitor_from_args(_cover, direction, deptype, key, visited)
|
||||
root_edges = with_artificial_edges(specs)
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
import sys
|
||||
|
||||
from llnl.util import tty
|
||||
from llnl.util.filesystem import join_path
|
||||
from llnl.util.filesystem import edit_in_place_through_temporary_file
|
||||
from llnl.util.lang import memoized
|
||||
|
||||
from spack.util.executable import Executable, which
|
||||
@@ -81,12 +81,11 @@ def fix_darwin_install_name(path):
|
||||
Parameters:
|
||||
path (str): directory in which .dylib files are located
|
||||
"""
|
||||
libs = glob.glob(join_path(path, "*.dylib"))
|
||||
libs = glob.glob(os.path.join(path, "*.dylib"))
|
||||
install_name_tool = Executable("install_name_tool")
|
||||
otool = Executable("otool")
|
||||
for lib in libs:
|
||||
# fix install name first:
|
||||
install_name_tool = Executable("install_name_tool")
|
||||
install_name_tool("-id", lib, lib)
|
||||
otool = Executable("otool")
|
||||
args = ["-id", lib]
|
||||
long_deps = otool("-L", lib, output=str).split("\n")
|
||||
deps = [dep.partition(" ")[0][1::] for dep in long_deps[2:-1]]
|
||||
# fix all dependencies:
|
||||
@@ -98,5 +97,8 @@ def fix_darwin_install_name(path):
|
||||
# but we don't know builddir (nor how symbolic links look
|
||||
# in builddir). We thus only compare the basenames.
|
||||
if os.path.basename(dep) == os.path.basename(loc):
|
||||
install_name_tool("-change", dep, loc, lib)
|
||||
args.extend(("-change", dep, loc))
|
||||
break
|
||||
|
||||
with edit_in_place_through_temporary_file(lib) as tmp:
|
||||
install_name_tool(*args, tmp)
|
||||
|
||||
@@ -3,6 +3,8 @@
|
||||
#
|
||||
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
|
||||
|
||||
import os
|
||||
|
||||
from spack.package import *
|
||||
|
||||
|
||||
@@ -126,6 +128,18 @@ class Dbcsr(CMakePackage, CudaPackage, ROCmPackage):
|
||||
generator("ninja")
|
||||
depends_on("ninja@1.10:", type="build")
|
||||
|
||||
@when("+rocm")
|
||||
def patch(self):
|
||||
for directory, subdirectory, files in os.walk(os.getcwd()):
|
||||
for i in files:
|
||||
file_path = os.path.join(directory, i)
|
||||
filter_file("USE ISO_C_BINDING", "USE,INTRINSIC :: ISO_C_BINDING", file_path)
|
||||
filter_file("USE ISO_FORTRAN_ENV", "USE,INTRINSIC :: ISO_FORTRAN_ENV", file_path)
|
||||
filter_file("USE omp_lib", "USE,INTRINSIC :: omp_lib", file_path)
|
||||
filter_file("USE OMP_LIB", "USE,INTRINSIC :: OMP_LIB", file_path)
|
||||
filter_file("USE iso_c_binding", "USE,INTRINSIC :: iso_c_binding", file_path)
|
||||
filter_file("USE iso_fortran_env", "USE,INTRINSIC :: iso_fortran_env", file_path)
|
||||
|
||||
def cmake_args(self):
|
||||
spec = self.spec
|
||||
|
||||
|
||||
@@ -22,6 +22,11 @@ class Eospac(Package):
|
||||
# previous stable release will appear first as a new beta.
|
||||
# - alpha and beta versions are marked with 'deprecated=True' to help
|
||||
# spack's version comparison.
|
||||
version(
|
||||
"6.5.12",
|
||||
sha256="62d5f4a6a30c9acb426bd6bd972edc7fad392e5b941f950126ed0d3be5fd5162",
|
||||
url="https://laws.lanl.gov/projects/data/eos/get_file.php?package=eospac&filename=eospac_v6.5.12_39364aabc75c3312022b12e6d16d6a31f1f8945f.tgz",
|
||||
)
|
||||
version(
|
||||
"6.5.11",
|
||||
sha256="ed821b5a1bf45df1443d5f72d86190317ed9f5bad6a7c73e23bb4365bd76e24c",
|
||||
|
||||
@@ -439,6 +439,11 @@ class Gcc(AutotoolsPackage, GNUMirrorPackage, CompilerPackage):
|
||||
sha256="1529cff128792fe197ede301a81b02036c8168cb0338df21e4bc7aafe755305a",
|
||||
when="@14.1.0 target=aarch64:",
|
||||
)
|
||||
patch(
|
||||
"https://raw.githubusercontent.com/Homebrew/formula-patches/f30c309442a60cfb926e780eae5d70571f8ab2cb/gcc/gcc-14.2.0-r2.diff",
|
||||
sha256="6c0a4708f35ccf2275e6401197a491e3ad77f9f0f9ef5761860768fa6da14d3d",
|
||||
when="@14.2.0 target=aarch64:",
|
||||
)
|
||||
conflicts("+bootstrap", when="@11.3.0,13.1: target=aarch64:")
|
||||
|
||||
# Use -headerpad_max_install_names in the build,
|
||||
|
||||
@@ -58,6 +58,9 @@ class Hip(CMakePackage):
|
||||
conflicts("+asan", when="os=centos7")
|
||||
conflicts("+asan", when="os=centos8")
|
||||
|
||||
depends_on("c", type="build")
|
||||
depends_on("cxx", type="build")
|
||||
|
||||
depends_on("cuda", when="+cuda")
|
||||
|
||||
depends_on("cmake@3.16.8:", type="build")
|
||||
@@ -531,12 +534,6 @@ def patch(self):
|
||||
"clr/hipamd/hip-config-amd.cmake",
|
||||
string=True,
|
||||
)
|
||||
filter_file(
|
||||
'"${ROCM_PATH}/llvm"',
|
||||
self.spec["llvm-amdgpu"].prefix,
|
||||
"clr/hipamd/src/hiprtc/CMakeLists.txt",
|
||||
string=True,
|
||||
)
|
||||
perl = self.spec["perl"].command
|
||||
|
||||
if self.spec.satisfies("@:5.5"):
|
||||
@@ -561,7 +558,12 @@ def patch(self):
|
||||
filter_file(" -lnuma", f" -L{numactl} -lnuma", "hipBin_amd.h")
|
||||
|
||||
def cmake_args(self):
|
||||
args = []
|
||||
args = [
|
||||
# find_package(Clang) and find_package(LLVM) in clr/hipamd/src/hiprtc/CMakeLists.txt
|
||||
# should find llvm-amdgpu
|
||||
self.define("LLVM_ROOT", self.spec["llvm-amdgpu"].prefix),
|
||||
self.define("Clang_ROOT", self.spec["llvm-amdgpu"].prefix),
|
||||
]
|
||||
if self.spec.satisfies("+rocm"):
|
||||
args.append(self.define("HSA_PATH", self.spec["hsa-rocr-dev"].prefix))
|
||||
args.append(self.define("HIP_COMPILER", "clang"))
|
||||
|
||||
@@ -19,7 +19,7 @@ class Hypre(AutotoolsPackage, CudaPackage, ROCmPackage):
|
||||
git = "https://github.com/hypre-space/hypre.git"
|
||||
tags = ["e4s", "radiuss"]
|
||||
|
||||
maintainers("ulrikeyang", "osborn9", "balay")
|
||||
maintainers("ulrikeyang", "osborn9", "victorapm", "balay")
|
||||
|
||||
test_requires_compiler = True
|
||||
|
||||
@@ -74,6 +74,7 @@ class Hypre(AutotoolsPackage, CudaPackage, ROCmPackage):
|
||||
variant(
|
||||
"superlu-dist", default=False, description="Activates support for SuperLU_Dist library"
|
||||
)
|
||||
variant("lapack", default=True, description="Use external blas/lapack")
|
||||
variant("int64", default=False, description="Use 64bit integers")
|
||||
variant("mixedint", default=False, description="Use 64bit integers while reducing memory use")
|
||||
variant("complex", default=False, description="Use complex values")
|
||||
@@ -123,8 +124,8 @@ def patch(self): # fix sequential compilation in 'src/seq_mv'
|
||||
filter_file("\tmake", "\t$(MAKE)", "src/seq_mv/Makefile")
|
||||
|
||||
depends_on("mpi", when="+mpi")
|
||||
depends_on("blas")
|
||||
depends_on("lapack")
|
||||
depends_on("blas", when="+lapack")
|
||||
depends_on("lapack", when="+lapack")
|
||||
depends_on("magma", when="+magma")
|
||||
depends_on("superlu-dist", when="+superlu-dist+mpi")
|
||||
depends_on("rocsparse", when="+rocm")
|
||||
@@ -198,17 +199,20 @@ def url_for_version(self, version):
|
||||
|
||||
def configure_args(self):
|
||||
spec = self.spec
|
||||
# Note: --with-(lapack|blas)_libs= needs space separated list of names
|
||||
lapack = spec["lapack"].libs
|
||||
blas = spec["blas"].libs
|
||||
configure_args = [f"--prefix={prefix}"]
|
||||
|
||||
configure_args = [
|
||||
"--prefix=%s" % prefix,
|
||||
"--with-lapack-libs=%s" % " ".join(lapack.names),
|
||||
"--with-lapack-lib-dirs=%s" % " ".join(lapack.directories),
|
||||
"--with-blas-libs=%s" % " ".join(blas.names),
|
||||
"--with-blas-lib-dirs=%s" % " ".join(blas.directories),
|
||||
]
|
||||
# Note: --with-(lapack|blas)_libs= needs space separated list of names
|
||||
if spec.satisfies("+lapack"):
|
||||
configure_args.append("--with-lapack")
|
||||
configure_args.append("--with-blas")
|
||||
configure_args.append("--with-lapack-libs=%s" % " ".join(spec["lapack"].libs.names))
|
||||
configure_args.append("--with-blas-libs=%s" % " ".join(spec["blas"].libs.names))
|
||||
configure_args.append(
|
||||
"--with-lapack-lib-dirs=%s" % " ".join(spec["lapack"].libs.directories)
|
||||
)
|
||||
configure_args.append(
|
||||
"--with-blas-lib-dirs=%s" % " ".join(spec["blas"].libs.directories)
|
||||
)
|
||||
|
||||
if spec.satisfies("+mpi"):
|
||||
os.environ["CC"] = spec["mpi"].mpicc
|
||||
@@ -245,7 +249,9 @@ def configure_args(self):
|
||||
configure_args.append("--without-superlu")
|
||||
# MLI and FEI do not build without superlu on Linux
|
||||
configure_args.append("--without-mli")
|
||||
configure_args.append("--without-fei")
|
||||
# FEI option was removed in hypre 2.17
|
||||
if self.version < Version("2.17.0"):
|
||||
configure_args.append("--without-fei")
|
||||
|
||||
if spec.satisfies("+superlu-dist"):
|
||||
configure_args.append(
|
||||
|
||||
@@ -22,6 +22,12 @@ class IntelOneapiDpl(IntelOneApiLibraryPackage):
|
||||
|
||||
homepage = "https://github.com/oneapi-src/oneDPL"
|
||||
|
||||
version(
|
||||
"2022.7.1",
|
||||
url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/de3c613f-829c-4bdc-aa2b-6129eece3bd9/intel-onedpl-2022.7.1.15_offline.sh",
|
||||
sha256="737f8d29f50fcb26abf7a39373305c177d8b91a70dbc5fed9d41aabfcc8bad5a",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2022.7.0",
|
||||
url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/85ad74ff-f4fa-45e2-b50d-67d637d42baa/intel-onedpl-2022.7.0.647_offline.sh",
|
||||
|
||||
@@ -21,6 +21,12 @@ class IntelOneapiMpi(IntelOneApiLibraryPackage):
|
||||
|
||||
homepage = "https://software.intel.com/content/www/us/en/develop/tools/oneapi/components/mpi-library.html"
|
||||
|
||||
version(
|
||||
"2021.14.1",
|
||||
url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/1acd5e79-796c-401a-ab31-a3dc7b20c6a2/intel-mpi-2021.14.1.7_offline.sh",
|
||||
sha256="6459b9fc81fad9b9955de7fd9904e67fcf2ada3564ce0a74b9c14ea8fb533ddf",
|
||||
expand=False,
|
||||
)
|
||||
version(
|
||||
"2021.14.0",
|
||||
url="https://registrationcenter-download.intel.com/akdlm/IRC_NAS/4b14b28c-2ca6-4559-a0ca-8a157627e0c8/intel-mpi-2021.14.0.791_offline.sh",
|
||||
|
||||
@@ -383,6 +383,7 @@ def cmake_args(self):
|
||||
# - MVAPICH --> mvapich
|
||||
# - HPE MPT --> mpt
|
||||
# - Cray MPICH --> mpich
|
||||
# - HPC-X --> openmpi
|
||||
|
||||
if self.spec.satisfies("^mpich"):
|
||||
args.append(self.define("MPI_STACK", "mpich"))
|
||||
@@ -398,6 +399,8 @@ def cmake_args(self):
|
||||
args.append(self.define("MPI_STACK", "mpt"))
|
||||
elif self.spec.satisfies("^cray-mpich"):
|
||||
args.append(self.define("MPI_STACK", "mpich"))
|
||||
elif self.spec.satisfies("^hpcx-mpi"):
|
||||
args.append(self.define("MPI_STACK", "openmpi"))
|
||||
else:
|
||||
raise InstallError("Unsupported MPI stack")
|
||||
|
||||
|
||||
@@ -702,8 +702,10 @@ def find_optional_library(name, prefix):
|
||||
if "+mpi" in spec:
|
||||
options += ["MPICXX=%s" % spec["mpi"].mpicxx]
|
||||
hypre = spec["hypre"]
|
||||
# The hypre package always links with 'blas' and 'lapack'.
|
||||
all_hypre_libs = hypre.libs + hypre["lapack"].libs + hypre["blas"].libs
|
||||
all_hypre_libs = hypre.libs
|
||||
if "+lapack" in hypre:
|
||||
all_hypre_libs += hypre["lapack"].libs + hypre["blas"].libs
|
||||
|
||||
hypre_gpu_libs = ""
|
||||
if "+cuda" in hypre:
|
||||
hypre_gpu_libs = " -lcusparse -lcurand -lcublas"
|
||||
|
||||
@@ -92,6 +92,8 @@ def cmake_args(self):
|
||||
or spec.satisfies("%apple-clang")
|
||||
or spec.satisfies("%oneapi")
|
||||
or spec.satisfies("%arm")
|
||||
or spec.satisfies("%cce")
|
||||
or spec.satisfies("%rocmcc")
|
||||
):
|
||||
c_flags.append("-Wno-error=implicit-function-declaration")
|
||||
|
||||
@@ -116,6 +118,8 @@ class NetlibScalapack(ScalapackBase):
|
||||
git = "https://github.com/Reference-ScaLAPACK/scalapack"
|
||||
tags = ["e4s"]
|
||||
|
||||
maintainers("etiennemlb")
|
||||
|
||||
license("BSD-3-Clause-Open-MPI")
|
||||
|
||||
version("2.2.0", sha256="40b9406c20735a9a3009d863318cb8d3e496fb073d201c5463df810e01ab2a57")
|
||||
|
||||
@@ -15,6 +15,7 @@ class Nghttp2(AutotoolsPackage):
|
||||
|
||||
license("MIT")
|
||||
|
||||
version("1.64.0", sha256="20e73f3cf9db3f05988996ac8b3a99ed529f4565ca91a49eb0550498e10621e8")
|
||||
version("1.63.0", sha256="9318a2cc00238f5dd6546212109fb833f977661321a2087f03034e25444d3dbb")
|
||||
version("1.62.1", sha256="d0b0b9d00500ee4aa3bfcac00145d3b1ef372fd301c35bff96cf019c739db1b4")
|
||||
version("1.62.0", sha256="482e41a46381d10adbdfdd44c1942ed5fd1a419e0ab6f4a5ff5b61468fe6f00d")
|
||||
|
||||
@@ -19,6 +19,7 @@ class PyJoblib(PythonPackage):
|
||||
|
||||
license("BSD-3-Clause")
|
||||
|
||||
version("1.4.2", sha256="2382c5816b2636fbd20a09e0f4e9dad4736765fdfb7dca582943b9c1366b3f0e")
|
||||
version("1.2.0", sha256="e1cee4a79e4af22881164f218d4311f60074197fb707e082e803b61f6d137018")
|
||||
version("1.1.0", sha256="4158fcecd13733f8be669be0683b96ebdbbd38d23559f54dca7205aea1bf1e35")
|
||||
version("1.0.1", sha256="9c17567692206d2f3fb9ecf5e991084254fe631665c450b443761c4186a613f7")
|
||||
@@ -35,7 +36,10 @@ class PyJoblib(PythonPackage):
|
||||
version("0.10.2", sha256="3123553bdad83b143428033537c9e1939caf4a4d8813dade6a2246948c94494b")
|
||||
version("0.10.0", sha256="49b3a0ba956eaa2f077e1ebd230b3c8d7b98afc67520207ada20a4d8b8efd071")
|
||||
|
||||
depends_on("python@3.7:", when="@1.2:", type=("build", "run"))
|
||||
depends_on("python@3.6:", when="@0.15:", type=("build", "run"))
|
||||
depends_on("python@2.7:2.8,3.4:", type=("build", "run"))
|
||||
depends_on("py-setuptools", type=("build", "run"))
|
||||
with default_args(type=("build", "run")):
|
||||
# https://github.com/joblib/joblib/pull/1361
|
||||
depends_on("python@:3.11", when="@:1.2")
|
||||
|
||||
with default_args(type="build"):
|
||||
depends_on("py-setuptools@61.2:", when="@1.4:")
|
||||
depends_on("py-setuptools")
|
||||
|
||||
@@ -23,6 +23,7 @@ class PyKeras(PythonPackage):
|
||||
maintainers("adamjstewart")
|
||||
license("Apache-2.0")
|
||||
|
||||
version("3.7.0", sha256="a4451a5591e75dfb414d0b84a3fd2fb9c0240cc87ebe7e397f547ce10b0e67b7")
|
||||
version("3.6.0", sha256="405727525a3522ed8f9ec0b46e0667e4c65fcf714a067322c16a00d902ded41d")
|
||||
version("3.5.0", sha256="53ae4f9472ec9d9c6941c82a3fda86969724ace3b7630a94ba0a1f17ba1065c3")
|
||||
version("3.4.1", sha256="34cd9aeaa008914715149234c215657ca758e1b473bd2aab2e211ac967d1f8fe")
|
||||
@@ -74,10 +75,12 @@ class PyKeras(PythonPackage):
|
||||
)
|
||||
|
||||
with default_args(type="build"):
|
||||
# pyproject.toml
|
||||
depends_on("py-setuptools@61:", when="@3.7:")
|
||||
depends_on("py-setuptools")
|
||||
|
||||
with default_args(type=("build", "run")):
|
||||
# setup.py
|
||||
# pyproject.toml
|
||||
depends_on("python@3.9:", when="@3:")
|
||||
depends_on("python@3.8:", when="@2.12:")
|
||||
depends_on("py-absl-py", when="@2.6:")
|
||||
@@ -98,7 +101,8 @@ class PyKeras(PythonPackage):
|
||||
|
||||
# requirements-tensorflow-cuda.txt
|
||||
with when("backend=tensorflow"):
|
||||
depends_on("py-tensorflow@2.17", when="@3.5:")
|
||||
depends_on("py-tensorflow@2.18", when="@3.7:")
|
||||
depends_on("py-tensorflow@2.17", when="@3.5:3.6")
|
||||
depends_on("py-tensorflow@2.16.1:2.16", when="@3.0:3.4")
|
||||
|
||||
# requirements-jax-cuda.txt
|
||||
@@ -109,13 +113,15 @@ class PyKeras(PythonPackage):
|
||||
|
||||
# requirements-torch-cuda.txt
|
||||
with when("backend=torch"):
|
||||
depends_on("py-torch@2.4.1", when="@3.6:")
|
||||
depends_on("py-torch@2.5.1", when="@3.7:")
|
||||
depends_on("py-torch@2.4.1", when="@3.6")
|
||||
depends_on("py-torch@2.4.0", when="@3.5")
|
||||
depends_on("py-torch@2.2.1", when="@3.1:3.4")
|
||||
depends_on("py-torch@2.1.2", when="@3.0.3:3.0.5")
|
||||
depends_on("py-torch@2.1.1", when="@3.0.1:3.0.2")
|
||||
depends_on("py-torch@2.1.0", when="@3.0.0")
|
||||
depends_on("py-torchvision@0.19.1", when="@3.6:")
|
||||
depends_on("py-torchvision@0.20.1", when="@3.7:")
|
||||
depends_on("py-torchvision@0.19.1", when="@3.6")
|
||||
depends_on("py-torchvision@0.19.0", when="@3.5")
|
||||
depends_on("py-torchvision@0.17.1", when="@3.1:3.4")
|
||||
depends_on("py-torchvision@0.16.2", when="@3.0.3:3.0.5")
|
||||
|
||||
@@ -73,6 +73,7 @@ class PyPandas(PythonPackage):
|
||||
variant("excel", when="@1.4:", default=False, description="Build with support for Excel")
|
||||
|
||||
depends_on("c", type="build")
|
||||
depends_on("cxx", type="build")
|
||||
|
||||
with default_args(type="build"):
|
||||
depends_on("py-meson-python@0.13.1:", when="@2.1:")
|
||||
|
||||
@@ -33,7 +33,8 @@ class PyPyvista(PythonPackage):
|
||||
depends_on("pil", type=("build", "run"))
|
||||
depends_on("py-pooch", when="@0.37:", type=("build", "run"))
|
||||
depends_on("py-scooby@0.5.1:", type=("build", "run"))
|
||||
depends_on("vtk+python", type=("build", "run"))
|
||||
# https://github.com/pyvista/pyvista/issues/6857
|
||||
depends_on("vtk@:9.3+python", type=("build", "run"))
|
||||
depends_on("py-typing-extensions", when="^python@:3.7", type=("build", "run"))
|
||||
|
||||
# Historical dependencies
|
||||
|
||||
@@ -30,3 +30,6 @@ class PyRiver(PythonPackage):
|
||||
depends_on("py-numpy@1.22:", type=("build", "run"))
|
||||
depends_on("py-scipy@1.5:", type=("build", "run"))
|
||||
depends_on("py-pandas@1.3:", type=("build", "run"))
|
||||
|
||||
# https://github.com/online-ml/river/pull/1632
|
||||
depends_on("py-numpy@:1", when="@:0.21", type=("build", "run"))
|
||||
|
||||
@@ -14,6 +14,10 @@ class PyScooby(PythonPackage):
|
||||
|
||||
license("MIT")
|
||||
|
||||
version("0.10.0", sha256="7ea33c262c0cc6a33c6eeeb5648df787be4f22660e53c114e5fff1b811a8854f")
|
||||
version("0.5.7", sha256="ae2c2b6f5f5d10adf7aaab32409028f1e28d3ce833664bdd1e8c2072e8da169a")
|
||||
|
||||
# https://github.com/banesullivan/scooby/pull/83
|
||||
depends_on("python@:3.11", when="@:0.5", type=("build", "run"))
|
||||
depends_on("py-setuptools", type="build")
|
||||
depends_on("py-setuptools-scm", when="@0.10:", type="build")
|
||||
|
||||
@@ -18,7 +18,8 @@ class PyTorchCluster(PythonPackage):
|
||||
|
||||
version("1.6.3", sha256="78d5a930a5bbd0d8788df8c6d66addd68d6dd292fe3edb401e3dacba26308152")
|
||||
|
||||
depends_on("cxx", type="build") # generated
|
||||
depends_on("c", type="build")
|
||||
depends_on("cxx", type="build")
|
||||
|
||||
depends_on("python", type=("build", "link", "run"))
|
||||
depends_on("py-setuptools", type="build")
|
||||
|
||||
@@ -18,7 +18,8 @@ class PyTorchScatter(PythonPackage):
|
||||
|
||||
version("2.1.2", sha256="69b3aa435f2424ac6a1bfb6ff702da6eb73b33ca0db38fb26989c74159258e47")
|
||||
|
||||
depends_on("cxx", type="build") # generated
|
||||
depends_on("c", type="build")
|
||||
depends_on("cxx", type="build")
|
||||
|
||||
depends_on("python", type=("build", "link", "run"))
|
||||
depends_on("py-setuptools", type="build")
|
||||
|
||||
@@ -18,7 +18,8 @@ class PyTorchSplineConv(PythonPackage):
|
||||
|
||||
version("1.2.2", sha256="ed45a81da29f774665dbdd4709d7e534cdf16d2e7006dbd06957f35bd09661b2")
|
||||
|
||||
depends_on("cxx", type="build") # generated
|
||||
depends_on("c", type="build")
|
||||
depends_on("cxx", type="build")
|
||||
|
||||
depends_on("python", type=("build", "link", "run"))
|
||||
depends_on("py-setuptools", type="build")
|
||||
|
||||
@@ -17,6 +17,7 @@ class Raylib(CMakePackage):
|
||||
|
||||
license("Zlib", checked_by="georgemalerbo")
|
||||
|
||||
version("5.5", sha256="aea98ecf5bc5c5e0b789a76de0083a21a70457050ea4cc2aec7566935f5e258e")
|
||||
version("5.0", sha256="98f049b9ea2a9c40a14e4e543eeea1a7ec3090ebdcd329c4ca2cf98bc9793482")
|
||||
|
||||
depends_on("c", type="build") # generated
|
||||
|
||||
@@ -40,7 +40,8 @@ class Rocfft(CMakePackage):
|
||||
version("5.3.3", sha256="678c18710578c1fb36a0009311bb79de7607c3468f9102cfba56a866ebb7ff78")
|
||||
version("5.3.0", sha256="d655c5541c4aff4267e80e36d002fc3a55c2f84a0ae8631197c12af3bf03fa7d")
|
||||
|
||||
depends_on("cxx", type="build") # generated
|
||||
depends_on("c", type="build")
|
||||
depends_on("cxx", type="build")
|
||||
|
||||
amdgpu_targets = ROCmPackage.amdgpu_targets
|
||||
|
||||
|
||||
@@ -41,7 +41,8 @@ class RoctracerDev(CMakePackage, ROCmPackage):
|
||||
version("5.3.3", sha256="f2cb1e6bb69ea1a628c04f984741f781ae1d8498dc58e15795bb03015f924d13")
|
||||
version("5.3.0", sha256="36f1da60863a113bb9fe2957949c661f00a702e249bb0523cda1fb755c053808")
|
||||
|
||||
depends_on("cxx", type="build") # generated
|
||||
depends_on("c", type="build")
|
||||
depends_on("cxx", type="build")
|
||||
|
||||
variant("asan", default=False, description="Build with address-sanitizer enabled or disabled")
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@ class Rsync(AutotoolsPackage):
|
||||
"""An open source utility that provides fast incremental file transfer."""
|
||||
|
||||
homepage = "https://rsync.samba.org"
|
||||
url = "https://download.samba.org/pub/rsync/src/rsync-3.2.4.tar.gz"
|
||||
url = "https://download.samba.org/pub/rsync/src/rsync-3.3.0.tar.gz"
|
||||
|
||||
license("GPL-3.0-or-later")
|
||||
|
||||
@@ -20,16 +20,42 @@ class Rsync(AutotoolsPackage):
|
||||
version("3.2.7", sha256="4e7d9d3f6ed10878c58c5fb724a67dacf4b6aac7340b13e488fb2dc41346f2bb")
|
||||
version("3.2.6", sha256="fb3365bab27837d41feaf42e967c57bd3a47bc8f10765a3671efd6a3835454d3")
|
||||
version("3.2.5", sha256="2ac4d21635cdf791867bc377c35ca6dda7f50d919a58be45057fd51600c69aba")
|
||||
version("3.2.4", sha256="6f761838d08052b0b6579cf7f6737d93e47f01f4da04c5d24d3447b7f2a5fad1")
|
||||
version("3.2.3", sha256="becc3c504ceea499f4167a260040ccf4d9f2ef9499ad5683c179a697146ce50e")
|
||||
version("3.2.2", sha256="644bd3841779507665211fd7db8359c8a10670c57e305b4aab61b4e40037afa8")
|
||||
version("3.1.3", sha256="55cc554efec5fdaad70de921cd5a5eeb6c29a95524c715f3bbf849235b0800c0")
|
||||
version("3.1.2", sha256="ecfa62a7fa3c4c18b9eccd8c16eaddee4bd308a76ea50b5c02a5840f09c0a1c2")
|
||||
version("3.1.1", sha256="7de4364fcf5fe42f3bdb514417f1c40d10bbca896abe7e7f2c581c6ea08a2621")
|
||||
|
||||
depends_on("c", type="build") # generated
|
||||
depends_on("cxx", type="build") # generated
|
||||
# Releases before 3.2.5 are deprecated because of CVE-2022-29154
|
||||
# https://nvd.nist.gov/vuln/detail/CVE-2022-29154
|
||||
version(
|
||||
"3.2.4",
|
||||
sha256="6f761838d08052b0b6579cf7f6737d93e47f01f4da04c5d24d3447b7f2a5fad1",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"3.2.3",
|
||||
sha256="becc3c504ceea499f4167a260040ccf4d9f2ef9499ad5683c179a697146ce50e",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"3.2.2",
|
||||
sha256="644bd3841779507665211fd7db8359c8a10670c57e305b4aab61b4e40037afa8",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"3.1.3",
|
||||
sha256="55cc554efec5fdaad70de921cd5a5eeb6c29a95524c715f3bbf849235b0800c0",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"3.1.2",
|
||||
sha256="ecfa62a7fa3c4c18b9eccd8c16eaddee4bd308a76ea50b5c02a5840f09c0a1c2",
|
||||
deprecated=True,
|
||||
)
|
||||
version(
|
||||
"3.1.1",
|
||||
sha256="7de4364fcf5fe42f3bdb514417f1c40d10bbca896abe7e7f2c581c6ea08a2621",
|
||||
deprecated=True,
|
||||
)
|
||||
|
||||
depends_on("c", type="build")
|
||||
depends_on("cxx", type="build")
|
||||
depends_on("zlib-api")
|
||||
depends_on("popt")
|
||||
depends_on("openssl", when="@3.2:")
|
||||
|
||||
@@ -304,6 +304,9 @@ class Seacas(CMakePackage):
|
||||
when="@:2023-10-24",
|
||||
)
|
||||
|
||||
# Based on install-tpl.sh script, cereal seems to only be used when faodel enabled
|
||||
depends_on("cereal", when="@2021-04-02: +faodel")
|
||||
|
||||
def setup_run_environment(self, env):
|
||||
env.prepend_path("PYTHONPATH", self.prefix.lib)
|
||||
|
||||
@@ -486,6 +489,15 @@ def cmake_args(self):
|
||||
if pkg.lower() in spec:
|
||||
options.append(define(pkg + "_ROOT", spec[pkg.lower()].prefix))
|
||||
|
||||
if "+faodel" in spec:
|
||||
# faodel headers are under $faodel_prefix/include/faodel but seacas
|
||||
# leaves off the faodel part
|
||||
faodel_incdir = spec["faodel"].prefix.include
|
||||
faodel_incdir2 = spec["faodel"].prefix.include.faodel
|
||||
faodel_incdirs = [faodel_incdir, faodel_incdir2]
|
||||
options.append(define("Faodel_INCLUDE_DIRS", ";".join(faodel_incdirs)))
|
||||
options.append(define("Faodel_LIBRARY_DIRS", spec["faodel"].prefix.lib))
|
||||
|
||||
options.append(from_variant("TPL_ENABLE_ADIOS2", "adios2"))
|
||||
if "+adios2" in spec:
|
||||
options.append(define("ADIOS2_ROOT", spec["adios2"].prefix))
|
||||
|
||||
Reference in New Issue
Block a user