summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--var/spack/repos/builtin/packages/kokkos/package.py42
1 files changed, 35 insertions, 7 deletions
diff --git a/var/spack/repos/builtin/packages/kokkos/package.py b/var/spack/repos/builtin/packages/kokkos/package.py
index 01ee5235e9..65e6b0adb8 100644
--- a/var/spack/repos/builtin/packages/kokkos/package.py
+++ b/var/spack/repos/builtin/packages/kokkos/package.py
@@ -69,6 +69,10 @@ class Kokkos(CMakePackage, CudaPackage, ROCmPackage):
conflicts("+rocm", when="@:3.0")
conflicts("+sycl", when="@:3.3")
conflicts("+openmptarget", when="@:3.5")
+ conflicts(
+ "".join([f"~{d}" for d in devices_variants]),
+ msg="Kokkos requires at least one active backend",
+ )
# https://github.com/spack/spack/issues/29052
conflicts("@:3.5 +sycl", when="%oneapi@2022:")
@@ -212,10 +216,17 @@ class Kokkos(CMakePackage, CudaPackage, ROCmPackage):
depends_on(tpl, when="+%s" % tpl)
variant("wrapper", default=False, description="Use nvcc-wrapper for CUDA build")
+ variant(
+ "cmake_lang",
+ default=False,
+ description="Use CMake language support for CUDA/HIP",
+ when="@3.6:",
+ )
depends_on("kokkos-nvcc-wrapper", when="+wrapper")
depends_on("kokkos-nvcc-wrapper@develop", when="@develop+wrapper")
depends_on("kokkos-nvcc-wrapper@master", when="@master+wrapper")
conflicts("+wrapper", when="~cuda")
+ conflicts("+wrapper", when="+cmake_lang")
cxxstds = ["11", "14", "17", "20"]
variant("cxxstd", default="17", values=cxxstds, multi=False, description="C++ standard")
@@ -296,7 +307,7 @@ class Kokkos(CMakePackage, CudaPackage, ROCmPackage):
variant_to_cmake_option = {"rocm": "hip"}
for variant_name in cmake_options:
opt = variant_to_cmake_option.get(variant_name, variant_name)
- optname = "Kokkos_%s_%s" % (cmake_prefix, opt.upper())
+ optname = f"Kokkos_{cmake_prefix}_{opt.upper()}"
# Explicitly enable or disable
option = self.define_from_variant(optname, variant_name)
if option:
@@ -313,14 +324,17 @@ class Kokkos(CMakePackage, CudaPackage, ROCmPackage):
from_variant = self.define_from_variant
if spec.satisfies("~wrapper+cuda") and not (
- spec.satisfies("%clang") or spec.satisfies("%cce")
+ spec.satisfies("%clang") or spec.satisfies("%cce") or spec.satisfies("+cmake_lang")
):
- raise InstallError("Kokkos requires +wrapper when using +cuda" "without clang")
+ raise InstallError(
+ "Kokkos requires +wrapper when using +cuda without %clang, %cce or +cmake_lang"
+ )
options = [
from_variant("CMAKE_POSITION_INDEPENDENT_CODE", "pic"),
from_variant("CMAKE_CXX_STANDARD", "cxxstd"),
from_variant("BUILD_SHARED_LIBS", "shared"),
+ from_variant("Kokkos_ENABLE_COMPILE_AS_CMAKE_LANGUAGE", "cmake_lang"),
]
spack_microarches = []
@@ -364,13 +378,27 @@ class Kokkos(CMakePackage, CudaPackage, ROCmPackage):
if spec.variants[tpl].value:
options.append(self.define(tpl + "_DIR", spec[tpl].prefix))
- if self.spec.satisfies("+rocm"):
- options.append(self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc))
- options.append(self.define("Kokkos_ENABLE_ROCTHRUST", True))
- elif self.spec.satisfies("+wrapper"):
+ if self.spec.satisfies("+wrapper"):
options.append(
self.define("CMAKE_CXX_COMPILER", self.spec["kokkos-nvcc-wrapper"].kokkos_cxx)
)
+ elif "+rocm" in self.spec:
+ if "+cmake_lang" in self.spec:
+ options.append(
+ self.define(
+ "CMAKE_HIP_COMPILER",
+ join_path(self.spec["llvm-amdgpu"].prefix.bin, "amdclang++"),
+ )
+ )
+ options.append(from_variant("CMAKE_HIP_STANDARD", "cxxstd"))
+ else:
+ options.append(self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc))
+ options.append(self.define("Kokkos_ENABLE_ROCTHRUST", True))
+ elif "+cuda" in self.spec and "+cmake_lang" in self.spec:
+ options.append(
+ self.define("CMAKE_CUDA_COMPILER", join_path(self.spec["cuda"].prefix.bin, "nvcc"))
+ )
+ options.append(from_variant("CMAKE_CUDA_STANDARD", "cxxstd"))
if self.spec.satisfies("%oneapi") or self.spec.satisfies("%intel"):
options.append(self.define("CMAKE_CXX_FLAGS", "-fp-model=precise"))