From af89bdf6320459498717552c09b4606067fb030f Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Wed, 12 Feb 2025 07:27:49 +0100 Subject: [PATCH] kokkos et al. : don't monkeypatch spec in callbacks (#48916) Currently, a few packages using kokkos rely on kokkos itself monkeypatching its own spec to provide some attribute. In this commit we change this attribute to be defined on the package, and never be monkeypatched. --- .../repos/builtin/packages/arborx/package.py | 19 ++++++------------- .../builtin/packages/compadre/package.py | 2 +- .../repos/builtin/packages/dealii/package.py | 2 +- .../repos/builtin/packages/exawind/package.py | 6 +++--- .../repos/builtin/packages/flecsi/package.py | 2 +- .../packages/kokkos-kernels/package.py | 2 +- .../packages/kokkos-nvcc-wrapper/package.py | 6 +++--- .../repos/builtin/packages/kokkos/package.py | 15 +++++++-------- .../repos/builtin/packages/legion/package.py | 2 +- .../builtin/packages/nalu-wind/package.py | 6 +++--- .../repos/builtin/packages/nlcglib/package.py | 2 +- .../builtin/packages/py-pycompadre/package.py | 2 +- .../packages/singularity-eos/package.py | 2 +- .../repos/builtin/packages/spiner/package.py | 2 +- .../builtin/packages/trilinos/package.py | 19 ++++++++++--------- 15 files changed, 41 insertions(+), 48 deletions(-) diff --git a/var/spack/repos/builtin/packages/arborx/package.py b/var/spack/repos/builtin/packages/arborx/package.py index 20dcbe17f19..3099e5f11cc 100644 --- a/var/spack/repos/builtin/packages/arborx/package.py +++ b/var/spack/repos/builtin/packages/arborx/package.py @@ -110,22 +110,15 @@ class Arborx(CMakePackage, CudaPackage, ROCmPackage): conflicts("~serial", when="+trilinos") def cmake_args(self): - spec = self.spec - - if "+trilinos" in spec: - kokkos_spec = spec["trilinos"] - else: - kokkos_spec = spec["kokkos"] - + kokkos_pkg = self["trilinos"] if self.spec.satisfies("+trilinos") else self["kokkos"] options = [ - f"-DKokkos_ROOT={kokkos_spec.prefix}", + self.define("Kokkos_ROOT", kokkos_pkg.prefix), self.define_from_variant("ARBORX_ENABLE_MPI", "mpi"), ] - - if spec.satisfies("+cuda"): - options.append(f"-DCMAKE_CXX_COMPILER={kokkos_spec.kokkos_cxx}") - if spec.satisfies("+rocm"): - options.append("-DCMAKE_CXX_COMPILER=%s" % spec["hip"].hipcc) + if self.spec.satisfies("+cuda"): + options.append(self.define("CMAKE_CXX_COMPILER", kokkos_pkg.kokkos_cxx)) + if self.spec.satisfies("+rocm"): + options.append(self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc)) return options diff --git a/var/spack/repos/builtin/packages/compadre/package.py b/var/spack/repos/builtin/packages/compadre/package.py index bb9776f991a..943b369ae79 100644 --- a/var/spack/repos/builtin/packages/compadre/package.py +++ b/var/spack/repos/builtin/packages/compadre/package.py @@ -66,7 +66,7 @@ def cmake_args(self): [ "-DKokkosCore_PREFIX={0}".format(kokkos.prefix), "-DKokkosKernels_PREFIX={0}".format(kokkos_kernels.prefix), - "-DCMAKE_CXX_COMPILER:STRING={0}".format(spec["kokkos"].kokkos_cxx), + "-DCMAKE_CXX_COMPILER:STRING={0}".format(self["kokkos"].kokkos_cxx), # Compadre_USE_PYTHON is OFF by default "-DCompadre_USE_PYTHON=OFF", ] diff --git a/var/spack/repos/builtin/packages/dealii/package.py b/var/spack/repos/builtin/packages/dealii/package.py index 6fb69dddb49..c75ccfe3de0 100644 --- a/var/spack/repos/builtin/packages/dealii/package.py +++ b/var/spack/repos/builtin/packages/dealii/package.py @@ -552,7 +552,7 @@ def cmake_args(self): ) # Make sure we use the same compiler that Trilinos uses if spec.satisfies("+trilinos"): - options.extend([self.define("CMAKE_CXX_COMPILER", spec["trilinos"].kokkos_cxx)]) + options.extend([self.define("CMAKE_CXX_COMPILER", self["trilinos"].kokkos_cxx)]) # Complex support options.append(self.define_from_variant("DEAL_II_WITH_COMPLEX_VALUES", "complex")) diff --git a/var/spack/repos/builtin/packages/exawind/package.py b/var/spack/repos/builtin/packages/exawind/package.py index 89b5aae76fa..42ada8b5431 100644 --- a/var/spack/repos/builtin/packages/exawind/package.py +++ b/var/spack/repos/builtin/packages/exawind/package.py @@ -121,9 +121,9 @@ def setup_build_environment(self, env): # Manually turn off device self.defines to solve Kokkos issues in Nalu-Wind headers env.append_flags("CXXFLAGS", "-U__HIP_DEVICE_COMPILE__ -DDESUL_HIP_RDC") if self.spec.satisfies("+cuda"): - env.set("OMPI_CXX", self.spec["kokkos-nvcc-wrapper"].kokkos_cxx) - env.set("MPICH_CXX", self.spec["kokkos-nvcc-wrapper"].kokkos_cxx) - env.set("MPICXX_CXX", self.spec["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("OMPI_CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("MPICH_CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("MPICXX_CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) if self.spec.satisfies("+rocm"): env.set("OMPI_CXX", self.spec["hip"].hipcc) env.set("MPICH_CXX", self.spec["hip"].hipcc) diff --git a/var/spack/repos/builtin/packages/flecsi/package.py b/var/spack/repos/builtin/packages/flecsi/package.py index a2de79a6743..c37fd487005 100644 --- a/var/spack/repos/builtin/packages/flecsi/package.py +++ b/var/spack/repos/builtin/packages/flecsi/package.py @@ -147,7 +147,7 @@ def cmake_args(self): # CMake pulled in via find_package(Legion) won't work without this options.append(self.define("HIP_PATH", "{0}/hip".format(spec["hip"].prefix))) elif self.spec.satisfies("^kokkos"): - options.append(self.define("CMAKE_CXX_COMPILER", self.spec["kokkos"].kokkos_cxx)) + options.append(self.define("CMAKE_CXX_COMPILER", self["kokkos"].kokkos_cxx)) else: # kept for supporing version prior to 2.2 options = [ diff --git a/var/spack/repos/builtin/packages/kokkos-kernels/package.py b/var/spack/repos/builtin/packages/kokkos-kernels/package.py index 98848493ef7..1200d29dcd9 100644 --- a/var/spack/repos/builtin/packages/kokkos-kernels/package.py +++ b/var/spack/repos/builtin/packages/kokkos-kernels/package.py @@ -267,7 +267,7 @@ def cmake_args(self): options.append("-DCMAKE_CXX_COMPILER=%s" % spec["hip"].hipcc) else: # Compiler weirdness due to nvcc_wrapper - options.append("-DCMAKE_CXX_COMPILER=%s" % spec["kokkos"].kokkos_cxx) + options.append("-DCMAKE_CXX_COMPILER=%s" % self["kokkos"].kokkos_cxx) if self.run_tests: options.append("-DKokkosKernels_ENABLE_TESTS=ON") diff --git a/var/spack/repos/builtin/packages/kokkos-nvcc-wrapper/package.py b/var/spack/repos/builtin/packages/kokkos-nvcc-wrapper/package.py index 42497a7f2ef..75a1adbb792 100644 --- a/var/spack/repos/builtin/packages/kokkos-nvcc-wrapper/package.py +++ b/var/spack/repos/builtin/packages/kokkos-nvcc-wrapper/package.py @@ -69,6 +69,6 @@ def setup_dependent_build_environment(self, env, dependent_spec): env.set("OMPI_CXX", wrapper) env.set("MPICXX_CXX", wrapper) # HPE MPT - def setup_dependent_package(self, module, dependent_spec): - wrapper = join_path(self.prefix.bin, "nvcc_wrapper") - self.spec.kokkos_cxx = wrapper + @property + def kokkos_cxx(self) -> str: + return join_path(self.prefix.bin, "nvcc_wrapper") diff --git a/var/spack/repos/builtin/packages/kokkos/package.py b/var/spack/repos/builtin/packages/kokkos/package.py index a9a717684ad..ece0d78667f 100644 --- a/var/spack/repos/builtin/packages/kokkos/package.py +++ b/var/spack/repos/builtin/packages/kokkos/package.py @@ -408,11 +408,12 @@ def append_args(self, cmake_prefix, cmake_options, spack_options): if option: spack_options.append(option) - def setup_dependent_package(self, module, dependent_spec): - try: - self.spec.kokkos_cxx = self.spec["kokkos-nvcc-wrapper"].kokkos_cxx - except Exception: - self.spec.kokkos_cxx = spack_cxx + @property + def kokkos_cxx(self) -> str: + if self.spec.satisfies("+wrapper"): + return self["kokkos-nvcc-wrapper"].kokkos_cxx + # Assumes build-time globals have been set already + return spack_cxx def cmake_args(self): spec = self.spec @@ -474,9 +475,7 @@ def cmake_args(self): options.append(self.define(tpl + "_DIR", spec[tpl].prefix)) if self.spec.satisfies("+wrapper"): - options.append( - self.define("CMAKE_CXX_COMPILER", self.spec["kokkos-nvcc-wrapper"].kokkos_cxx) - ) + options.append(self.define("CMAKE_CXX_COMPILER", self.kokkos_cxx)) elif "+rocm" in self.spec: if "+cmake_lang" in self.spec: options.append( diff --git a/var/spack/repos/builtin/packages/legion/package.py b/var/spack/repos/builtin/packages/legion/package.py index dbd636ff768..ff3227918f9 100644 --- a/var/spack/repos/builtin/packages/legion/package.py +++ b/var/spack/repos/builtin/packages/legion/package.py @@ -406,7 +406,7 @@ def cmake_args(self): if spec.satisfies("+kokkos"): # default is off. options.append("-DLegion_USE_Kokkos=ON") - os.environ["KOKKOS_CXX_COMPILER"] = spec["kokkos"].kokkos_cxx + os.environ["KOKKOS_CXX_COMPILER"] = self["kokkos"].kokkos_cxx if spec.satisfies("+cuda+cuda_unsupported_compiler ^kokkos%clang +cuda"): # Keep CMake CUDA compiler detection happy options.append( diff --git a/var/spack/repos/builtin/packages/nalu-wind/package.py b/var/spack/repos/builtin/packages/nalu-wind/package.py index c8093159135..b9a4a04750e 100644 --- a/var/spack/repos/builtin/packages/nalu-wind/package.py +++ b/var/spack/repos/builtin/packages/nalu-wind/package.py @@ -140,9 +140,9 @@ def setup_build_environment(self, env): spec = self.spec env.append_flags("CXXFLAGS", "-DUSE_STK_SIMD_NONE") if spec.satisfies("+cuda"): - env.set("OMPI_CXX", self.spec["kokkos-nvcc-wrapper"].kokkos_cxx) - env.set("MPICH_CXX", self.spec["kokkos-nvcc-wrapper"].kokkos_cxx) - env.set("MPICXX_CXX", self.spec["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("OMPI_CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("MPICH_CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("MPICXX_CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) if spec.satisfies("+rocm"): env.append_flags("CXXFLAGS", "-fgpu-rdc") diff --git a/var/spack/repos/builtin/packages/nlcglib/package.py b/var/spack/repos/builtin/packages/nlcglib/package.py index d5c17f3ac59..55ac169201a 100644 --- a/var/spack/repos/builtin/packages/nlcglib/package.py +++ b/var/spack/repos/builtin/packages/nlcglib/package.py @@ -116,7 +116,7 @@ def cmake_args(self): if "+cuda%gcc" in self.spec: options += [ self.define( - "CMAKE_CXX_COMPILER", "{0}".format(self.spec["kokkos-nvcc-wrapper"].kokkos_cxx) + "CMAKE_CXX_COMPILER", "{0}".format(self["kokkos-nvcc-wrapper"].kokkos_cxx) ) ] diff --git a/var/spack/repos/builtin/packages/py-pycompadre/package.py b/var/spack/repos/builtin/packages/py-pycompadre/package.py index 339852892b6..da1760d87d9 100644 --- a/var/spack/repos/builtin/packages/py-pycompadre/package.py +++ b/var/spack/repos/builtin/packages/py-pycompadre/package.py @@ -61,7 +61,7 @@ def set_cmake_from_variants(self): with open("cmake_opts.txt", "w") as f: f.write("KokkosCore_PREFIX:PATH=%s\n" % spec["kokkos"].prefix) f.write("KokkosKernels_PREFIX:PATH=%s\n" % spec["kokkos-kernels"].prefix) - f.write("CMAKE_CXX_COMPILER:STRING={0}\n".format(spec["kokkos"].kokkos_cxx)) + f.write("CMAKE_CXX_COMPILER:STRING={0}\n".format(self["kokkos"].kokkos_cxx)) if spec.variants["debug"].value == "0": f.write( "CMAKE_CXX_FLAGS:STRING=%s\n" diff --git a/var/spack/repos/builtin/packages/singularity-eos/package.py b/var/spack/repos/builtin/packages/singularity-eos/package.py index 62d0bfd6648..d300575d39b 100644 --- a/var/spack/repos/builtin/packages/singularity-eos/package.py +++ b/var/spack/repos/builtin/packages/singularity-eos/package.py @@ -184,7 +184,7 @@ def cmake_args(self): ] if "+kokkos+cuda" in self.spec: - args.append(self.define("CMAKE_CXX_COMPILER", self.spec["kokkos"].kokkos_cxx)) + args.append(self.define("CMAKE_CXX_COMPILER", self["kokkos"].kokkos_cxx)) return args diff --git a/var/spack/repos/builtin/packages/spiner/package.py b/var/spack/repos/builtin/packages/spiner/package.py index dcc5722c535..be219868cfa 100644 --- a/var/spack/repos/builtin/packages/spiner/package.py +++ b/var/spack/repos/builtin/packages/spiner/package.py @@ -98,5 +98,5 @@ def cmake_args(self): args.append(self.define("CMAKE_CXX_COMPILER", self.spec["hip"].hipcc)) args.append(self.define("CMAKE_C_COMPILER", self.spec["hip"].hipcc)) if self.spec.satisfies("^kokkos+cuda"): - args.append(self.define("CMAKE_CXX_COMPILER", self.spec["kokkos"].kokkos_cxx)) + args.append(self.define("CMAKE_CXX_COMPILER", self["kokkos"].kokkos_cxx)) return args diff --git a/var/spack/repos/builtin/packages/trilinos/package.py b/var/spack/repos/builtin/packages/trilinos/package.py index 89224744bd0..d346b5e0a10 100644 --- a/var/spack/repos/builtin/packages/trilinos/package.py +++ b/var/spack/repos/builtin/packages/trilinos/package.py @@ -589,21 +589,22 @@ def setup_dependent_run_environment(self, env, dependent_spec): # in case the dependent app also run a CUDA backend via Trilinos env.set("CUDA_LAUNCH_BLOCKING", "1") - def setup_dependent_package(self, module, dependent_spec): - if "+wrapper" in self.spec: - self.spec.kokkos_cxx = self.spec["kokkos-nvcc-wrapper"].kokkos_cxx - else: - self.spec.kokkos_cxx = spack_cxx + @property + def kokkos_cxx(self) -> str: + if self.spec.satisfies("+wrapper"): + return self["kokkos-nvcc-wrapper"].kokkos_cxx + # Assumes build-time globals have been set already + return spack_cxx def setup_build_environment(self, env): spec = self.spec if "+cuda" in spec and "+wrapper" in spec: if "+mpi" in spec: - env.set("OMPI_CXX", spec["kokkos-nvcc-wrapper"].kokkos_cxx) - env.set("MPICH_CXX", spec["kokkos-nvcc-wrapper"].kokkos_cxx) - env.set("MPICXX_CXX", spec["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("OMPI_CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("MPICH_CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("MPICXX_CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) else: - env.set("CXX", spec["kokkos-nvcc-wrapper"].kokkos_cxx) + env.set("CXX", self["kokkos-nvcc-wrapper"].kokkos_cxx) if "+rocm" in spec: if "+mpi" in spec: