summaryrefslogtreecommitdiff
path: root/var/spack/repos/builtin/packages/ecp-data-vis-sdk/package.py
blob: 6bd0b7e0b38f6618a003f2481a63e21eb08ad25c (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
# Copyright 2013-2022 Lawrence Livermore National Security, LLC and other
# Spack Project Developers. See the top-level COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)

from spack.package import *


# Wrapper around depends_on to propagate dependency variants
def dav_sdk_depends_on(spec, when=None, propagate=None):
    # Do the basic depends_on
    depends_on(spec, when=when)

    # Strip spec string to just the base spec name
    # ie. A +c ~b -> A
    spec = Spec(spec).name

    if "+" in when and len(when.split()) == 1:
        when_not = when.replace("+", "~")
        # If the package is in the spec tree then it must
        # be enabled in the SDK.
        conflicts(when_not, "^" + spec)

    # Skip if there is nothing to propagate
    if not propagate:
        return

    # Map the propagated variants to the dependency variant
    if not type(propagate) is dict:
        propagate = dict([(v, v) for v in propagate])

    # Determine the base variant
    base_variant = ""
    if when:
        base_variant = when

    def is_boolean(variant):
        return "=" not in variant

    # Propagate variants to dependecy
    for v_when, v_then in propagate.items():
        if is_boolean(v_when):
            depends_on(
                "{0} +{1}".format(spec, v_then), when="{0} +{1}".format(base_variant, v_when)
            )
            depends_on(
                "{0} ~{1}".format(spec, v_then), when="{0} ~{1}".format(base_variant, v_when)
            )
        else:
            depends_on("{0} {1}".format(spec, v_then), when="{0} {1}".format(base_variant, v_when))


def exclude_variants(variants, exclude):
    return [variant for variant in variants if variant not in exclude]


class EcpDataVisSdk(BundlePackage, CudaPackage, ROCmPackage):
    """ECP Data & Vis SDK"""

    homepage = "https://github.com/chuckatkins/ecp-data-viz-sdk"

    tags = ["ecp"]
    maintainers = ["chuckatkins", "kwryankrattiger"]

    version("1.0")

    ############################################################
    # Variants
    ############################################################

    # I/O
    variant("adios2", default=False, description="Enable ADIOS2")
    variant("darshan", default=False, description="Enable Darshan")
    variant("faodel", default=False, description="Enable FAODEL")
    variant("hdf5", default=False, description="Enable HDF5")
    variant("pnetcdf", default=False, description="Enable PNetCDF")
    variant("unifyfs", default=False, description="Enable UnifyFS")
    variant("veloc", default=False, description="Enable VeloC")

    # Vis
    variant("ascent", default=False, description="Enable Ascent")
    variant("cinema", default=False, description="Enable Cinema")
    variant("paraview", default=False, description="Enable ParaView")
    variant("sensei", default=False, description="Enable Sensei")
    variant("sz", default=False, description="Enable SZ")
    variant("visit", default=False, description="Enable VisIt")
    variant("vtkm", default=False, description="Enable VTK-m")
    variant("zfp", default=False, description="Enable ZFP")

    ############################################################
    # Dependencies
    ############################################################
    cuda_arch_variants = ["cuda_arch={0}".format(x) for x in CudaPackage.cuda_arch_values]
    amdgpu_target_variants = ["amdgpu_target={0}".format(x) for x in ROCmPackage.amdgpu_targets]

    dav_sdk_depends_on(
        "adios2+shared+mpi+fortran+python+blosc+sst+ssc+dataman",
        when="+adios2",
        propagate=["hdf5", "sz", "zfp"],
    )

    dav_sdk_depends_on("darshan-runtime+mpi", when="+darshan", propagate=["hdf5"])
    dav_sdk_depends_on("darshan-util", when="+darshan")

    dav_sdk_depends_on("faodel+shared+mpi network=libfabric", when="+faodel", propagate=["hdf5"])

    dav_sdk_depends_on("hdf5@1.12: +shared+mpi+fortran", when="+hdf5")

    dav_sdk_depends_on("parallel-netcdf+shared+fortran", when="+pnetcdf")

    dav_sdk_depends_on("unifyfs", when="+unifyfs ")

    dav_sdk_depends_on("veloc", when="+veloc")

    propagate_to_sensei = [(v, v) for v in ["adios2", "ascent", "hdf5"]]
    propagate_to_sensei.extend([("paraview", "catalyst"), ("visit", "libsim")])
    dav_sdk_depends_on(
        "sensei@4: ~vtkio +python", when="+sensei", propagate=dict(propagate_to_sensei)
    )

    # Fortran support with ascent is problematic on some Cray platforms so the
    # SDK is explicitly disabling it until the issues are resolved.
    dav_sdk_depends_on(
        "ascent+mpi~fortran+openmp+python+shared+vtkh+dray~test",
        when="+ascent",
        propagate=["adios2", "cuda"] + cuda_arch_variants,
    )
    depends_on("ascent+openmp", when="~rocm+ascent")
    depends_on("ascent~openmp", when="+rocm+ascent")

    # Need to explicitly turn off conduit hdf5_compat in order to build
    # hdf5@1.12 which is required for SDK
    depends_on("ascent ^conduit ~hdf5_compat", when="+ascent +hdf5")
    # Disable configuring with @develop. This should be removed after ascent
    # releases 0.8 and ascent can build with conduit@0.8: and vtk-m@1.7:
    conflicts("ascent@develop", when="+ascent")

    depends_on("py-cinemasci", when="+cinema")

    dav_sdk_depends_on(
        "paraview@5.10:+mpi+python3+kits+shared", when="+paraview", propagate=["hdf5", "adios2"]
    )
    # ParaView needs @5.11: in order to use cuda and be compatible with other
    # SDK packages.
    depends_on("paraview +cuda", when="+paraview +cuda ^paraview@5.11:")
    for cuda_arch in cuda_arch_variants:
        depends_on(
            "paraview {0}".format(cuda_arch),
            when="+paraview {0} ^paraview@5.11:".format(cuda_arch),
        )
    depends_on("paraview ~cuda", when="+paraview ~cuda")
    conflicts("paraview@master", when="+paraview")

    dav_sdk_depends_on("visit+mpi+python+silo", when="+visit", propagate=["hdf5", "adios2"])

    dav_sdk_depends_on(
        "vtk-m@1.7:+shared+mpi+rendering",
        when="+vtkm",
        propagate=["cuda", "rocm"] + cuda_arch_variants + amdgpu_target_variants,
    )
    depends_on("vtk-m+openmp", when="~rocm+vtkm")
    depends_on("vtk-m~openmp", when="+rocm+vtkm")

    # +python is currently broken in sz
    # dav_sdk_depends_on('sz+shared+fortran+python+random_access',
    dav_sdk_depends_on("sz+shared+fortran+random_access", when="+sz", propagate=["hdf5"])

    dav_sdk_depends_on("zfp", when="+zfp", propagate=["cuda"] + cuda_arch_variants)