Merge branch 'develop' into dev-path-parsing-bug
This commit is contained in:
commit
274ac74122
@ -106,8 +106,16 @@
|
|||||||
from spack.variant import any_combination_of, auto_or_any_combination_of, disjoint_sets
|
from spack.variant import any_combination_of, auto_or_any_combination_of, disjoint_sets
|
||||||
from spack.version import Version, ver
|
from spack.version import Version, ver
|
||||||
|
|
||||||
# These are just here for editor support; they will be replaced when the build env
|
# These are just here for editor support; they may be set when the build env is set up.
|
||||||
# is set up.
|
configure: Executable
|
||||||
make = MakeExecutable("make", jobs=1)
|
make_jobs: int
|
||||||
ninja = MakeExecutable("ninja", jobs=1)
|
make: MakeExecutable
|
||||||
configure = Executable(join_path(".", "configure"))
|
ninja: MakeExecutable
|
||||||
|
python_include: str
|
||||||
|
python_platlib: str
|
||||||
|
python_purelib: str
|
||||||
|
python: Executable
|
||||||
|
spack_cc: str
|
||||||
|
spack_cxx: str
|
||||||
|
spack_f77: str
|
||||||
|
spack_fc: str
|
||||||
|
@ -3653,6 +3653,7 @@ def _resolve_automatic_splices(self):
|
|||||||
):
|
):
|
||||||
continue
|
continue
|
||||||
new_spec = spec.copy(deps=False)
|
new_spec = spec.copy(deps=False)
|
||||||
|
new_spec.clear_caches(ignore=("package_hash",))
|
||||||
new_spec.build_spec = spec
|
new_spec.build_spec = spec
|
||||||
for edge in spec.edges_to_dependencies():
|
for edge in spec.edges_to_dependencies():
|
||||||
depflag = edge.depflag & ~dt.BUILD
|
depflag = edge.depflag & ~dt.BUILD
|
||||||
|
@ -3591,25 +3591,16 @@ def patches(self):
|
|||||||
|
|
||||||
return self._patches
|
return self._patches
|
||||||
|
|
||||||
def _dup(self, other, deps: Union[bool, dt.DepTypes, dt.DepFlag] = True, cleardeps=True):
|
def _dup(self, other: "Spec", deps: Union[bool, dt.DepTypes, dt.DepFlag] = True) -> bool:
|
||||||
"""Copy the spec other into self. This is an overwriting
|
"""Copies "other" into self, by overwriting all attributes.
|
||||||
copy. It does not copy any dependents (parents), but by default
|
|
||||||
copies dependencies.
|
|
||||||
|
|
||||||
To duplicate an entire DAG, call _dup() on the root of the DAG.
|
|
||||||
|
|
||||||
Args:
|
Args:
|
||||||
other (Spec): spec to be copied onto ``self``
|
other: spec to be copied onto ``self``
|
||||||
deps: if True copies all the dependencies. If
|
deps: if True copies all the dependencies. If False copies None.
|
||||||
False copies None. If deptype/depflag, copy matching types.
|
If deptype, or depflag, copy matching types.
|
||||||
cleardeps (bool): if True clears the dependencies of ``self``,
|
|
||||||
before possibly copying the dependencies of ``other`` onto
|
|
||||||
``self``
|
|
||||||
|
|
||||||
Returns:
|
Returns:
|
||||||
True if ``self`` changed because of the copy operation,
|
True if ``self`` changed because of the copy operation, False otherwise.
|
||||||
False otherwise.
|
|
||||||
|
|
||||||
"""
|
"""
|
||||||
# We don't count dependencies as changes here
|
# We don't count dependencies as changes here
|
||||||
changed = True
|
changed = True
|
||||||
@ -3634,14 +3625,15 @@ def _dup(self, other, deps: Union[bool, dt.DepTypes, dt.DepFlag] = True, clearde
|
|||||||
self.versions = other.versions.copy()
|
self.versions = other.versions.copy()
|
||||||
self.architecture = other.architecture.copy() if other.architecture else None
|
self.architecture = other.architecture.copy() if other.architecture else None
|
||||||
self.compiler = other.compiler.copy() if other.compiler else None
|
self.compiler = other.compiler.copy() if other.compiler else None
|
||||||
if cleardeps:
|
|
||||||
self._dependents = _EdgeMap(store_by_child=False)
|
|
||||||
self._dependencies = _EdgeMap(store_by_child=True)
|
|
||||||
self.compiler_flags = other.compiler_flags.copy()
|
self.compiler_flags = other.compiler_flags.copy()
|
||||||
self.compiler_flags.spec = self
|
self.compiler_flags.spec = self
|
||||||
self.variants = other.variants.copy()
|
self.variants = other.variants.copy()
|
||||||
self._build_spec = other._build_spec
|
self._build_spec = other._build_spec
|
||||||
|
|
||||||
|
# Clear dependencies
|
||||||
|
self._dependents = _EdgeMap(store_by_child=False)
|
||||||
|
self._dependencies = _EdgeMap(store_by_child=True)
|
||||||
|
|
||||||
# FIXME: we manage _patches_in_order_of_appearance specially here
|
# FIXME: we manage _patches_in_order_of_appearance specially here
|
||||||
# to keep it from leaking out of spec.py, but we should figure
|
# to keep it from leaking out of spec.py, but we should figure
|
||||||
# out how to handle it more elegantly in the Variant classes.
|
# out how to handle it more elegantly in the Variant classes.
|
||||||
@ -4524,7 +4516,7 @@ def mask_build_deps(in_spec):
|
|||||||
|
|
||||||
return spec
|
return spec
|
||||||
|
|
||||||
def clear_caches(self, ignore=()):
|
def clear_caches(self, ignore: Tuple[str, ...] = ()) -> None:
|
||||||
"""
|
"""
|
||||||
Clears all cached hashes in a Spec, while preserving other properties.
|
Clears all cached hashes in a Spec, while preserving other properties.
|
||||||
"""
|
"""
|
||||||
|
@ -10,33 +10,11 @@
|
|||||||
import spack.concretize
|
import spack.concretize
|
||||||
import spack.config
|
import spack.config
|
||||||
import spack.deptypes as dt
|
import spack.deptypes as dt
|
||||||
import spack.solver.asp
|
|
||||||
from spack.installer import PackageInstaller
|
from spack.installer import PackageInstaller
|
||||||
|
from spack.solver.asp import SolverError
|
||||||
from spack.spec import Spec
|
from spack.spec import Spec
|
||||||
|
|
||||||
|
|
||||||
class CacheManager:
|
|
||||||
def __init__(self, specs: List[str]) -> None:
|
|
||||||
self.req_specs = specs
|
|
||||||
self.concr_specs: List[Spec]
|
|
||||||
self.concr_specs = []
|
|
||||||
|
|
||||||
def __enter__(self):
|
|
||||||
self.concr_specs = [spack.concretize.concretize_one(s) for s in self.req_specs]
|
|
||||||
for s in self.concr_specs:
|
|
||||||
PackageInstaller([s.package], fake=True, explicit=True).install()
|
|
||||||
|
|
||||||
def __exit__(self, exc_type, exc_val, exc_tb):
|
|
||||||
for s in self.concr_specs:
|
|
||||||
s.package.do_uninstall()
|
|
||||||
|
|
||||||
|
|
||||||
# MacOS and Windows only work if you pass this function pointer rather than a
|
|
||||||
# closure
|
|
||||||
def _mock_has_runtime_dependencies(_x):
|
|
||||||
return True
|
|
||||||
|
|
||||||
|
|
||||||
def _make_specs_non_buildable(specs: List[str]):
|
def _make_specs_non_buildable(specs: List[str]):
|
||||||
output_config = {}
|
output_config = {}
|
||||||
for spec in specs:
|
for spec in specs:
|
||||||
@ -45,203 +23,263 @@ def _make_specs_non_buildable(specs: List[str]):
|
|||||||
|
|
||||||
|
|
||||||
@pytest.fixture
|
@pytest.fixture
|
||||||
def splicing_setup(mutable_database, mock_packages, monkeypatch):
|
def install_specs(
|
||||||
spack.config.set("concretizer:reuse", True)
|
mutable_database,
|
||||||
monkeypatch.setattr(
|
mock_packages,
|
||||||
spack.solver.asp, "_has_runtime_dependencies", _mock_has_runtime_dependencies
|
mutable_config,
|
||||||
)
|
do_not_check_runtimes_on_reuse,
|
||||||
|
install_mockery,
|
||||||
|
):
|
||||||
|
"""Returns a function that concretizes and installs a list of abstract specs"""
|
||||||
|
mutable_config.set("concretizer:reuse", True)
|
||||||
|
|
||||||
|
def _impl(*specs_str):
|
||||||
|
concrete_specs = [Spec(s).concretized() for s in specs_str]
|
||||||
|
PackageInstaller([s.package for s in concrete_specs], fake=True, explicit=True).install()
|
||||||
|
return concrete_specs
|
||||||
|
|
||||||
|
return _impl
|
||||||
|
|
||||||
|
|
||||||
def _enable_splicing():
|
def _enable_splicing():
|
||||||
spack.config.set("concretizer:splice", {"automatic": True})
|
spack.config.set("concretizer:splice", {"automatic": True})
|
||||||
|
|
||||||
|
|
||||||
def _has_build_dependency(spec: Spec, name: str):
|
@pytest.mark.parametrize("spec_str", ["splice-z", "splice-h@1"])
|
||||||
return any(s.name == name for s in spec.dependencies(None, dt.BUILD))
|
def test_spec_reuse(spec_str, install_specs, mutable_config):
|
||||||
|
"""Tests reuse of splice-z, without splicing, as a root and as a dependency of splice-h"""
|
||||||
|
splice_z = install_specs("splice-z@1.0.0+compat")[0]
|
||||||
|
mutable_config.set("packages", _make_specs_non_buildable(["splice-z"]))
|
||||||
|
concrete = spack.concretize.concretize_one(spec_str)
|
||||||
|
assert concrete["splice-z"].satisfies(splice_z)
|
||||||
|
|
||||||
|
|
||||||
def test_simple_reuse(splicing_setup):
|
@pytest.mark.regression("48578")
|
||||||
with CacheManager(["splice-z@1.0.0+compat"]):
|
def test_splice_installed_hash(install_specs, mutable_config):
|
||||||
spack.config.set("packages", _make_specs_non_buildable(["splice-z"]))
|
"""Tests splicing the dependency of an installed spec, for another installed spec"""
|
||||||
assert spack.concretize.concretize_one("splice-z").satisfies(Spec("splice-z"))
|
splice_t, splice_h = install_specs(
|
||||||
|
|
||||||
|
|
||||||
def test_simple_dep_reuse(splicing_setup):
|
|
||||||
with CacheManager(["splice-z@1.0.0+compat"]):
|
|
||||||
spack.config.set("packages", _make_specs_non_buildable(["splice-z"]))
|
|
||||||
assert spack.concretize.concretize_one("splice-h@1").satisfies(Spec("splice-h@1"))
|
|
||||||
|
|
||||||
|
|
||||||
def test_splice_installed_hash(splicing_setup):
|
|
||||||
cache = [
|
|
||||||
"splice-t@1 ^splice-h@1.0.0+compat ^splice-z@1.0.0",
|
"splice-t@1 ^splice-h@1.0.0+compat ^splice-z@1.0.0",
|
||||||
"splice-h@1.0.2+compat ^splice-z@1.0.0",
|
"splice-h@1.0.2+compat ^splice-z@1.0.0",
|
||||||
]
|
)
|
||||||
with CacheManager(cache):
|
|
||||||
packages_config = _make_specs_non_buildable(["splice-t", "splice-h"])
|
packages_config = _make_specs_non_buildable(["splice-t", "splice-h"])
|
||||||
spack.config.set("packages", packages_config)
|
mutable_config.set("packages", packages_config)
|
||||||
goal_spec = Spec("splice-t@1 ^splice-h@1.0.2+compat ^splice-z@1.0.0")
|
|
||||||
with pytest.raises(Exception):
|
goal_spec = "splice-t@1 ^splice-h@1.0.2+compat ^splice-z@1.0.0"
|
||||||
|
with pytest.raises(SolverError):
|
||||||
spack.concretize.concretize_one(goal_spec)
|
spack.concretize.concretize_one(goal_spec)
|
||||||
_enable_splicing()
|
_enable_splicing()
|
||||||
assert spack.concretize.concretize_one(goal_spec).satisfies(goal_spec)
|
concrete = spack.concretize.concretize_one(goal_spec)
|
||||||
|
|
||||||
|
# splice-t has a dependency that is changing, thus its hash should be different
|
||||||
|
assert concrete.dag_hash() != splice_t.dag_hash()
|
||||||
|
assert concrete.build_spec.satisfies(splice_t)
|
||||||
|
assert not concrete.satisfies(splice_t)
|
||||||
|
|
||||||
|
# splice-h is reused, so the hash should stay the same
|
||||||
|
assert concrete["splice-h"].satisfies(splice_h)
|
||||||
|
assert concrete["splice-h"].build_spec.satisfies(splice_h)
|
||||||
|
assert concrete["splice-h"].dag_hash() == splice_h.dag_hash()
|
||||||
|
|
||||||
|
|
||||||
def test_splice_build_splice_node(splicing_setup):
|
def test_splice_build_splice_node(install_specs, mutable_config):
|
||||||
with CacheManager(["splice-t@1 ^splice-h@1.0.0+compat ^splice-z@1.0.0+compat"]):
|
"""Tests splicing the dependency of an installed spec, for a spec that is yet to be built"""
|
||||||
spack.config.set("packages", _make_specs_non_buildable(["splice-t"]))
|
splice_t = install_specs("splice-t@1 ^splice-h@1.0.0+compat ^splice-z@1.0.0+compat")[0]
|
||||||
goal_spec = Spec("splice-t@1 ^splice-h@1.0.2+compat ^splice-z@1.0.0+compat")
|
mutable_config.set("packages", _make_specs_non_buildable(["splice-t"]))
|
||||||
with pytest.raises(Exception):
|
|
||||||
|
goal_spec = "splice-t@1 ^splice-h@1.0.2+compat ^splice-z@1.0.0+compat"
|
||||||
|
with pytest.raises(SolverError):
|
||||||
spack.concretize.concretize_one(goal_spec)
|
spack.concretize.concretize_one(goal_spec)
|
||||||
|
|
||||||
_enable_splicing()
|
_enable_splicing()
|
||||||
assert spack.concretize.concretize_one(goal_spec).satisfies(goal_spec)
|
concrete = spack.concretize.concretize_one(goal_spec)
|
||||||
|
|
||||||
|
# splice-t has a dependency that is changing, thus its hash should be different
|
||||||
|
assert concrete.dag_hash() != splice_t.dag_hash()
|
||||||
|
assert concrete.build_spec.satisfies(splice_t)
|
||||||
|
assert not concrete.satisfies(splice_t)
|
||||||
|
|
||||||
|
# splice-h should be different
|
||||||
|
assert concrete["splice-h"].dag_hash() != splice_t["splice-h"].dag_hash()
|
||||||
|
assert concrete["splice-h"].build_spec.dag_hash() == concrete["splice-h"].dag_hash()
|
||||||
|
|
||||||
|
|
||||||
def test_double_splice(splicing_setup):
|
@pytest.mark.xfail(reason="the spliced splice-h has sometimes the original splice-h hash")
|
||||||
cache = [
|
def test_double_splice(install_specs, mutable_config):
|
||||||
|
"""Tests splicing two dependencies of an installed spec, for other installed specs"""
|
||||||
|
splice_t, splice_h, splice_z = install_specs(
|
||||||
"splice-t@1 ^splice-h@1.0.0+compat ^splice-z@1.0.0+compat",
|
"splice-t@1 ^splice-h@1.0.0+compat ^splice-z@1.0.0+compat",
|
||||||
"splice-h@1.0.2+compat ^splice-z@1.0.1+compat",
|
"splice-h@1.0.2+compat ^splice-z@1.0.1+compat",
|
||||||
"splice-z@1.0.2+compat",
|
"splice-z@1.0.2+compat",
|
||||||
]
|
)
|
||||||
with CacheManager(cache):
|
mutable_config.set("packages", _make_specs_non_buildable(["splice-t", "splice-h", "splice-z"]))
|
||||||
freeze_builds_config = _make_specs_non_buildable(["splice-t", "splice-h", "splice-z"])
|
|
||||||
spack.config.set("packages", freeze_builds_config)
|
goal_spec = "splice-t@1 ^splice-h@1.0.2+compat ^splice-z@1.0.2+compat"
|
||||||
goal_spec = Spec("splice-t@1 ^splice-h@1.0.2+compat ^splice-z@1.0.2+compat")
|
with pytest.raises(SolverError):
|
||||||
with pytest.raises(Exception):
|
|
||||||
spack.concretize.concretize_one(goal_spec)
|
spack.concretize.concretize_one(goal_spec)
|
||||||
|
|
||||||
_enable_splicing()
|
_enable_splicing()
|
||||||
assert spack.concretize.concretize_one(goal_spec).satisfies(goal_spec)
|
concrete = spack.concretize.concretize_one(goal_spec)
|
||||||
|
|
||||||
|
# splice-t and splice-h have a dependency that is changing, thus its hash should be different
|
||||||
|
assert concrete.dag_hash() != splice_t.dag_hash()
|
||||||
|
assert concrete.build_spec.satisfies(splice_t)
|
||||||
|
assert not concrete.satisfies(splice_t)
|
||||||
|
|
||||||
|
assert concrete["splice-h"].dag_hash() != splice_h.dag_hash()
|
||||||
|
assert concrete["splice-h"].build_spec.satisfies(splice_h)
|
||||||
|
assert not concrete["splice-h"].satisfies(splice_h)
|
||||||
|
|
||||||
|
# splice-z is reused, so the hash should stay the same
|
||||||
|
assert concrete["splice-z"].dag_hash() == splice_z.dag_hash()
|
||||||
|
|
||||||
|
|
||||||
# The next two tests are mirrors of one another
|
@pytest.mark.parametrize(
|
||||||
def test_virtual_multi_splices_in(splicing_setup):
|
"original_spec,goal_spec",
|
||||||
cache = [
|
[
|
||||||
|
# `virtual-abi-1` can be spliced for `virtual-abi-multi abi=one` and vice-versa
|
||||||
|
(
|
||||||
"depends-on-virtual-with-abi ^virtual-abi-1",
|
"depends-on-virtual-with-abi ^virtual-abi-1",
|
||||||
"depends-on-virtual-with-abi ^virtual-abi-2",
|
|
||||||
]
|
|
||||||
goal_specs = [
|
|
||||||
"depends-on-virtual-with-abi ^virtual-abi-multi abi=one",
|
"depends-on-virtual-with-abi ^virtual-abi-multi abi=one",
|
||||||
"depends-on-virtual-with-abi ^virtual-abi-multi abi=two",
|
),
|
||||||
]
|
(
|
||||||
with CacheManager(cache):
|
|
||||||
spack.config.set("packages", _make_specs_non_buildable(["depends-on-virtual-with-abi"]))
|
|
||||||
for gs in goal_specs:
|
|
||||||
with pytest.raises(Exception):
|
|
||||||
spack.concretize.concretize_one(gs)
|
|
||||||
_enable_splicing()
|
|
||||||
for gs in goal_specs:
|
|
||||||
assert spack.concretize.concretize_one(gs).satisfies(gs)
|
|
||||||
|
|
||||||
|
|
||||||
def test_virtual_multi_can_be_spliced(splicing_setup):
|
|
||||||
cache = [
|
|
||||||
"depends-on-virtual-with-abi ^virtual-abi-multi abi=one",
|
"depends-on-virtual-with-abi ^virtual-abi-multi abi=one",
|
||||||
"depends-on-virtual-with-abi ^virtual-abi-multi abi=two",
|
|
||||||
]
|
|
||||||
goal_specs = [
|
|
||||||
"depends-on-virtual-with-abi ^virtual-abi-1",
|
"depends-on-virtual-with-abi ^virtual-abi-1",
|
||||||
|
),
|
||||||
|
# `virtual-abi-2` can be spliced for `virtual-abi-multi abi=two` and vice-versa
|
||||||
|
(
|
||||||
"depends-on-virtual-with-abi ^virtual-abi-2",
|
"depends-on-virtual-with-abi ^virtual-abi-2",
|
||||||
]
|
"depends-on-virtual-with-abi ^virtual-abi-multi abi=two",
|
||||||
with CacheManager(cache):
|
),
|
||||||
spack.config.set("packages", _make_specs_non_buildable(["depends-on-virtual-with-abi"]))
|
(
|
||||||
for gs in goal_specs:
|
"depends-on-virtual-with-abi ^virtual-abi-multi abi=two",
|
||||||
with pytest.raises(Exception):
|
"depends-on-virtual-with-abi ^virtual-abi-2",
|
||||||
spack.concretize.concretize_one(gs)
|
),
|
||||||
|
],
|
||||||
|
)
|
||||||
|
def test_virtual_multi_splices_in(original_spec, goal_spec, install_specs, mutable_config):
|
||||||
|
"""Tests that we can splice a virtual dependency with a different, but compatible, provider."""
|
||||||
|
original = install_specs(original_spec)[0]
|
||||||
|
mutable_config.set("packages", _make_specs_non_buildable(["depends-on-virtual-with-abi"]))
|
||||||
|
|
||||||
|
with pytest.raises(SolverError):
|
||||||
|
spack.concretize.concretize_one(goal_spec)
|
||||||
|
|
||||||
_enable_splicing()
|
_enable_splicing()
|
||||||
for gs in goal_specs:
|
spliced = spack.concretize.concretize_one(goal_spec)
|
||||||
assert spack.concretize.concretize_one(gs).satisfies(gs)
|
|
||||||
|
assert spliced.dag_hash() != original.dag_hash()
|
||||||
|
assert spliced.build_spec.dag_hash() == original.dag_hash()
|
||||||
|
assert spliced["virtual-with-abi"].name != spliced.build_spec["virtual-with-abi"].name
|
||||||
|
|
||||||
|
|
||||||
def test_manyvariant_star_matching_variant_splice(splicing_setup):
|
@pytest.mark.parametrize(
|
||||||
cache = [
|
"original_spec,goal_spec",
|
||||||
|
[
|
||||||
# can_splice("manyvariants@1.0.0", when="@1.0.1", match_variants="*")
|
# can_splice("manyvariants@1.0.0", when="@1.0.1", match_variants="*")
|
||||||
|
(
|
||||||
"depends-on-manyvariants ^manyvariants@1.0.0+a+b c=v1 d=v2",
|
"depends-on-manyvariants ^manyvariants@1.0.0+a+b c=v1 d=v2",
|
||||||
|
"depends-on-manyvariants ^manyvariants@1.0.1+a+b c=v1 d=v2",
|
||||||
|
),
|
||||||
|
(
|
||||||
"depends-on-manyvariants ^manyvariants@1.0.0~a~b c=v3 d=v3",
|
"depends-on-manyvariants ^manyvariants@1.0.0~a~b c=v3 d=v3",
|
||||||
]
|
"depends-on-manyvariants ^manyvariants@1.0.1~a~b c=v3 d=v3",
|
||||||
goal_specs = [
|
),
|
||||||
Spec("depends-on-manyvariants ^manyvariants@1.0.1+a+b c=v1 d=v2"),
|
|
||||||
Spec("depends-on-manyvariants ^manyvariants@1.0.1~a~b c=v3 d=v3"),
|
|
||||||
]
|
|
||||||
with CacheManager(cache):
|
|
||||||
freeze_build_config = {"depends-on-manyvariants": {"buildable": False}}
|
|
||||||
spack.config.set("packages", freeze_build_config)
|
|
||||||
for goal in goal_specs:
|
|
||||||
with pytest.raises(Exception):
|
|
||||||
spack.concretize.concretize_one(goal)
|
|
||||||
_enable_splicing()
|
|
||||||
for goal in goal_specs:
|
|
||||||
assert spack.concretize.concretize_one(goal).satisfies(goal)
|
|
||||||
|
|
||||||
|
|
||||||
def test_manyvariant_limited_matching(splicing_setup):
|
|
||||||
cache = [
|
|
||||||
# can_splice("manyvariants@2.0.0+a~b", when="@2.0.1~a+b", match_variants=["c", "d"])
|
# can_splice("manyvariants@2.0.0+a~b", when="@2.0.1~a+b", match_variants=["c", "d"])
|
||||||
|
(
|
||||||
"depends-on-manyvariants@2.0 ^manyvariants@2.0.0+a~b c=v3 d=v2",
|
"depends-on-manyvariants@2.0 ^manyvariants@2.0.0+a~b c=v3 d=v2",
|
||||||
|
"depends-on-manyvariants@2.0 ^manyvariants@2.0.1~a+b c=v3 d=v2",
|
||||||
|
),
|
||||||
# can_splice("manyvariants@2.0.0 c=v1 d=v1", when="@2.0.1+a+b")
|
# can_splice("manyvariants@2.0.0 c=v1 d=v1", when="@2.0.1+a+b")
|
||||||
|
(
|
||||||
"depends-on-manyvariants@2.0 ^manyvariants@2.0.0~a~b c=v1 d=v1",
|
"depends-on-manyvariants@2.0 ^manyvariants@2.0.0~a~b c=v1 d=v1",
|
||||||
]
|
"depends-on-manyvariants@2.0 ^manyvariants@2.0.1+a+b c=v3 d=v3",
|
||||||
goal_specs = [
|
),
|
||||||
Spec("depends-on-manyvariants@2.0 ^manyvariants@2.0.1~a+b c=v3 d=v2"),
|
],
|
||||||
Spec("depends-on-manyvariants@2.0 ^manyvariants@2.0.1+a+b c=v3 d=v3"),
|
)
|
||||||
]
|
def test_manyvariant_matching_variant_splice(
|
||||||
with CacheManager(cache):
|
original_spec, goal_spec, install_specs, mutable_config
|
||||||
freeze_build_config = {"depends-on-manyvariants": {"buildable": False}}
|
):
|
||||||
spack.config.set("packages", freeze_build_config)
|
"""Tests splicing with different kind of matching on variants"""
|
||||||
for s in goal_specs:
|
original = install_specs(original_spec)[0]
|
||||||
with pytest.raises(Exception):
|
mutable_config.set("packages", {"depends-on-manyvariants": {"buildable": False}})
|
||||||
spack.concretize.concretize_one(s)
|
|
||||||
|
with pytest.raises(SolverError):
|
||||||
|
spack.concretize.concretize_one(goal_spec)
|
||||||
|
|
||||||
_enable_splicing()
|
_enable_splicing()
|
||||||
for s in goal_specs:
|
spliced = spack.concretize.concretize_one(goal_spec)
|
||||||
assert spack.concretize.concretize_one(s).satisfies(s)
|
|
||||||
|
assert spliced.dag_hash() != original.dag_hash()
|
||||||
|
assert spliced.build_spec.dag_hash() == original.dag_hash()
|
||||||
|
|
||||||
|
# The spliced 'manyvariants' is yet to be built
|
||||||
|
assert spliced["manyvariants"].dag_hash() != original["manyvariants"].dag_hash()
|
||||||
|
assert spliced["manyvariants"].build_spec.dag_hash() == spliced["manyvariants"].dag_hash()
|
||||||
|
|
||||||
|
|
||||||
def test_external_splice_same_name(splicing_setup):
|
def test_external_splice_same_name(install_specs, mutable_config):
|
||||||
cache = [
|
"""Tests that externals can be spliced for non-external specs"""
|
||||||
|
original_splice_h, original_splice_t = install_specs(
|
||||||
"splice-h@1.0.0 ^splice-z@1.0.0+compat",
|
"splice-h@1.0.0 ^splice-z@1.0.0+compat",
|
||||||
"splice-t@1.0 ^splice-h@1.0.1 ^splice-z@1.0.1+compat",
|
"splice-t@1.0 ^splice-h@1.0.1 ^splice-z@1.0.1+compat",
|
||||||
]
|
)
|
||||||
packages_yaml = {
|
mutable_config.set("packages", _make_specs_non_buildable(["splice-t", "splice-h"]))
|
||||||
"splice-z": {"externals": [{"spec": "splice-z@1.0.2+compat", "prefix": "/usr"}]}
|
mutable_config.set(
|
||||||
|
"packages",
|
||||||
|
{
|
||||||
|
"splice-z": {
|
||||||
|
"externals": [{"spec": "splice-z@1.0.2+compat", "prefix": "/usr"}],
|
||||||
|
"buildable": False,
|
||||||
}
|
}
|
||||||
goal_specs = [
|
},
|
||||||
Spec("splice-h@1.0.0 ^splice-z@1.0.2"),
|
)
|
||||||
Spec("splice-t@1.0 ^splice-h@1.0.1 ^splice-z@1.0.2"),
|
|
||||||
]
|
|
||||||
with CacheManager(cache):
|
|
||||||
spack.config.set("packages", packages_yaml)
|
|
||||||
_enable_splicing()
|
_enable_splicing()
|
||||||
for s in goal_specs:
|
concrete_splice_h = spack.concretize.concretize_one("splice-h@1.0.0 ^splice-z@1.0.2")
|
||||||
assert spack.concretize.concretize_one(s).satisfies(s)
|
concrete_splice_t = spack.concretize.concretize_one(
|
||||||
|
"splice-t@1.0 ^splice-h@1.0.1 ^splice-z@1.0.2"
|
||||||
|
)
|
||||||
|
|
||||||
|
assert concrete_splice_h.dag_hash() != original_splice_h.dag_hash()
|
||||||
|
assert concrete_splice_h.build_spec.dag_hash() == original_splice_h.dag_hash()
|
||||||
|
assert concrete_splice_h["splice-z"].external
|
||||||
|
|
||||||
|
assert concrete_splice_t.dag_hash() != original_splice_t.dag_hash()
|
||||||
|
assert concrete_splice_t.build_spec.dag_hash() == original_splice_t.dag_hash()
|
||||||
|
assert concrete_splice_t["splice-z"].external
|
||||||
|
|
||||||
|
assert concrete_splice_t["splice-z"].dag_hash() == concrete_splice_h["splice-z"].dag_hash()
|
||||||
|
|
||||||
|
|
||||||
def test_spliced_build_deps_only_in_build_spec(splicing_setup):
|
def test_spliced_build_deps_only_in_build_spec(install_specs):
|
||||||
cache = ["splice-t@1.0 ^splice-h@1.0.1 ^splice-z@1.0.0"]
|
"""Tests that build specs are not reported in the spliced spec"""
|
||||||
goal_spec = Spec("splice-t@1.0 ^splice-h@1.0.2 ^splice-z@1.0.0")
|
install_specs("splice-t@1.0 ^splice-h@1.0.1 ^splice-z@1.0.0")
|
||||||
|
|
||||||
with CacheManager(cache):
|
|
||||||
_enable_splicing()
|
_enable_splicing()
|
||||||
concr_goal = spack.concretize.concretize_one(goal_spec)
|
spliced = spack.concretize.concretize_one("splice-t@1.0 ^splice-h@1.0.2 ^splice-z@1.0.0")
|
||||||
build_spec = concr_goal._build_spec
|
build_spec = spliced.build_spec
|
||||||
|
|
||||||
# Spec has been spliced
|
# Spec has been spliced
|
||||||
assert build_spec is not None
|
assert build_spec.dag_hash() != spliced.dag_hash()
|
||||||
# Build spec has spliced build dependencies
|
# Build spec has spliced build dependencies
|
||||||
assert _has_build_dependency(build_spec, "splice-h")
|
assert build_spec.dependencies("splice-h", dt.BUILD)
|
||||||
assert _has_build_dependency(build_spec, "splice-z")
|
assert build_spec.dependencies("splice-z", dt.BUILD)
|
||||||
# Spliced build dependencies are removed
|
# Spliced build dependencies are removed
|
||||||
assert len(concr_goal.dependencies(None, dt.BUILD)) == 0
|
assert len(spliced.dependencies(None, dt.BUILD)) == 0
|
||||||
|
|
||||||
|
|
||||||
def test_spliced_transitive_dependency(splicing_setup):
|
def test_spliced_transitive_dependency(install_specs, mutable_config):
|
||||||
cache = ["splice-depends-on-t@1.0 ^splice-h@1.0.1"]
|
"""Tests that build specs are not reported, even for spliced transitive dependencies"""
|
||||||
goal_spec = Spec("splice-depends-on-t^splice-h@1.0.2")
|
install_specs("splice-depends-on-t@1.0 ^splice-h@1.0.1")
|
||||||
|
mutable_config.set("packages", _make_specs_non_buildable(["splice-depends-on-t"]))
|
||||||
|
|
||||||
with CacheManager(cache):
|
|
||||||
spack.config.set("packages", _make_specs_non_buildable(["splice-depends-on-t"]))
|
|
||||||
_enable_splicing()
|
_enable_splicing()
|
||||||
concr_goal = spack.concretize.concretize_one(goal_spec)
|
spliced = spack.concretize.concretize_one("splice-depends-on-t^splice-h@1.0.2")
|
||||||
|
|
||||||
# Spec has been spliced
|
# Spec has been spliced
|
||||||
assert concr_goal._build_spec is not None
|
assert spliced.build_spec.dag_hash() != spliced.dag_hash()
|
||||||
assert concr_goal["splice-t"]._build_spec is not None
|
assert spliced["splice-t"].build_spec.dag_hash() != spliced["splice-t"].dag_hash()
|
||||||
assert concr_goal.satisfies(goal_spec)
|
|
||||||
# Spliced build dependencies are removed
|
# Spliced build dependencies are removed
|
||||||
assert len(concr_goal.dependencies(None, dt.BUILD)) == 0
|
assert len(spliced.dependencies(None, dt.BUILD)) == 0
|
||||||
|
assert len(spliced["splice-t"].dependencies(None, dt.BUILD)) == 0
|
||||||
|
@ -2125,15 +2125,7 @@ def configure_reuse(reuse_mode, combined_env) -> Optional[ev.Environment]:
|
|||||||
"from_environment_raise",
|
"from_environment_raise",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
def test_env_include_concrete_reuse(monkeypatch, reuse_mode):
|
def test_env_include_concrete_reuse(do_not_check_runtimes_on_reuse, reuse_mode):
|
||||||
|
|
||||||
# The mock packages do not use the gcc-runtime
|
|
||||||
def mock_has_runtime_dependencies(*args, **kwargs):
|
|
||||||
return True
|
|
||||||
|
|
||||||
monkeypatch.setattr(
|
|
||||||
spack.solver.asp, "_has_runtime_dependencies", mock_has_runtime_dependencies
|
|
||||||
)
|
|
||||||
# The default mpi version is 3.x provided by mpich in the mock repo.
|
# The default mpi version is 3.x provided by mpich in the mock repo.
|
||||||
# This test verifies that concretizing with an included concrete
|
# This test verifies that concretizing with an included concrete
|
||||||
# environment with "concretizer:reuse:true" the included
|
# environment with "concretizer:reuse:true" the included
|
||||||
|
@ -3124,14 +3124,13 @@ def test_concretization_version_order():
|
|||||||
),
|
),
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
@pytest.mark.usefixtures("mutable_database", "mock_store")
|
@pytest.mark.usefixtures("mutable_database", "mock_store", "do_not_check_runtimes_on_reuse")
|
||||||
@pytest.mark.not_on_windows("Expected length is different on Windows")
|
@pytest.mark.not_on_windows("Expected length is different on Windows")
|
||||||
def test_filtering_reused_specs(
|
def test_filtering_reused_specs(
|
||||||
roots, reuse_yaml, expected, not_expected, expected_length, mutable_config, monkeypatch
|
roots, reuse_yaml, expected, not_expected, expected_length, mutable_config
|
||||||
):
|
):
|
||||||
"""Tests that we can select which specs are to be reused, using constraints as filters"""
|
"""Tests that we can select which specs are to be reused, using constraints as filters"""
|
||||||
# Assume all specs have a runtime dependency
|
# Assume all specs have a runtime dependency
|
||||||
monkeypatch.setattr(spack.solver.asp, "_has_runtime_dependencies", lambda x: True)
|
|
||||||
mutable_config.set("concretizer:reuse", reuse_yaml)
|
mutable_config.set("concretizer:reuse", reuse_yaml)
|
||||||
selector = spack.solver.asp.ReusableSpecsSelector(mutable_config)
|
selector = spack.solver.asp.ReusableSpecsSelector(mutable_config)
|
||||||
specs = selector.reusable_specs(roots)
|
specs = selector.reusable_specs(roots)
|
||||||
@ -3151,10 +3150,11 @@ def test_filtering_reused_specs(
|
|||||||
[({"from": [{"type": "local"}]}, 17), ({"from": [{"type": "buildcache"}]}, 0)],
|
[({"from": [{"type": "local"}]}, 17), ({"from": [{"type": "buildcache"}]}, 0)],
|
||||||
)
|
)
|
||||||
@pytest.mark.not_on_windows("Expected length is different on Windows")
|
@pytest.mark.not_on_windows("Expected length is different on Windows")
|
||||||
def test_selecting_reused_sources(reuse_yaml, expected_length, mutable_config, monkeypatch):
|
def test_selecting_reused_sources(
|
||||||
|
reuse_yaml, expected_length, mutable_config, do_not_check_runtimes_on_reuse
|
||||||
|
):
|
||||||
"""Tests that we can turn on/off sources of reusable specs"""
|
"""Tests that we can turn on/off sources of reusable specs"""
|
||||||
# Assume all specs have a runtime dependency
|
# Assume all specs have a runtime dependency
|
||||||
monkeypatch.setattr(spack.solver.asp, "_has_runtime_dependencies", lambda x: True)
|
|
||||||
mutable_config.set("concretizer:reuse", reuse_yaml)
|
mutable_config.set("concretizer:reuse", reuse_yaml)
|
||||||
selector = spack.solver.asp.ReusableSpecsSelector(mutable_config)
|
selector = spack.solver.asp.ReusableSpecsSelector(mutable_config)
|
||||||
specs = selector.reusable_specs(["mpileaks"])
|
specs = selector.reusable_specs(["mpileaks"])
|
||||||
|
@ -92,7 +92,6 @@ src_paths = "lib"
|
|||||||
honor_noqa = true
|
honor_noqa = true
|
||||||
|
|
||||||
[tool.mypy]
|
[tool.mypy]
|
||||||
python_version = 3.7
|
|
||||||
files = ['lib/spack/llnl/**/*.py', 'lib/spack/spack/**/*.py', './var/spack/repos/builtin/packages/*/package.py']
|
files = ['lib/spack/llnl/**/*.py', 'lib/spack/spack/**/*.py', './var/spack/repos/builtin/packages/*/package.py']
|
||||||
mypy_path = ['bin', 'lib/spack', 'lib/spack/external', 'var/spack/repos/builtin']
|
mypy_path = ['bin', 'lib/spack', 'lib/spack/external', 'var/spack/repos/builtin']
|
||||||
allow_redefinition = true
|
allow_redefinition = true
|
||||||
|
@ -0,0 +1,13 @@
|
|||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index e607bb3cb..a4752dff6 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -203,7 +203,7 @@ endif
|
||||||
|
|
||||||
|
.PHONY: compile-arrow-cpp
|
||||||
|
compile-arrow-cpp:
|
||||||
|
- $(CHPL_CXX) -O3 -std=c++17 -c $(ARROW_CPP) -o $(ARROW_O) $(INCLUDE_FLAGS) $(ARROW_SANITIZE)
|
||||||
|
+ $(CHPL_CXX) -fPIC -O3 -std=c++17 -c $(ARROW_CPP) -o $(ARROW_O) $(INCLUDE_FLAGS) $(ARROW_SANITIZE)
|
||||||
|
|
||||||
|
$(ARROW_O): $(ARROW_CPP) $(ARROW_H)
|
||||||
|
make compile-arrow-cpp
|
@ -0,0 +1,23 @@
|
|||||||
|
diff --git a/Makefile b/Makefile
|
||||||
|
index 13a9c4be1..099896ec9 100644
|
||||||
|
--- a/Makefile
|
||||||
|
+++ b/Makefile
|
||||||
|
@@ -236,15 +236,15 @@ compile-arrow-cpp:
|
||||||
|
|
||||||
|
.PHONY: compile-arrow-write
|
||||||
|
compile-arrow-write:
|
||||||
|
- $(CHPL_CXX) -O3 -std=c++17 -c $(ARROW_WRITE_CPP) -o $(ARROW_WRITE_O) $(INCLUDE_FLAGS) $(ARROW_SANITIZE)
|
||||||
|
+ $(CHPL_CXX) -O3 -std=c++17 -fPIC -c $(ARROW_WRITE_CPP) -o $(ARROW_WRITE_O) $(INCLUDE_FLAGS) $(ARROW_SANITIZE)
|
||||||
|
|
||||||
|
.PHONY: compile-arrow-read
|
||||||
|
compile-arrow-read:
|
||||||
|
- $(CHPL_CXX) -O3 -std=c++17 -c $(ARROW_READ_CPP) -o $(ARROW_READ_O) $(INCLUDE_FLAGS) $(ARROW_SANITIZE)
|
||||||
|
+ $(CHPL_CXX) -O3 -std=c++17 -fPIC -c $(ARROW_READ_CPP) -o $(ARROW_READ_O) $(INCLUDE_FLAGS) $(ARROW_SANITIZE)
|
||||||
|
|
||||||
|
.PHONY: compile-arrow-util
|
||||||
|
compile-arrow-util:
|
||||||
|
- $(CHPL_CXX) -O3 -std=c++17 -c $(ARROW_UTIL_CPP) -o $(ARROW_UTIL_O) $(INCLUDE_FLAGS) $(ARROW_SANITIZE)
|
||||||
|
+ $(CHPL_CXX) -O3 -std=c++17 -fPIC -c $(ARROW_UTIL_CPP) -o $(ARROW_UTIL_O) $(INCLUDE_FLAGS) $(ARROW_SANITIZE)
|
||||||
|
|
||||||
|
$(ARROW_UTIL_O): $(ARROW_UTIL_CPP) $(ARROW_UTIL_H)
|
||||||
|
make compile-arrow-util
|
109
var/spack/repos/builtin/packages/arkouda/package.py
Normal file
109
var/spack/repos/builtin/packages/arkouda/package.py
Normal file
@ -0,0 +1,109 @@
|
|||||||
|
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# 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
|
||||||
|
|
||||||
|
|
||||||
|
class Arkouda(MakefilePackage):
|
||||||
|
"""Arkouda is a NumPy-like library for distributed data with a focus on
|
||||||
|
large-scale data science applications."""
|
||||||
|
|
||||||
|
homepage = "https://github.com/Bears-R-Us/arkouda"
|
||||||
|
|
||||||
|
# Arkouda does not have a current PyPI package, so we use the GitHub tarball
|
||||||
|
url = "https://github.com/Bears-R-Us/arkouda/archive/refs/tags/v2024.10.02.tar.gz"
|
||||||
|
git = "https://github.com/Bears-R-Us/arkouda.git"
|
||||||
|
|
||||||
|
# See https://spdx.org/licenses/ for a list.
|
||||||
|
license("MIT")
|
||||||
|
|
||||||
|
# A list of GitHub accounts to notify when the package is updated.
|
||||||
|
# TODO: add arkouda devs github account
|
||||||
|
maintainers("arezaii")
|
||||||
|
|
||||||
|
version("master", branch="master")
|
||||||
|
|
||||||
|
version(
|
||||||
|
"2024.10.02", sha256="00671a89a08be57ff90a94052f69bfc6fe793f7b50cf9195dd7ee794d6d13f23"
|
||||||
|
)
|
||||||
|
version(
|
||||||
|
"2024.06.21", sha256="ab7f753befb3a0b8e27a3d28f3c83332d2c6ae49678877a7456f0fcfe42df51c"
|
||||||
|
)
|
||||||
|
|
||||||
|
variant(
|
||||||
|
"distributed",
|
||||||
|
default=False,
|
||||||
|
description="Build Arkouda for multi-locale execution on a cluster or supercomputer",
|
||||||
|
)
|
||||||
|
|
||||||
|
depends_on("chapel@2.1: +hdf5 +zmq", type=("build", "link", "run", "test"))
|
||||||
|
depends_on("cmake@3.13.4:", type="build")
|
||||||
|
depends_on("python@3.9:", type=("build", "link", "run", "test"))
|
||||||
|
depends_on("libzmq@4.2.5:", type=("build", "link", "run", "test"))
|
||||||
|
depends_on("hdf5+hl~mpi", type=("build", "link", "run", "test"))
|
||||||
|
depends_on("libiconv", type=("build", "link", "run", "test"))
|
||||||
|
depends_on("libidn2", type=("build", "link", "run", "test"))
|
||||||
|
depends_on(
|
||||||
|
"arrow +parquet +snappy +zlib +brotli +bz2 +lz4 +zstd",
|
||||||
|
type=("build", "link", "run", "test"),
|
||||||
|
)
|
||||||
|
|
||||||
|
requires("^chapel comm=none", when="~distributed")
|
||||||
|
requires("^chapel +python-bindings", when="@2024.10.02:")
|
||||||
|
requires(
|
||||||
|
"^chapel comm=gasnet",
|
||||||
|
"^chapel comm=ugni",
|
||||||
|
"^chapel comm=ofi",
|
||||||
|
policy="one_of",
|
||||||
|
when="+distributed",
|
||||||
|
)
|
||||||
|
|
||||||
|
# Some systems need explicit -fPIC flag when building the Arrow functions
|
||||||
|
patch("makefile-fpic-2024.06.21.patch", when="@2024.06.21")
|
||||||
|
patch("makefile-fpic-2024.10.02.patch", when="@2024.10.02:")
|
||||||
|
|
||||||
|
sanity_check_is_file = [join_path("bin", "arkouda_server")]
|
||||||
|
|
||||||
|
def check(self):
|
||||||
|
# skip b/c we need the python client
|
||||||
|
pass
|
||||||
|
|
||||||
|
# override the default edit method to apply the patch
|
||||||
|
def edit(self, spec, prefix):
|
||||||
|
self.update_makefile_paths(spec, prefix)
|
||||||
|
|
||||||
|
def update_makefile_paths(self, spec, prefix):
|
||||||
|
# add to the Makefile.paths file for all of the dependencies installed by spack
|
||||||
|
# in the form $(eval $(call add-path,<path-to-dep-aka-prefix>))
|
||||||
|
with open("Makefile.paths", "w") as f:
|
||||||
|
f.write("$(eval $(call add-path,{0}))\n".format(spec["hdf5"].prefix))
|
||||||
|
f.write("$(eval $(call add-path,{0}))\n".format(spec["libzmq"].prefix))
|
||||||
|
f.write("$(eval $(call add-path,{0}))\n".format(spec["arrow"].prefix))
|
||||||
|
f.write("$(eval $(call add-path,{0}))\n".format(spec["libiconv"].prefix))
|
||||||
|
f.write("$(eval $(call add-path,{0}))\n".format(spec["libidn2"].prefix))
|
||||||
|
|
||||||
|
def build(self, spec, prefix):
|
||||||
|
# Detect distributed builds and skip the dependency checks built into
|
||||||
|
# the Arkouda Makefile. These checks will try to spawn multiple jobs which may
|
||||||
|
# cause the build to fail in situations where the user is constrained
|
||||||
|
# to a limited number of simultaneous jobs.
|
||||||
|
if spec.satisfies("+distributed"):
|
||||||
|
with set_env(ARKOUDA_SKIP_CHECK_DEPS="1"):
|
||||||
|
tty.warn("Distributed build detected. Skipping dependency checks")
|
||||||
|
make()
|
||||||
|
else:
|
||||||
|
make()
|
||||||
|
|
||||||
|
# Arkouda does not have an install target in its Makefile
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
mkdir(prefix.bin)
|
||||||
|
install("arkouda_server", prefix.bin)
|
||||||
|
# Arkouda can have two executables depending on if Chapel is compiled in
|
||||||
|
# single-locale or multi-locale mode
|
||||||
|
if spec.satisfies("+distributed"):
|
||||||
|
install("arkouda_server_real", prefix.bin)
|
@ -14,6 +14,9 @@ class Elk(MakefilePackage):
|
|||||||
|
|
||||||
license("LGPL-3.0-or-later")
|
license("LGPL-3.0-or-later")
|
||||||
|
|
||||||
|
version("10.2.4", sha256="015e1d2a04a6c8335af2e5f5adaae143c6c0287f34772e069834a691bb15ac9d")
|
||||||
|
version("9.6.8", sha256="d5b60406744a13be42a258a6efd9545ce38a7006d8e76e40e3770368e05c1dae")
|
||||||
|
version("8.8.26", sha256="f0d397a0e2fd8b6f74bc9fccc03fae701bb348e3f08ca143d41757f5f6cf794a")
|
||||||
version("8.3.22", sha256="1c31f09b7c09d6b24e775d4f0d5e1e8871f95a7656ee4ca21ac17dbe7ea16277")
|
version("8.3.22", sha256="1c31f09b7c09d6b24e775d4f0d5e1e8871f95a7656ee4ca21ac17dbe7ea16277")
|
||||||
version("7.2.42", sha256="73f03776dbf9b2147bfcc5b7c062af5befa0944608f6fc4b6a1e590615400fc6")
|
version("7.2.42", sha256="73f03776dbf9b2147bfcc5b7c062af5befa0944608f6fc4b6a1e590615400fc6")
|
||||||
version("7.1.14", sha256="7c2ff30f4b1d72d5dc116de9d70761f2c206700c69d85dd82a17a5a6374453d2")
|
version("7.1.14", sha256="7c2ff30f4b1d72d5dc116de9d70761f2c206700c69d85dd82a17a5a6374453d2")
|
||||||
@ -36,7 +39,7 @@ class Elk(MakefilePackage):
|
|||||||
# blis - use internal lapack and blas implementation from blis
|
# blis - use internal lapack and blas implementation from blis
|
||||||
variant(
|
variant(
|
||||||
"linalg",
|
"linalg",
|
||||||
default="internal",
|
default="generic",
|
||||||
multi=False,
|
multi=False,
|
||||||
description="Build with custom BLAS library",
|
description="Build with custom BLAS library",
|
||||||
values=("internal", "generic", "openblas", "mkl", "blis"),
|
values=("internal", "generic", "openblas", "mkl", "blis"),
|
||||||
@ -48,7 +51,7 @@ class Elk(MakefilePackage):
|
|||||||
# should be used with linalg=mkls
|
# should be used with linalg=mkls
|
||||||
variant(
|
variant(
|
||||||
"fft",
|
"fft",
|
||||||
default="internal",
|
default="fftw",
|
||||||
multi=False,
|
multi=False,
|
||||||
description="Build with custom FFT library",
|
description="Build with custom FFT library",
|
||||||
values=("internal", "fftw", "mkl"),
|
values=("internal", "fftw", "mkl"),
|
||||||
@ -63,6 +66,11 @@ class Elk(MakefilePackage):
|
|||||||
conflicts("fft=mkl", when="linalg=openblas")
|
conflicts("fft=mkl", when="linalg=openblas")
|
||||||
conflicts("fft=mkl", when="linalg=blis")
|
conflicts("fft=mkl", when="linalg=blis")
|
||||||
|
|
||||||
|
conflicts("linalg=internal", when="@8.6:", msg="Internal BLAS is not supported")
|
||||||
|
conflicts("fft=internal", when="@8.6:", msg="Internal FFTW is not supported")
|
||||||
|
conflicts("libxc@:6", when="@10:", msg="Versions >= 10 requires libxc >= 7")
|
||||||
|
conflicts("libxc@7:", when="@:9", msg="Versions <=9 requires libxc =< 6")
|
||||||
|
|
||||||
variant("mpi", default=True, description="Enable MPI parallelism")
|
variant("mpi", default=True, description="Enable MPI parallelism")
|
||||||
variant("openmp", default=True, description="Enable OpenMP support")
|
variant("openmp", default=True, description="Enable OpenMP support")
|
||||||
variant("libxc", default=True, description="Link to Libxc functional library")
|
variant("libxc", default=True, description="Link to Libxc functional library")
|
||||||
@ -90,7 +98,9 @@ class Elk(MakefilePackage):
|
|||||||
depends_on("mkl", when="fft=mkl")
|
depends_on("mkl", when="fft=mkl")
|
||||||
|
|
||||||
depends_on("mpi@2:", when="+mpi")
|
depends_on("mpi@2:", when="+mpi")
|
||||||
depends_on("libxc@5:", when="@7:+libxc")
|
depends_on("libxc@7:", when="@10:+libxc")
|
||||||
|
depends_on("libxc@6:", when="@:9+libxc")
|
||||||
|
depends_on("libxc@5:", when="@:7+libxc")
|
||||||
depends_on("libxc@:3", when="@:3+libxc")
|
depends_on("libxc@:3", when="@:3+libxc")
|
||||||
depends_on("wannier90", when="+w90")
|
depends_on("wannier90", when="+w90")
|
||||||
|
|
||||||
@ -98,6 +108,13 @@ class Elk(MakefilePackage):
|
|||||||
parallel = False
|
parallel = False
|
||||||
|
|
||||||
def edit(self, spec, prefix):
|
def edit(self, spec, prefix):
|
||||||
|
if spec.satisfies("@8.6:"):
|
||||||
|
libxc_env_var_src = "SRC_LIBXC"
|
||||||
|
libxc_env_var_lib = "LIB_LIBXC"
|
||||||
|
else:
|
||||||
|
libxc_env_var_src = "SRC_libxc"
|
||||||
|
libxc_env_var_lib = "LIB_libxc"
|
||||||
|
|
||||||
# Dictionary of configuration options with default values assigned
|
# Dictionary of configuration options with default values assigned
|
||||||
config = {
|
config = {
|
||||||
"MAKE": "make",
|
"MAKE": "make",
|
||||||
@ -109,7 +126,7 @@ def edit(self, spec, prefix):
|
|||||||
"SRC_OBLAS": "oblas_stub.f90",
|
"SRC_OBLAS": "oblas_stub.f90",
|
||||||
"SRC_OMP": "omp_stub.f90",
|
"SRC_OMP": "omp_stub.f90",
|
||||||
"SRC_BLIS": "blis_stub.f90",
|
"SRC_BLIS": "blis_stub.f90",
|
||||||
"SRC_libxc": "libxcifc_stub.f90",
|
libxc_env_var_src: "libxcifc_stub.f90",
|
||||||
"SRC_FFT": "zfftifc.f90",
|
"SRC_FFT": "zfftifc.f90",
|
||||||
"SRC_W90S": "w90_stub.f90",
|
"SRC_W90S": "w90_stub.f90",
|
||||||
"F90": spack_fc,
|
"F90": spack_fc,
|
||||||
@ -173,9 +190,14 @@ def edit(self, spec, prefix):
|
|||||||
elif spec.satisfies("fft=fftw"):
|
elif spec.satisfies("fft=fftw"):
|
||||||
config["LIB_FFT"] = spec["fftw"].libs.ld_flags
|
config["LIB_FFT"] = spec["fftw"].libs.ld_flags
|
||||||
config["SRC_FFT"] = "zfftifc_fftw.f90"
|
config["SRC_FFT"] = "zfftifc_fftw.f90"
|
||||||
|
if spec.satisfies("@8.6:"):
|
||||||
|
config["LIB_FFT"] += " -lfftw3f"
|
||||||
|
config["SRC_FFT"] += " cfftifc_fftw.f90"
|
||||||
elif spec.satisfies("fft=mkl"):
|
elif spec.satisfies("fft=mkl"):
|
||||||
config["LIB_FFT"] = spec["mkl"].libs.ld_flags
|
config["LIB_FFT"] = spec["mkl"].libs.ld_flags
|
||||||
config["SRC_FFT"] = "mkl_dfti.f90 zfftifc_mkl.f90"
|
config["SRC_FFT"] = "mkl_dfti.f90 zfftifc_mkl.f90"
|
||||||
|
if spec.satisfies("@8.6:"):
|
||||||
|
config["SRC_FFT"] += " cfftifc_mkl.f90"
|
||||||
cp = which("cp")
|
cp = which("cp")
|
||||||
mkl_prefix = spec["mkl"].prefix
|
mkl_prefix = spec["mkl"].prefix
|
||||||
if spec.satisfies("^intel-mkl"):
|
if spec.satisfies("^intel-mkl"):
|
||||||
@ -185,21 +207,29 @@ def edit(self, spec, prefix):
|
|||||||
join_path(self.build_directory, "src"),
|
join_path(self.build_directory, "src"),
|
||||||
)
|
)
|
||||||
|
|
||||||
|
if spec.satisfies("@8.6:"):
|
||||||
|
config["F90_LIB"] = " ".join([config["LIB_LPK"], config["LIB_FFT"]])
|
||||||
|
del config["LIB_LPK"]
|
||||||
|
del config["LIB_FFT"]
|
||||||
|
|
||||||
# Define targets
|
# Define targets
|
||||||
self.build_targets.append("elk")
|
self.build_targets.append("elk")
|
||||||
print(self.build_targets)
|
print(self.build_targets)
|
||||||
# Libxc support
|
# Libxc support
|
||||||
if spec.satisfies("+libxc"):
|
if spec.satisfies("+libxc"):
|
||||||
config["LIB_libxc"] = " ".join(
|
if self.spec.satisfies("@10:"):
|
||||||
[
|
config[libxc_env_var_lib] = join_path(spec["libxc"].prefix.lib, "libxcf03.so")
|
||||||
join_path(spec["libxc"].prefix.lib, "libxcf90.so"),
|
|
||||||
join_path(spec["libxc"].prefix.lib, "libxc.so"),
|
|
||||||
]
|
|
||||||
)
|
|
||||||
if self.spec.satisfies("@7:"):
|
|
||||||
config["SRC_libxc"] = "libxcf90.f90 libxcifc.f90"
|
|
||||||
else:
|
else:
|
||||||
config["SRC_libxc"] = "libxc_funcs.f90 libxc.f90 libxcifc.f90"
|
config[libxc_env_var_lib] = join_path(spec["libxc"].prefix.lib, "libxcf90.so")
|
||||||
|
_libxc_lib = join_path(spec["libxc"].prefix.lib, "libxc.so")
|
||||||
|
config[libxc_env_var_lib] += f" {_libxc_lib}"
|
||||||
|
|
||||||
|
if self.spec.satisfies("@10:"):
|
||||||
|
config[libxc_env_var_src] = "libxcf03.f90 libxcifc.f90"
|
||||||
|
elif self.spec.satisfies("@7:9"):
|
||||||
|
config[libxc_env_var_src] = "libxcf90.f90 libxcifc.f90"
|
||||||
|
else:
|
||||||
|
config[libxc_env_var_src] = "libxc_funcs.f90 libxc.f90 libxcifc.f90"
|
||||||
|
|
||||||
# Write configuration options to include file
|
# Write configuration options to include file
|
||||||
with open("make.inc", "w") as inc:
|
with open("make.inc", "w") as inc:
|
||||||
@ -222,3 +252,9 @@ def install(self, spec, prefix):
|
|||||||
|
|
||||||
install_tree("examples", join_path(prefix, "examples"))
|
install_tree("examples", join_path(prefix, "examples"))
|
||||||
install_tree("species", join_path(prefix, "species"))
|
install_tree("species", join_path(prefix, "species"))
|
||||||
|
|
||||||
|
@on_package_attributes(run_tests=True)
|
||||||
|
def check(self):
|
||||||
|
with working_dir("{0}/tests".format(self.build_directory)):
|
||||||
|
bash = which("bash")
|
||||||
|
bash("./test.sh")
|
||||||
|
@ -22,6 +22,7 @@ class Helics(CMakePackage):
|
|||||||
version("develop", branch="develop", submodules=True)
|
version("develop", branch="develop", submodules=True)
|
||||||
version("main", branch="main", submodules=True)
|
version("main", branch="main", submodules=True)
|
||||||
version("master", branch="main", submodules=True)
|
version("master", branch="main", submodules=True)
|
||||||
|
version("3.6.0", sha256="e111ac5d92e808f27e330afd1f8b8ca4d86adf6ccd74e3280f2d40fb3e0e2ce9")
|
||||||
version("3.5.3", sha256="f9ace240510b18caf642f55d08f9009a9babb203fbc032ec7d7d8aa6fd5e1553")
|
version("3.5.3", sha256="f9ace240510b18caf642f55d08f9009a9babb203fbc032ec7d7d8aa6fd5e1553")
|
||||||
version("3.5.2", sha256="c2604694698a1e33c4a68f3d1c5ab0a228ef2bfca1b0d3bae94801dbd3b11048")
|
version("3.5.2", sha256="c2604694698a1e33c4a68f3d1c5ab0a228ef2bfca1b0d3bae94801dbd3b11048")
|
||||||
version("3.5.1", sha256="546fc6e6a85de6ba841e4bd547b811cc81a67a22be5e212ccb54be139d740555")
|
version("3.5.1", sha256="546fc6e6a85de6ba841e4bd547b811cc81a67a22be5e212ccb54be139d740555")
|
||||||
@ -88,8 +89,10 @@ class Helics(CMakePackage):
|
|||||||
depends_on("git", type="build", when="@master:")
|
depends_on("git", type="build", when="@master:")
|
||||||
depends_on("cmake@3.4:", type="build", when="@:2")
|
depends_on("cmake@3.4:", type="build", when="@:2")
|
||||||
depends_on("cmake@3.10:", type="build", when="@3.0.0:3.2.1")
|
depends_on("cmake@3.10:", type="build", when="@3.0.0:3.2.1")
|
||||||
depends_on("cmake@3.11:", type="build", when="@3.3.0:")
|
depends_on("cmake@3.11:", type="build", when="@3.3.0:3.5.3")
|
||||||
depends_on("boost@1.70:", type="build", when="+boost")
|
depends_on("cmake@3.22:", type="build", when="@3.6.0:")
|
||||||
|
depends_on("boost@1.70:", type="build", when="@:3.5.3 +boost")
|
||||||
|
depends_on("boost@1.75:", type="build", when="@3.6.0: +boost")
|
||||||
|
|
||||||
# TODO: replace this with an explicit list of components of Boost,
|
# TODO: replace this with an explicit list of components of Boost,
|
||||||
# for instance depends_on('boost +filesystem')
|
# for instance depends_on('boost +filesystem')
|
||||||
@ -105,11 +108,24 @@ class Helics(CMakePackage):
|
|||||||
depends_on("python@3:", when="@:2 +python")
|
depends_on("python@3:", when="@:2 +python")
|
||||||
|
|
||||||
# Compiler restrictions based on C++ standard supported
|
# Compiler restrictions based on C++ standard supported
|
||||||
conflicts("%gcc@:6", when="@3.0.0:", msg="HELICS 3+ cannot be built with GCC older than 7.0")
|
|
||||||
conflicts(
|
conflicts(
|
||||||
"%clang@:4", when="@3.0.0:", msg="HELICS 3+ cannot be built with Clang older than 5.0"
|
"%gcc@:6", when="@3.0.0:3.5.3", msg="HELICS 3+ cannot be built with GCC older than 7.0"
|
||||||
|
)
|
||||||
|
conflicts(
|
||||||
|
"%gcc@:11", when="@3.6.0:", msg="HELICS 3.6+ cannot be built with GCC older than 11.0"
|
||||||
|
)
|
||||||
|
conflicts(
|
||||||
|
"%clang@:4", when="@3.0.0:3.5.3", msg="HELICS 3+ cannot be built with Clang older than 5.0"
|
||||||
|
)
|
||||||
|
conflicts(
|
||||||
|
"%clang@:15", when="@3.6.0:", msg="HELICS 3.6+ cannot be built with Clang older than 15.0"
|
||||||
|
)
|
||||||
|
conflicts(
|
||||||
|
"%intel@:18", when="@3.0.0:3.5.3", msg="HELICS 3+ cannot be built with ICC older than 19"
|
||||||
|
)
|
||||||
|
conflicts(
|
||||||
|
"%intel@:21", when="@3.6.0:", msg="HELICS 3.6+ cannot be built with ICC older than 21"
|
||||||
)
|
)
|
||||||
conflicts("%intel@:18", when="@3.0.0:", msg="HELICS 3+ cannot be built with ICC older than 19")
|
|
||||||
|
|
||||||
# OpenMPI doesn't work with HELICS <=2.4.1
|
# OpenMPI doesn't work with HELICS <=2.4.1
|
||||||
conflicts("^openmpi", when="@:2.4.1 +mpi")
|
conflicts("^openmpi", when="@:2.4.1 +mpi")
|
||||||
@ -174,9 +190,9 @@ def cmake_args(self):
|
|||||||
# Python interface was removed from the main HELICS build in v3
|
# Python interface was removed from the main HELICS build in v3
|
||||||
args.append(from_variant("BUILD_PYTHON_INTERFACE", "python"))
|
args.append(from_variant("BUILD_PYTHON_INTERFACE", "python"))
|
||||||
|
|
||||||
# GCC >=13
|
# GCC >=13 or HELICS 3.6+
|
||||||
if spec.satisfies("%gcc@13:"):
|
if spec.satisfies("%gcc@13:") or spec.satisfies("@3.6.0:"):
|
||||||
# C++20 required when building with GCC>=13
|
# C++20 required when building with GCC>=13 or HELICS 3.6+
|
||||||
args.append("-DCMAKE_CXX_STANDARD=20")
|
args.append("-DCMAKE_CXX_STANDARD=20")
|
||||||
|
|
||||||
return args
|
return args
|
||||||
|
@ -26,8 +26,13 @@ class Julia(MakefilePackage):
|
|||||||
maintainers("vchuravy", "haampie", "giordano")
|
maintainers("vchuravy", "haampie", "giordano")
|
||||||
|
|
||||||
version("master", branch="master")
|
version("master", branch="master")
|
||||||
|
version("1.11.2", sha256="5d56c7163aefbf4dfb97d97388f93175826bcc3f4b0e885fa351694f84dc70c4")
|
||||||
|
version("1.11.1", sha256="895549f40b21dee66b6380e30811f40d2d938c2baba0750de69c9a183cccd756")
|
||||||
version("1.11.0", sha256="a938c6b7758a83e817b56db3e542bd85e6d74db75e1381b1ba24cd6e3dc8c566")
|
version("1.11.0", sha256="a938c6b7758a83e817b56db3e542bd85e6d74db75e1381b1ba24cd6e3dc8c566")
|
||||||
|
|
||||||
|
version("1.10.7", sha256="9ff0fec7ff92e27c5909982047d1bd2dc80a32173e21a2e2e029eca2ccc1c0e1")
|
||||||
|
version("1.10.6", sha256="16a2227840a2acda80f375fc21fbd42a3da3be24bd375bc9a40ca8321e3172fe")
|
||||||
|
version("1.10.5", sha256="12b1bf720b76e51a116127b30f7a824d601347bc0999cf36a0c90f1f53d00833")
|
||||||
version("1.10.4", sha256="c46ed8166fe860a7258d088a0add68dfdf11ad64cc4c0b1f113570862d3ef777")
|
version("1.10.4", sha256="c46ed8166fe860a7258d088a0add68dfdf11ad64cc4c0b1f113570862d3ef777")
|
||||||
version("1.10.3", sha256="b3cd34c839d25b98a162070b4e3abd5f34564ffdad13e07073be7885e5678a18")
|
version("1.10.3", sha256="b3cd34c839d25b98a162070b4e3abd5f34564ffdad13e07073be7885e5678a18")
|
||||||
version("1.10.2", sha256="e3d20c02975da054aeb18d32ed84c5d760d54d2563e45e25017684a5a105d185")
|
version("1.10.2", sha256="e3d20c02975da054aeb18d32ed84c5d760d54d2563e45e25017684a5a105d185")
|
||||||
|
55
var/spack/repos/builtin/packages/py-arkouda/package.py
Normal file
55
var/spack/repos/builtin/packages/py-arkouda/package.py
Normal file
@ -0,0 +1,55 @@
|
|||||||
|
# Copyright Spack Project Developers. See COPYRIGHT file for details.
|
||||||
|
#
|
||||||
|
# SPDX-License-Identifier: (Apache-2.0 OR MIT)s
|
||||||
|
|
||||||
|
from spack.package import *
|
||||||
|
|
||||||
|
|
||||||
|
class PyArkouda(PythonPackage):
|
||||||
|
"""This is the python client for Arkouda."""
|
||||||
|
|
||||||
|
homepage = "https://github.com/Bears-R-Us/arkouda"
|
||||||
|
|
||||||
|
# Updating the arkouda PyPI package is future work
|
||||||
|
url = "https://github.com/Bears-R-Us/arkouda/archive/refs/tags/v2024.10.02.tar.gz"
|
||||||
|
git = "https://github.com/Bears-R-Us/arkouda.git"
|
||||||
|
|
||||||
|
# See https://spdx.org/licenses/ for a list.
|
||||||
|
license("MIT")
|
||||||
|
|
||||||
|
test_requires_compiler = True
|
||||||
|
|
||||||
|
# A list of GitHub accounts to notify when the package is updated.
|
||||||
|
# TODO: add arkouda devs github account
|
||||||
|
maintainers("arezaii")
|
||||||
|
|
||||||
|
version("master", branch="master")
|
||||||
|
|
||||||
|
version(
|
||||||
|
"2024.10.02", sha256="00671a89a08be57ff90a94052f69bfc6fe793f7b50cf9195dd7ee794d6d13f23"
|
||||||
|
)
|
||||||
|
version(
|
||||||
|
"2024.06.21", sha256="ab7f753befb3a0b8e27a3d28f3c83332d2c6ae49678877a7456f0fcfe42df51c"
|
||||||
|
)
|
||||||
|
|
||||||
|
variant("dev", default=False, description="Include arkouda developer extras")
|
||||||
|
|
||||||
|
depends_on("python@3.8:", type=("build", "run"), when="@:2024.06.21")
|
||||||
|
depends_on("python@3.9:3.12.3", type=("build", "run"), when="@2024.10.02:")
|
||||||
|
depends_on("py-setuptools", type="build")
|
||||||
|
depends_on("py-numpy@1.24.1:1.99", type=("build", "run"))
|
||||||
|
depends_on("py-pandas@1.4.0:", type=("build", "run"))
|
||||||
|
conflicts("^py-pandas@2.2.0", msg="arkouda client not compatible with pandas 2.2.0")
|
||||||
|
|
||||||
|
depends_on("py-pyarrow", type=("build", "run"))
|
||||||
|
depends_on("py-pyzmq@20:", type=("build", "run"))
|
||||||
|
depends_on("py-scipy@:1.13.1", type=("build", "run"), when="@2024.06.21:")
|
||||||
|
depends_on("py-tables@3.7.0: +lzo +bzip2", type=("build", "run"), when="@:2024.06.21")
|
||||||
|
depends_on("py-tables@3.8.0: +lzo +bzip2", type=("build", "run"), when="@2024.10.02:")
|
||||||
|
depends_on("py-h5py@3.7.0:", type=("build", "run"))
|
||||||
|
depends_on("py-matplotlib@3.3.2:", type=("build", "run"))
|
||||||
|
depends_on("py-versioneer", type=("build"))
|
||||||
|
depends_on("py-pyfiglet", type=("build", "run"))
|
||||||
|
depends_on("py-typeguard@2.10:2.12", type=("build", "run"))
|
||||||
|
depends_on("py-tabulate", type=("build", "run"))
|
||||||
|
depends_on("py-pytest@6.0:", type=("build", "run"), when="@2024.10.02")
|
@ -9,38 +9,42 @@ class PyBasemap(PythonPackage):
|
|||||||
"""The matplotlib basemap toolkit is a library for plotting
|
"""The matplotlib basemap toolkit is a library for plotting
|
||||||
2D data on maps in Python."""
|
2D data on maps in Python."""
|
||||||
|
|
||||||
url = "https://github.com/matplotlib/basemap/archive/v1.2.0rel.tar.gz"
|
|
||||||
homepage = "https://matplotlib.org/basemap/"
|
homepage = "https://matplotlib.org/basemap/"
|
||||||
|
url = "https://github.com/matplotlib/basemap/archive/refs/tags/v1.4.1.tar.gz"
|
||||||
|
|
||||||
license("MIT")
|
license("MIT")
|
||||||
|
|
||||||
version("1.2.1", sha256="3fb30424f18cd4ffd505e30fd9c810ae81b999bb92f950c76553e1abc081faa7")
|
version("1.4.1", sha256="730b1e2ff5eb31c73680bd8ebabc6b11adfc587cfa6832c528a8a82822e5a490")
|
||||||
|
|
||||||
|
variant("hires", default=False, description="Install hi-res data.")
|
||||||
|
|
||||||
depends_on("c", type="build") # generated
|
depends_on("c", type="build") # generated
|
||||||
depends_on("cxx", type="build") # generated
|
depends_on("cxx", type="build") # generated
|
||||||
|
depends_on("py-cython@0.29:3.0", type="build")
|
||||||
|
|
||||||
|
depends_on("python@3.10:3", type=("build", "run"))
|
||||||
|
depends_on("py-numpy@1.21:1.26", type=("build", "run"))
|
||||||
|
depends_on("py-matplotlib@1.5:3.8", type=("build", "run"))
|
||||||
|
depends_on("py-pyproj@1.9.3:3.6", type=("build", "run"))
|
||||||
|
depends_on("py-pyshp@1.2:2.3", type=("build", "run"))
|
||||||
|
depends_on("py-packaging@16.0:23", type=("build", "run"))
|
||||||
|
|
||||||
|
depends_on("geos", type=("build", "run"))
|
||||||
# Per Github issue #3813, setuptools is required at runtime in order
|
# Per Github issue #3813, setuptools is required at runtime in order
|
||||||
# to make mpl_toolkits a namespace package that can span multiple
|
# to make mpl_toolkits a namespace package that can span multiple
|
||||||
# directories (i.e., matplotlib and basemap)
|
# directories (i.e., matplotlib and basemap)
|
||||||
depends_on("py-setuptools", type=("build", "run"))
|
depends_on("py-setuptools", type=("build", "run"))
|
||||||
depends_on("py-numpy@1.2.1:", type=("build", "run"))
|
|
||||||
depends_on("py-matplotlib@1.0.0:3.0.0,3.0.2:", type=("build", "run"))
|
|
||||||
# 1.2.1 is PROJ6 compatible
|
|
||||||
# https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=939022
|
|
||||||
depends_on("py-pyproj@1.9.3:", type=("build", "run"), when="@1.2.1:")
|
|
||||||
|
|
||||||
depends_on("py-pyshp@1.2.0:", type=("build", "run"))
|
|
||||||
depends_on("py-six", type=("build", "run"))
|
|
||||||
depends_on("pil", type=("build", "run"))
|
|
||||||
depends_on("geos")
|
|
||||||
|
|
||||||
def url_for_version(self, version):
|
|
||||||
if version >= Version("1.2.0"):
|
|
||||||
return "https://github.com/matplotlib/basemap/archive/v{0}rel.tar.gz".format(version)
|
|
||||||
else:
|
|
||||||
return "https://downloads.sourceforge.net/project/matplotlib/matplotlib-toolkits/basemap-{0}/basemap-{0}.tar.gz".format(
|
|
||||||
version
|
|
||||||
)
|
|
||||||
|
|
||||||
def setup_build_environment(self, env):
|
def setup_build_environment(self, env):
|
||||||
env.set("GEOS_DIR", self.spec["geos"].prefix)
|
env.set("GEOS_DIR", self.spec["geos"].prefix)
|
||||||
|
|
||||||
|
def install(self, spec, prefix):
|
||||||
|
with working_dir("packages/basemap"):
|
||||||
|
python("setup.py", "install", "--prefix={0}".format(prefix))
|
||||||
|
|
||||||
|
with working_dir("packages/basemap_data"):
|
||||||
|
python("setup.py", "install", "--prefix={0}".format(prefix))
|
||||||
|
|
||||||
|
if "+hires" in spec:
|
||||||
|
with working_dir("packages/basemap_data_hires"):
|
||||||
|
python("setup.py", "install", "--prefix={0}".format(prefix))
|
||||||
|
@ -13,10 +13,12 @@ class PyExecuting(PythonPackage):
|
|||||||
|
|
||||||
license("MIT")
|
license("MIT")
|
||||||
|
|
||||||
|
version("2.1.0", sha256="8ea27ddd260da8150fa5a708269c4a10e76161e2496ec3e587da9e3c0fe4b9ab")
|
||||||
version("1.2.0", sha256="19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107")
|
version("1.2.0", sha256="19da64c18d2d851112f09c287f8d3dbbdf725ab0e569077efb6cdcbd3497c107")
|
||||||
version("1.1.0", sha256="2c2c07d1ec4b2d8f9676b25170f1d8445c0ee2eb78901afb075a4b8d83608c6a")
|
version("1.1.0", sha256="2c2c07d1ec4b2d8f9676b25170f1d8445c0ee2eb78901afb075a4b8d83608c6a")
|
||||||
version("1.0.0", sha256="98daefa9d1916a4f0d944880d5aeaf079e05585689bebd9ff9b32e31dd5e1017")
|
version("1.0.0", sha256="98daefa9d1916a4f0d944880d5aeaf079e05585689bebd9ff9b32e31dd5e1017")
|
||||||
version("0.8.2", sha256="c23bf42e9a7b9b212f185b1b2c3c91feb895963378887bb10e64a2e612ec0023")
|
version("0.8.2", sha256="c23bf42e9a7b9b212f185b1b2c3c91feb895963378887bb10e64a2e612ec0023")
|
||||||
|
|
||||||
|
depends_on("python@:3.12", type=("build", "run"), when="@:2.0")
|
||||||
depends_on("py-setuptools", type="build")
|
depends_on("py-setuptools", type="build")
|
||||||
depends_on("py-setuptools-scm+toml", type="build")
|
depends_on("py-setuptools-scm+toml", type="build")
|
||||||
|
@ -9,18 +9,35 @@ class PyPintXarray(PythonPackage):
|
|||||||
"""A convenience wrapper for using pint with xarray"""
|
"""A convenience wrapper for using pint with xarray"""
|
||||||
|
|
||||||
homepage = "https://github.com/xarray-contrib/pint-xarray"
|
homepage = "https://github.com/xarray-contrib/pint-xarray"
|
||||||
pypi = "pint-xarray/pint-xarray-0.2.1.tar.gz"
|
pypi = "pint-xarray/pint_xarray-0.4.tar.gz"
|
||||||
|
|
||||||
license("Apache-2.0")
|
license("Apache-2.0")
|
||||||
|
|
||||||
|
version("0.4", sha256="b6b737a9c46dfb14a8598c27a71100496994c9d79dab61fd77f0d2685ae7065e")
|
||||||
version("0.3", sha256="3545dfa78bee3f98eba29b8bd17500e3b5cb7c7b03a2c2781c4d4d59b6a82841")
|
version("0.3", sha256="3545dfa78bee3f98eba29b8bd17500e3b5cb7c7b03a2c2781c4d4d59b6a82841")
|
||||||
version("0.2.1", sha256="1ee6bf74ee7b52b946f226a96469276fa4f5c68f7381c1b2aae66852562cb275")
|
version("0.2.1", sha256="1ee6bf74ee7b52b946f226a96469276fa4f5c68f7381c1b2aae66852562cb275")
|
||||||
|
|
||||||
|
with when("@0.4:"):
|
||||||
|
depends_on("py-setuptools@64:", type="build")
|
||||||
|
depends_on("py-setuptools-scm@7.0:+toml", type="build")
|
||||||
|
depends_on("python@3.9:", type=("build", "run"))
|
||||||
|
depends_on("py-numpy@1.23:", type=("build", "run"))
|
||||||
|
depends_on("py-xarray@2022.06.0:", type=("build", "run"))
|
||||||
|
depends_on("py-pint@0.21:", type=("build", "run"))
|
||||||
|
|
||||||
|
with when("@:0.3"):
|
||||||
depends_on("py-setuptools@42:", type="build")
|
depends_on("py-setuptools@42:", type="build")
|
||||||
depends_on("py-setuptools-scm@3.4:+toml", type="build")
|
depends_on("py-setuptools-scm@3.4:+toml", type="build")
|
||||||
|
depends_on("python@3.8:", type=("build", "run"))
|
||||||
depends_on("python@3.8:", when="@0.3:", type=("build", "run"))
|
|
||||||
depends_on("py-numpy@1.17:", type=("build", "run"))
|
depends_on("py-numpy@1.17:", type=("build", "run"))
|
||||||
depends_on("py-xarray@0.16.1:", type=("build", "run"))
|
depends_on("py-xarray@0.16.1:", type=("build", "run"))
|
||||||
depends_on("py-pint@0.16:", type=("build", "run"))
|
depends_on("py-pint@0.16:", type=("build", "run"))
|
||||||
depends_on("py-importlib-metadata", when="@0.2.1 ^python@:3.7", type=("build", "run"))
|
depends_on("py-importlib-metadata", when="@0.2.1 ^python@:3.7", type=("build", "run"))
|
||||||
|
|
||||||
|
def url_for_version(self, version):
|
||||||
|
|
||||||
|
if version >= Version("0.4"):
|
||||||
|
return super().url_for_version(version)
|
||||||
|
|
||||||
|
url = "https://files.pythonhosted.org/packages/source/p/pint-xarray/pint-xarray-{0}.tar.gz"
|
||||||
|
return url.format(version)
|
||||||
|
@ -16,6 +16,7 @@ class PyPycuda(PythonPackage):
|
|||||||
|
|
||||||
license("MIT")
|
license("MIT")
|
||||||
|
|
||||||
|
version("2024.1.2", sha256="d110b727cbea859da4b63e91b6fa1e9fc32c5bade02d89ff449975996e9ccfab")
|
||||||
version("2021.1", sha256="ab87312d0fc349d9c17294a087bb9615cffcf966ad7b115f5b051008a48dd6ed")
|
version("2021.1", sha256="ab87312d0fc349d9c17294a087bb9615cffcf966ad7b115f5b051008a48dd6ed")
|
||||||
version("2020.1", sha256="effa3b99b55af67f3afba9b0d1b64b4a0add4dd6a33bdd6786df1aa4cc8761a5")
|
version("2020.1", sha256="effa3b99b55af67f3afba9b0d1b64b4a0add4dd6a33bdd6786df1aa4cc8761a5")
|
||||||
version("2019.1.2", sha256="ada56ce98a41f9f95fe18809f38afbae473a5c62d346cfa126a2d5477f24cc8a")
|
version("2019.1.2", sha256="ada56ce98a41f9f95fe18809f38afbae473a5c62d346cfa126a2d5477f24cc8a")
|
||||||
@ -23,6 +24,28 @@ class PyPycuda(PythonPackage):
|
|||||||
|
|
||||||
depends_on("cxx", type="build") # generated
|
depends_on("cxx", type="build") # generated
|
||||||
|
|
||||||
|
# TODO: replace this with an explicit list of components of Boost,
|
||||||
|
# for instance depends_on('boost +filesystem')
|
||||||
|
# See https://github.com/spack/spack/pull/22303 for reference
|
||||||
|
depends_on(Boost.with_default_variants)
|
||||||
|
# TODO: for versions before 2024.1.2, find out the exact requirements with version constraints
|
||||||
|
# and enter them below. See https://github.com/spack/spack/pull/48547
|
||||||
|
depends_on("python@3.6:3", type=("build", "run"), when="@2020.1:")
|
||||||
|
depends_on("python@3.8:3", type=("build", "run"), when="@2024.1.2:")
|
||||||
|
depends_on("boost+python")
|
||||||
|
depends_on("cuda", type=("build", "run"))
|
||||||
|
depends_on("cuda@:8.0.61", when="@2016.1.2")
|
||||||
|
depends_on("py-appdirs@1.4.0:", type=("build", "run"), when="@:2021.1")
|
||||||
|
depends_on("py-decorator@3.2.0:", type=("build", "run"), when="@:2020.1")
|
||||||
|
depends_on("py-mako", type=("build", "run"))
|
||||||
|
depends_on("py-numpy@1.6:", type=("build", "run"), when="@:2021.1")
|
||||||
|
depends_on("py-numpy@1.24:", type=("build", "run"), when="@2024.1.2:")
|
||||||
|
depends_on("py-platformdirs@2.2:", type=("build", "run"), when="@2024.1.2:")
|
||||||
|
depends_on("py-pytools@2011.2:", type=("build", "run"))
|
||||||
|
depends_on("py-setuptools", type="build")
|
||||||
|
depends_on("py-six", type="run", when="@:2020.1")
|
||||||
|
depends_on("py-pytools@2011.2:", type=("build", "run"), when="@2024.1.2:")
|
||||||
|
|
||||||
@run_before("install")
|
@run_before("install")
|
||||||
def configure(self):
|
def configure(self):
|
||||||
pyver = self.spec["python"].version.up_to(2).joined
|
pyver = self.spec["python"].version.up_to(2).joined
|
||||||
@ -34,20 +57,3 @@ def configure(self):
|
|||||||
"--boost-python-libname={0}".format(boostlib),
|
"--boost-python-libname={0}".format(boostlib),
|
||||||
]
|
]
|
||||||
python("configure.py", *configure_args)
|
python("configure.py", *configure_args)
|
||||||
|
|
||||||
depends_on("py-setuptools", type="build")
|
|
||||||
depends_on("cuda")
|
|
||||||
depends_on("boost+python")
|
|
||||||
# TODO: replace this with an explicit list of components of Boost,
|
|
||||||
# for instance depends_on('boost +filesystem')
|
|
||||||
# See https://github.com/spack/spack/pull/22303 for reference
|
|
||||||
depends_on(Boost.with_default_variants)
|
|
||||||
depends_on("python@3.6:3", type=("build", "run"), when="@2020.1:")
|
|
||||||
depends_on("py-numpy@1.6:", type=("build", "run"))
|
|
||||||
depends_on("py-pytools@2011.2:", type=("build", "run"))
|
|
||||||
depends_on("py-six", type="run", when="@:2020.1")
|
|
||||||
depends_on("py-decorator@3.2.0:", type=("build", "run"), when="@:2020.1")
|
|
||||||
depends_on("py-appdirs@1.4.0:", type=("build", "run"))
|
|
||||||
depends_on("py-mako", type=("build", "run"))
|
|
||||||
|
|
||||||
depends_on("cuda@:8.0.61", when="@2016.1.2")
|
|
||||||
|
@ -843,6 +843,7 @@ def setup_run_environment(self, env):
|
|||||||
# the following vars are copied from thisroot.sh; silence a cppyy warning
|
# the following vars are copied from thisroot.sh; silence a cppyy warning
|
||||||
env.set("CLING_STANDARD_PCH", "none")
|
env.set("CLING_STANDARD_PCH", "none")
|
||||||
env.set("CPPYY_API_PATH", "none")
|
env.set("CPPYY_API_PATH", "none")
|
||||||
|
env.set("CPPYY_BACKEND_LIBRARY", self.prefix.lib.root.libcppyy_backend)
|
||||||
if "+rpath" not in self.spec:
|
if "+rpath" not in self.spec:
|
||||||
env.prepend_path(self.root_library_path, self.prefix.lib.root)
|
env.prepend_path(self.root_library_path, self.prefix.lib.root)
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user