From 7fde98e353f506f2e283ac42c945b7b49d5cd64b Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Thu, 17 Jul 2025 15:12:05 +0100 Subject: [PATCH 01/35] First attempt at a package to build BOUT++ independently from Hermes-3. --- packages/boutpp/package.py | 171 +++++++++++++++++++++++++++++++++++ packages/hermes-3/package.py | 39 ++++---- 2 files changed, 192 insertions(+), 18 deletions(-) create mode 100644 packages/boutpp/package.py diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py new file mode 100644 index 0000000..f65d6ef --- /dev/null +++ b/packages/boutpp/package.py @@ -0,0 +1,171 @@ +# Copyright 2013-2024 Lawrence Livermore National Security, LLC and other +# Spack Project Developers. See the top-level COPYRIGHT file for details. +# +# SPDX-License-Identifier: (LGPL-3.0-only) + +# ---------------------------------------------------------------------------- + +from spack.package import * + +# from spack.package import CMakePackage, depends_on, variant, version + + +class Boutpp(CMakePackage): + """BOUT++ is a framework for writing fluid and plasma simulations in curvilinear geometry. It is intended to be quite modular, with a variety of numerical methods and time-integration solvers available. BOUT++ is primarily designed and tested with reduced plasma fluid models in mind, but it can evolve any number of equations, with equations appearing in a readable form.""" + + homepage = "https://bout-dev.readthedocs.io" + git = "https://github.com/boutproject/BOUT-dev" + url = "https://github.com/boutproject/BOUT-dev/releases/download/v5.1.0/BOUT++-v5.1.0.tar.gz" + + # maintainers("bendudson") + + license("LGPL-3.0-only") + + version("develop", branch="develop", submodules=True) + version("master", branch="master", submodules=True, preferred=True) + + version("5.1.1", branch="origin/v5.1.1-rc", submodules=True) + version("5.1.0", branch="origin/v5.1.0-rc", submodules=True) + version("5.1.0", branch="origin/v5.0.0-rc", submodules=True) + version("4.4.2", branch="origin/v4.4.2-rc", submodules=True) + version("4.4.1", branch="origin/v4.4.1-rc", submodules=True) + version("4.3.3", branch="origin/v4.3.3-rc", submodules=True) + version("4.3.2", branch="origin/v4.3.2-rc", submodules=True) + version("4.3.1", branch="origin/v4.3.1-rc", submodules=True) + version("4.3.0", branch="origin/v4.3.0-rc", submodules=True) + version("4.2.3", branch="origin/v4.2.3-rc", submodules=True) + version("4.2.2", branch="origin/v4.2.2-rc", submodules=True) + version("4.2.1", branch="origin/v4.2.1-rc", submodules=True) + version("4.2.0", branch="origin/v4.2-rc", submodules=True) + + # Variants + variant("adios2", default=False, description="Builds with ADIOS2 support.") + variant("backtrace", default=True, description="Enable backtrace.") + variant("builddocs", default=False, description="Builds the documentation.") + variant("buildexamples", default=False, description="Builds the examples.") + variant( + "buildtests", + description="Choose whether to build the standard set of tests ('default'), the complete set ('all'), or none at all ('none').", + values=("all", "default", "none"), + default="none", + multi=True, + ) + variant("caliper", default=False, description="Builds with Caliper support.") + variant( + "check", + description="Sets the CHECK variable which controls the level of internal runtime checking.", + values=("0", "1", "2", "3", "4"), + default="2", + multi=True, + ) + variant("cuda", default=False, description="Builds with CUDA support.") + variant("hypre", default=False, description="Builds with Hypre support.") + variant("lapack", default=False, description="Builds with LAPACK support.") + variant("metric3d", default=False, description="Enable 3D metric support.") + variant("netcdf", default=True, description="Enable support for NetCDF output.") + variant("openmp", default=False, description="Enable OpenMP support.") + variant("petsc", default=False, description="Builds with PETSc support.") + variant("pvode", default=False, description="Builds with PVODE support.") + variant("python", default=False, description="Builds with Python support.") + variant("raja", default=False, description="Builds with RAJA support.") + variant("scorep", default=False, description="Builds with Score-P support.") + variant("slepc", default=False, description="Builds with SLEPC support.") + variant("shared", default=True, description="Build shared libraries.") + variant("sigfpe", default=False, description="Signal floating point exceptions.") + variant("signal", default=True, description="Signal handling.") + variant("sundials", default=True, description="Builds with SUNDIALS support.") + variant("track", default=True, description="Enable field name tracking.") + variant("umpire", default=False, description="Builds with Umpire support.") + + # BOUT_GENERATE_FIELDOPS (ON if python, clang-format found, OFF otherwise) "Automatically re-generate the Field arithmetic operators from the Python templates." (requires + python) + # BOUT_ENABLE_WARNINGS(ON) Leave alone? + + # Fixed dependencies + depends_on("c", type="build") + depends_on("cxx", type="build") + depends_on("cmake@3.17:", type="build") + depends_on("fftw", type=("build", "link")) + depends_on("mpi", type=("build", "link", "run")) + + # Simple build dependencies - those derived from variants with the same name and no special variant options of their own + simple_dependencies = [ + "adios2", + "caliper", + "cuda", + "hypre", + "lapack", + "raja", + "scorep", + "umpire", + ] + for dep in simple_dependencies: + depends_on(dep, type=("build", "link"), when=f"+{dep}") + + # Other dependencies derived from variants + depends_on("netcdf-cxx4", type=("build", "link"), when="+netcdf") + depends_on("petsc+hypre+mpi~debug~fortran", type=("build", "link"), when="+petsc") + + # depends_on("python", type=("build", "link"), when="+python") + # depends_on("py-cython", type=("build", "link"), when="+python") + # depends_on("py-numpy", type=("build", "link"), when="+python") + + def cmake_args(self): + # Definitions controlled by variants + variant_defs = { + "BOUT_USE_ADIOS2": "adios2", + "BOUT_ENABLE_BACKTRACE": "backtrace", + "BOUT_BUILD_DOCS": "builddocs", + "BOUT_BUILD_EXAMPLES": "buildexamples", + "BOUT_ENABLE_CALIPER": "caliper", + "BOUT_USE_PVODE": "pvode", + "BOUT_USE_HYPRE": "hypre", + "BOUT_ENABLE_METRIC_3D": "metric3d", + "BOUT_USE_NETCDF": "netcdf", + "BOUT_ENABLE_OPENMP": "openmp", + "BOUT_USE_PETSC": "petsc", + "BOUT_USE_PVODE": "pvode", + "BOUT_ENABLE_RAJA": "raja", + "BOUT_USE_SUNDIALS": "sundials", + "BOUT_USE_SLEPC": "slepc", + "BUILD_SHARED_LIBS": "shared", + "BOUT_ENABLE_SIGNAL": "signal", + "BOUT_ENABLE_TRACK": "track", + "BOUT_ENABLE_UMPIRE": "umpire", + } + variant_args = [ + self.define_from_variant(def_str, var_str) + for def_str, var_str in variant_defs.items() + ] + variant_args.append( + self.define( + "BOUT_TESTS", self.spec.variants["buildtests"].value[0] != "none" + ) + ) + variant_args.append( + self.define( + "BOUT_ENABLE_ALL_TESTS", + self.spec.variants["buildtests"].value[0] == "all", + ) + ) + + # Fixed definitions + fixed_args = [ + self.define("BOUT_DOWNLOAD_ADIOS2", False), + self.define("BOUT_DOWNLOAD_NETCDF_CXX4", False), + self.define("BOUT_DOWNLOAD_SUNDIALS", False), + self.define("INSTALL_GTEST", False), + self.define("BOUT_UPDATE_GIT_SUBMODULE", True), + ] + + # There are problems with how CMake finds the glibc/standalone versions + # of gettext (see + # https://github.com/boutproject/hermes-3/issues/356#issuecomment-2999715879). + # Workaround is to turn off natural language support for now. + fixed_args.append(self.define("BOUT_USE_NLS", False)) + + # Concatenate different arg types and return + args = [] + args.extend(fixed_args) + args.extend(variant_args) + + return args diff --git a/packages/hermes-3/package.py b/packages/hermes-3/package.py index 9890eba..d2cb2c5 100644 --- a/packages/hermes-3/package.py +++ b/packages/hermes-3/package.py @@ -34,46 +34,49 @@ class Hermes3(CMakePackage): values=("MC", "MinMod"), multi=False, ) - variant("petsc", default=False, description="Builds with PETSc support.") - variant("sundials", default=True, description="Builds with SUNDIALS support.") + variant( + "petsc", + default=False, + description="Builds boutpp dependency with PETSc support.", + ) + variant( + "sundials", + default=True, + description="Builds boutpp dependency with SUNDIALS support.", + ) variant( "xhermes", default=True, description="Builds xhermes (required for some tests)." ) # Always-required dependencies # depends_on("adios2", type=("build", "link")) + depends_on("cmake@3.24:", type="build") depends_on("fftw", type=("build", "link")) depends_on("mpi", type=("build", "link", "run")) + depends_on("boutpp", type=("build", "link")) depends_on("netcdf-cxx4", type=("build", "link")) - # Needed for BOUT++ python bindings, should be able to move this when BOUT is split into a separate package - depends_on("py-numpy", type=("build", "link")) # Variant-controlled dependencies - depends_on( - "petsc+hypre+mpi~debug~fortran", when="+petsc", type=("build", "link") - ) + depends_on("petsc+hypre+mpi~debug~fortran", when="+petsc", type=("build", "link")) depends_on("py-xhermes", when="+xhermes", type=("run")) depends_on("sundials", when="+sundials", type=("build", "link")) def cmake_args(self): - # ON/OFF definitions controlled by variants - binary_def_variants = { + # Definitions controlled by variants + variant_defs = { "HERMES_SLOPE_LIMITER": "limiter", - "BOUT_USE_PETSC": "petsc", - "BOUT_USE_SUNDIALS": "sundials", } - variants_args = [ + variant_args = [ self.define_from_variant(def_str, var_str) - for def_str, var_str in binary_def_variants.items() + for def_str, var_str in variant_defs.items() ] + fixed_args = [self.define("HERMES_BUILD_BOUT", False)] + # Concatenate different arg types and return args = [] - args.extend(variants_args) - # There are problems with how CMake finds the - # glibc/standalone versions of gettext. See - # https://github.com/boutproject/hermes-3/issues/356#issuecomment-2999715879 - args.append(self.define("BOUT_USE_NLS", False)) + args.extend(fixed_args) + args.extend(variant_args) return args From fa6fefcc9cb2e7dac288b11a3428f461634a955c Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Thu, 17 Jul 2025 15:01:52 +0100 Subject: [PATCH 02/35] Use a patch from Tom Body's Docker config to work around CMake not finding the C version of the MPI library. --- packages/boutpp/enable_c.patch | 13 +++++++++++++ packages/boutpp/package.py | 5 +++++ 2 files changed, 18 insertions(+) create mode 100644 packages/boutpp/enable_c.patch diff --git a/packages/boutpp/enable_c.patch b/packages/boutpp/enable_c.patch new file mode 100644 index 0000000..383e2b9 --- /dev/null +++ b/packages/boutpp/enable_c.patch @@ -0,0 +1,13 @@ +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 60d34e1ad..9dc804d50 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -51,7 +51,7 @@ message(STATUS "Configuring BOUT++ version ${BOUT_FULL_VERSION}") + project(BOUT++ + DESCRIPTION "Fluid PDE solver framework" + VERSION ${BOUT_CMAKE_ACCEPTABLE_VERSION} +- LANGUAGES CXX) ++ LANGUAGES C CXX) + + include(CMakeDependentOption) + diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index f65d6ef..55204dc 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -38,6 +38,10 @@ class Boutpp(CMakePackage): version("4.2.1", branch="origin/v4.2.1-rc", submodules=True) version("4.2.0", branch="origin/v4.2-rc", submodules=True) + # Patches + # Use patch from Tom B's Docker setup to work around 'missing: MPI_C_FOUND C' issue + patch("enable_c.patch") + # Variants variant("adios2", default=False, description="Builds with ADIOS2 support.") variant("backtrace", default=True, description="Enable backtrace.") @@ -153,6 +157,7 @@ def cmake_args(self): self.define("BOUT_DOWNLOAD_ADIOS2", False), self.define("BOUT_DOWNLOAD_NETCDF_CXX4", False), self.define("BOUT_DOWNLOAD_SUNDIALS", False), + self.define("BOUT_ENABLE_MPI", True), self.define("INSTALL_GTEST", False), self.define("BOUT_UPDATE_GIT_SUBMODULE", True), ] From d2c377d67e26f8bd9c0e0928efb44c20b7af6039 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Thu, 17 Jul 2025 15:55:00 +0100 Subject: [PATCH 03/35] Tidy up boutpp package and add dependencies for +python variant. --- packages/boutpp/package.py | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 55204dc..bd0def1 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -5,9 +5,7 @@ # ---------------------------------------------------------------------------- -from spack.package import * - -# from spack.package import CMakePackage, depends_on, variant, version +from spack.package import CMakePackage, depends_on, variant, version class Boutpp(CMakePackage): @@ -100,18 +98,19 @@ class Boutpp(CMakePackage): "lapack", "raja", "scorep", + "sundials", "umpire", ] for dep in simple_dependencies: depends_on(dep, type=("build", "link"), when=f"+{dep}") - # Other dependencies derived from variants + # Other dependencies affected by variants depends_on("netcdf-cxx4", type=("build", "link"), when="+netcdf") depends_on("petsc+hypre+mpi~debug~fortran", type=("build", "link"), when="+petsc") - - # depends_on("python", type=("build", "link"), when="+python") - # depends_on("py-cython", type=("build", "link"), when="+python") - # depends_on("py-numpy", type=("build", "link"), when="+python") + depends_on("python", type=("build", "link"), when="+python") + depends_on("py-cython", type=("build", "link"), when="+python") + depends_on("py-jinja2", type=("build", "link"), when="+python") + depends_on("py-numpy", type=("build", "link"), when="+python") def cmake_args(self): # Definitions controlled by variants From ab2cbb2d161df065a37425f48aa98147aaed755f Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Thu, 17 Jul 2025 16:52:26 +0100 Subject: [PATCH 04/35] Tidy up hermes-3 package and remove old variants. --- packages/hermes-3/package.py | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/packages/hermes-3/package.py b/packages/hermes-3/package.py index d2cb2c5..87f6a17 100644 --- a/packages/hermes-3/package.py +++ b/packages/hermes-3/package.py @@ -3,7 +3,7 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) -from spack import * +from spack.package import CMakePackage, depends_on, maintainers, variant, version class Hermes3(CMakePackage): @@ -48,9 +48,6 @@ class Hermes3(CMakePackage): "xhermes", default=True, description="Builds xhermes (required for some tests)." ) - # Always-required dependencies - # depends_on("adios2", type=("build", "link")) - depends_on("cmake@3.24:", type="build") depends_on("fftw", type=("build", "link")) depends_on("mpi", type=("build", "link", "run")) @@ -58,9 +55,7 @@ class Hermes3(CMakePackage): depends_on("netcdf-cxx4", type=("build", "link")) # Variant-controlled dependencies - depends_on("petsc+hypre+mpi~debug~fortran", when="+petsc", type=("build", "link")) depends_on("py-xhermes", when="+xhermes", type=("run")) - depends_on("sundials", when="+sundials", type=("build", "link")) def cmake_args(self): # Definitions controlled by variants From 36ec207309f56b72e65f1a0c0284246ba02192ce Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 22 Jul 2025 10:31:56 +0100 Subject: [PATCH 05/35] Add variants to cover more bout cmake options. Match the default values where possible. --- packages/boutpp/package.py | 32 +++++++++++++++++++++++++------- 1 file changed, 25 insertions(+), 7 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index bd0def1..7d50fe2 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -61,6 +61,7 @@ class Boutpp(CMakePackage): multi=True, ) variant("cuda", default=False, description="Builds with CUDA support.") + variant("fftw", default=True, description="Builds with FFTW support.") variant("hypre", default=False, description="Builds with Hypre support.") variant("lapack", default=False, description="Builds with LAPACK support.") variant("metric3d", default=False, description="Enable 3D metric support.") @@ -70,23 +71,28 @@ class Boutpp(CMakePackage): variant("pvode", default=False, description="Builds with PVODE support.") variant("python", default=False, description="Builds with Python support.") variant("raja", default=False, description="Builds with RAJA support.") + variant("sanitize_address", default=False, description="Enable address sanitizer.") + variant("sanitize_leak", default=False, description="Enable leak sanitizer.") + variant("sanitize_memory", default=False, description="Enable memory sanitizer.") + variant("sanitize_thread", default=False, description="Enable thread sanitizer.") + variant( + "sanitize_undefined", + default=False, + description="Enable undefined behavior sanitizer.", + ) variant("scorep", default=False, description="Builds with Score-P support.") variant("slepc", default=False, description="Builds with SLEPC support.") variant("shared", default=True, description="Build shared libraries.") variant("sigfpe", default=False, description="Signal floating point exceptions.") variant("signal", default=True, description="Signal handling.") - variant("sundials", default=True, description="Builds with SUNDIALS support.") + variant("sundials", default=False, description="Builds with SUNDIALS support.") variant("track", default=True, description="Enable field name tracking.") variant("umpire", default=False, description="Builds with Umpire support.") - # BOUT_GENERATE_FIELDOPS (ON if python, clang-format found, OFF otherwise) "Automatically re-generate the Field arithmetic operators from the Python templates." (requires + python) - # BOUT_ENABLE_WARNINGS(ON) Leave alone? - # Fixed dependencies depends_on("c", type="build") depends_on("cxx", type="build") depends_on("cmake@3.17:", type="build") - depends_on("fftw", type=("build", "link")) depends_on("mpi", type=("build", "link", "run")) # Simple build dependencies - those derived from variants with the same name and no special variant options of their own @@ -94,6 +100,7 @@ class Boutpp(CMakePackage): "adios2", "caliper", "cuda", + "fftw", "hypre", "lapack", "raja", @@ -120,18 +127,28 @@ def cmake_args(self): "BOUT_BUILD_DOCS": "builddocs", "BOUT_BUILD_EXAMPLES": "buildexamples", "BOUT_ENABLE_CALIPER": "caliper", - "BOUT_USE_PVODE": "pvode", + "CHECK": "check", + "BOUT_ENABLE_CUDA": "cuda", "BOUT_USE_HYPRE": "hypre", + "BOUT_USE_LAPACK": "lapack", "BOUT_ENABLE_METRIC_3D": "metric3d", "BOUT_USE_NETCDF": "netcdf", "BOUT_ENABLE_OPENMP": "openmp", "BOUT_USE_PETSC": "petsc", "BOUT_USE_PVODE": "pvode", + "BOUT_ENABLE_PYTHON": "python", "BOUT_ENABLE_RAJA": "raja", - "BOUT_USE_SUNDIALS": "sundials", + "ENABLE_SANITIZER_ADDRESS": "sanitize_address", + "ENABLE_SANITIZER_LEAK": "sanitize_leak", + "ENABLE_SANITIZER_MEMORY": "sanitize_memory", + "ENABLE_SANITIZER_THREAD": "sanitize_thread", + "ENABLE_SANITIZER_UNDEFINED_BEH": "sanitize_undefined", + "BOUT_USE_SCOREP": "scorep", "BOUT_USE_SLEPC": "slepc", "BUILD_SHARED_LIBS": "shared", + "BOUT_ENABLE_SIGFPE": "sigfpe", "BOUT_ENABLE_SIGNAL": "signal", + "BOUT_USE_SUNDIALS": "sundials", "BOUT_ENABLE_TRACK": "track", "BOUT_ENABLE_UMPIRE": "umpire", } @@ -157,6 +174,7 @@ def cmake_args(self): self.define("BOUT_DOWNLOAD_NETCDF_CXX4", False), self.define("BOUT_DOWNLOAD_SUNDIALS", False), self.define("BOUT_ENABLE_MPI", True), + self.define("BOUT_GENERATE_FIELDOPS", False), self.define("INSTALL_GTEST", False), self.define("BOUT_UPDATE_GIT_SUBMODULE", True), ] From 7262147aef3dbf23f211dd0152c5db49c7c9f553 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Mon, 28 Jul 2025 08:48:00 +0100 Subject: [PATCH 06/35] Remove temporary cmake patch (fixed on bout/master at f264632638c1d1affd17bc595900ac269708c008 and on bout/next at bcfde74a43c82771ff2970df980e2e450191778f). --- packages/boutpp/enable_c.patch | 13 ------------- packages/boutpp/package.py | 4 ---- 2 files changed, 17 deletions(-) delete mode 100644 packages/boutpp/enable_c.patch diff --git a/packages/boutpp/enable_c.patch b/packages/boutpp/enable_c.patch deleted file mode 100644 index 383e2b9..0000000 --- a/packages/boutpp/enable_c.patch +++ /dev/null @@ -1,13 +0,0 @@ -diff --git a/CMakeLists.txt b/CMakeLists.txt -index 60d34e1ad..9dc804d50 100644 ---- a/CMakeLists.txt -+++ b/CMakeLists.txt -@@ -51,7 +51,7 @@ message(STATUS "Configuring BOUT++ version ${BOUT_FULL_VERSION}") - project(BOUT++ - DESCRIPTION "Fluid PDE solver framework" - VERSION ${BOUT_CMAKE_ACCEPTABLE_VERSION} -- LANGUAGES CXX) -+ LANGUAGES C CXX) - - include(CMakeDependentOption) - diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 7d50fe2..cc5106c 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -36,10 +36,6 @@ class Boutpp(CMakePackage): version("4.2.1", branch="origin/v4.2.1-rc", submodules=True) version("4.2.0", branch="origin/v4.2-rc", submodules=True) - # Patches - # Use patch from Tom B's Docker setup to work around 'missing: MPI_C_FOUND C' issue - patch("enable_c.patch") - # Variants variant("adios2", default=False, description="Builds with ADIOS2 support.") variant("backtrace", default=True, description="Enable backtrace.") From 3117f9b93edc10570c91ad64dea748c9f68318a1 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 26 Nov 2025 11:23:50 +0000 Subject: [PATCH 07/35] Remove old petsc, sundials variants --- packages/hermes-3/package.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/hermes-3/package.py b/packages/hermes-3/package.py index 87f6a17..ba6b06e 100644 --- a/packages/hermes-3/package.py +++ b/packages/hermes-3/package.py @@ -34,16 +34,6 @@ class Hermes3(CMakePackage): values=("MC", "MinMod"), multi=False, ) - variant( - "petsc", - default=False, - description="Builds boutpp dependency with PETSc support.", - ) - variant( - "sundials", - default=True, - description="Builds boutpp dependency with SUNDIALS support.", - ) variant( "xhermes", default=True, description="Builds xhermes (required for some tests)." ) From 68528bc1646220244087a7c1b50b7e0c869b5071 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 26 Nov 2025 14:20:57 +0000 Subject: [PATCH 08/35] Make Python a 'simple dependency'. --- packages/boutpp/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index cc5106c..2cb574f 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -99,6 +99,7 @@ class Boutpp(CMakePackage): "fftw", "hypre", "lapack", + "python", "raja", "scorep", "sundials", @@ -110,7 +111,6 @@ class Boutpp(CMakePackage): # Other dependencies affected by variants depends_on("netcdf-cxx4", type=("build", "link"), when="+netcdf") depends_on("petsc+hypre+mpi~debug~fortran", type=("build", "link"), when="+petsc") - depends_on("python", type=("build", "link"), when="+python") depends_on("py-cython", type=("build", "link"), when="+python") depends_on("py-jinja2", type=("build", "link"), when="+python") depends_on("py-numpy", type=("build", "link"), when="+python") From 6430d0967a0c8538ae123234aa81fd04a1846d28 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 26 Nov 2025 14:06:22 +0000 Subject: [PATCH 09/35] Add pass-through variants for PETSc. --- packages/boutpp/package.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 2cb574f..5a3ae7b 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -85,6 +85,11 @@ class Boutpp(CMakePackage): variant("track", default=True, description="Enable field name tracking.") variant("umpire", default=False, description="Builds with Umpire support.") + # Variants that exist purely for easy pass-through to PETSc + variant("mumps", default=False, description="Build PETSc dependency with MUMPS.") + variant("strumpack", default=False, description="Build PETSc dependency with STRUMPACK.") + variant("superlu-dist", default=False, description="Build PETSc dependency with SuperLU_DIST.") + # Fixed dependencies depends_on("c", type="build") depends_on("cxx", type="build") @@ -110,11 +115,15 @@ class Boutpp(CMakePackage): # Other dependencies affected by variants depends_on("netcdf-cxx4", type=("build", "link"), when="+netcdf") - depends_on("petsc+hypre+mpi~debug~fortran", type=("build", "link"), when="+petsc") depends_on("py-cython", type=("build", "link"), when="+python") depends_on("py-jinja2", type=("build", "link"), when="+python") depends_on("py-numpy", type=("build", "link"), when="+python") + # Handle PETSc separately, passing through particular variants + depends_on("petsc+mpi", type=("build", "link"), when="+petsc") + for petsc_var in ["hypre","mumps","strumpack","superlu-dist"]: + depends_on(f"petsc+mpi+{petsc_var}", type=("build", "link"), when=f"+petsc+{petsc_var}") + def cmake_args(self): # Definitions controlled by variants variant_defs = { From fec5011cd5b963fb4ef69723abf2d6889ed2ce67 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 26 Nov 2025 14:59:05 +0000 Subject: [PATCH 10/35] Fix logic for setting BOUT_USE_PETSC. --- packages/boutpp/package.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 5a3ae7b..5af3727 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -139,7 +139,6 @@ def cmake_args(self): "BOUT_ENABLE_METRIC_3D": "metric3d", "BOUT_USE_NETCDF": "netcdf", "BOUT_ENABLE_OPENMP": "openmp", - "BOUT_USE_PETSC": "petsc", "BOUT_USE_PVODE": "pvode", "BOUT_ENABLE_PYTHON": "python", "BOUT_ENABLE_RAJA": "raja", @@ -166,6 +165,9 @@ def cmake_args(self): "BOUT_TESTS", self.spec.variants["buildtests"].value[0] != "none" ) ) + petsc_variants_enabled = self.spec.variants["petsc"] or self.spec.variants["mumps"] or self.spec.variants["strumpack"] or self.spec.variants["superlu-dist"] + variant_args.append(self.define("BOUT_USE_PETSC",petsc_variants_enabled)) + variant_args.append( self.define( "BOUT_ENABLE_ALL_TESTS", From fec3d5d6d07744e0985ced9e3a4444ad7e5410a5 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 26 Nov 2025 14:59:19 +0000 Subject: [PATCH 11/35] Fix PETSc variant passthrough. --- packages/boutpp/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 5af3727..bbda445 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -122,7 +122,7 @@ class Boutpp(CMakePackage): # Handle PETSc separately, passing through particular variants depends_on("petsc+mpi", type=("build", "link"), when="+petsc") for petsc_var in ["hypre","mumps","strumpack","superlu-dist"]: - depends_on(f"petsc+mpi+{petsc_var}", type=("build", "link"), when=f"+petsc+{petsc_var}") + depends_on(f"petsc+mpi+{petsc_var}", type=("build", "link"), when=f"+{petsc_var}") def cmake_args(self): # Definitions controlled by variants From cc2341e05bef6809f7f234a8785f7056a68e7645 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 19 Dec 2025 16:47:56 +0000 Subject: [PATCH 12/35] Set boutpp maintainer. --- packages/boutpp/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index bbda445..1dea855 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -15,7 +15,7 @@ class Boutpp(CMakePackage): git = "https://github.com/boutproject/BOUT-dev" url = "https://github.com/boutproject/BOUT-dev/releases/download/v5.1.0/BOUT++-v5.1.0.tar.gz" - # maintainers("bendudson") + maintainers("oparry-ukaea") license("LGPL-3.0-only") From d684e8ed8847f7bdbc5b18029219a3209f256b45 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 19 Dec 2025 16:48:40 +0000 Subject: [PATCH 13/35] black format boutpp package file. --- packages/boutpp/package.py | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 1dea855..f5e31af 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -87,8 +87,14 @@ class Boutpp(CMakePackage): # Variants that exist purely for easy pass-through to PETSc variant("mumps", default=False, description="Build PETSc dependency with MUMPS.") - variant("strumpack", default=False, description="Build PETSc dependency with STRUMPACK.") - variant("superlu-dist", default=False, description="Build PETSc dependency with SuperLU_DIST.") + variant( + "strumpack", default=False, description="Build PETSc dependency with STRUMPACK." + ) + variant( + "superlu-dist", + default=False, + description="Build PETSc dependency with SuperLU_DIST.", + ) # Fixed dependencies depends_on("c", type="build") @@ -121,8 +127,10 @@ class Boutpp(CMakePackage): # Handle PETSc separately, passing through particular variants depends_on("petsc+mpi", type=("build", "link"), when="+petsc") - for petsc_var in ["hypre","mumps","strumpack","superlu-dist"]: - depends_on(f"petsc+mpi+{petsc_var}", type=("build", "link"), when=f"+{petsc_var}") + for petsc_var in ["hypre", "mumps", "strumpack", "superlu-dist"]: + depends_on( + f"petsc+mpi+{petsc_var}", type=("build", "link"), when=f"+{petsc_var}" + ) def cmake_args(self): # Definitions controlled by variants @@ -165,8 +173,13 @@ def cmake_args(self): "BOUT_TESTS", self.spec.variants["buildtests"].value[0] != "none" ) ) - petsc_variants_enabled = self.spec.variants["petsc"] or self.spec.variants["mumps"] or self.spec.variants["strumpack"] or self.spec.variants["superlu-dist"] - variant_args.append(self.define("BOUT_USE_PETSC",petsc_variants_enabled)) + petsc_variants_enabled = ( + self.spec.variants["petsc"] + or self.spec.variants["mumps"] + or self.spec.variants["strumpack"] + or self.spec.variants["superlu-dist"] + ) + variant_args.append(self.define("BOUT_USE_PETSC", petsc_variants_enabled)) variant_args.append( self.define( From 6946d90ec1033ca7ba872997a3fc09089552833b Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Fri, 19 Dec 2025 16:53:37 +0000 Subject: [PATCH 14/35] Disable boutpp strumpack variant for now. --- packages/boutpp/package.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index f5e31af..006bfb0 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -87,9 +87,11 @@ class Boutpp(CMakePackage): # Variants that exist purely for easy pass-through to PETSc variant("mumps", default=False, description="Build PETSc dependency with MUMPS.") - variant( - "strumpack", default=False, description="Build PETSc dependency with STRUMPACK." - ) + + # Disable STRUMPACK support for now; numpy build fails - might be related to https://github.com/spack/spack-packages/issues/953 + # variant( + # "strumpack", default=False, description="Build PETSc dependency with STRUMPACK." + # ) variant( "superlu-dist", default=False, @@ -127,7 +129,7 @@ class Boutpp(CMakePackage): # Handle PETSc separately, passing through particular variants depends_on("petsc+mpi", type=("build", "link"), when="+petsc") - for petsc_var in ["hypre", "mumps", "strumpack", "superlu-dist"]: + for petsc_var in ["hypre", "mumps", "superlu-dist"]: depends_on( f"petsc+mpi+{petsc_var}", type=("build", "link"), when=f"+{petsc_var}" ) @@ -176,7 +178,6 @@ def cmake_args(self): petsc_variants_enabled = ( self.spec.variants["petsc"] or self.spec.variants["mumps"] - or self.spec.variants["strumpack"] or self.spec.variants["superlu-dist"] ) variant_args.append(self.define("BOUT_USE_PETSC", petsc_variants_enabled)) From a62e2fe8331954bb7fcda6dbd9b5084ce4584454 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 20 Jan 2026 13:27:34 +0000 Subject: [PATCH 15/35] Set minimum PETSc version as 3.23 for boutpp. --- packages/boutpp/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 006bfb0..ccd3ffe 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -128,7 +128,7 @@ class Boutpp(CMakePackage): depends_on("py-numpy", type=("build", "link"), when="+python") # Handle PETSc separately, passing through particular variants - depends_on("petsc+mpi", type=("build", "link"), when="+petsc") + depends_on("petsc+mpi@3.23:", type=("build", "link"), when="+petsc") for petsc_var in ["hypre", "mumps", "superlu-dist"]: depends_on( f"petsc+mpi+{petsc_var}", type=("build", "link"), when=f"+{petsc_var}" From 0d904d52e5e5a19d48c75ef9215e9d30e591c27c Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 20 Jan 2026 13:52:56 +0000 Subject: [PATCH 16/35] Limit SUNDIALS to versions between 2.6 and 6.7.0 for boutpp. --- packages/boutpp/package.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index ccd3ffe..bcb3f5c 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -104,8 +104,9 @@ class Boutpp(CMakePackage): depends_on("cmake@3.17:", type="build") depends_on("mpi", type=("build", "link", "run")) - # Simple build dependencies - those derived from variants with the same name and no special variant options of their own - simple_dependencies = [ + # Simple build dependencies + # Derived from variants with the same name, an optional version specifier, but no special variant options of their own + simple_deps = [ "adios2", "caliper", "cuda", @@ -118,8 +119,10 @@ class Boutpp(CMakePackage): "sundials", "umpire", ] - for dep in simple_dependencies: - depends_on(dep, type=("build", "link"), when=f"+{dep}") + simple_dep_versions = {"sundials": "@2.6:6.7.0"} + for dep in simple_deps: + dep_spec = dep if not dep in simple_dep_versions else f"{dep}@{simple_dep_versions[dep]}" + depends_on(dep_spec, type=("build", "link"), when=f"+{dep}") # Other dependencies affected by variants depends_on("netcdf-cxx4", type=("build", "link"), when="+netcdf") From e086cd3170975c125794f0575c9d849eca06eb48 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 20 Jan 2026 14:14:06 +0000 Subject: [PATCH 17/35] Use tags rather than release branches for boutpp versions. Remove versions <5 that didn't use CMake. --- packages/boutpp/package.py | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index bcb3f5c..fec12aa 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -22,19 +22,10 @@ class Boutpp(CMakePackage): version("develop", branch="develop", submodules=True) version("master", branch="master", submodules=True, preferred=True) - version("5.1.1", branch="origin/v5.1.1-rc", submodules=True) - version("5.1.0", branch="origin/v5.1.0-rc", submodules=True) - version("5.1.0", branch="origin/v5.0.0-rc", submodules=True) - version("4.4.2", branch="origin/v4.4.2-rc", submodules=True) - version("4.4.1", branch="origin/v4.4.1-rc", submodules=True) - version("4.3.3", branch="origin/v4.3.3-rc", submodules=True) - version("4.3.2", branch="origin/v4.3.2-rc", submodules=True) - version("4.3.1", branch="origin/v4.3.1-rc", submodules=True) - version("4.3.0", branch="origin/v4.3.0-rc", submodules=True) - version("4.2.3", branch="origin/v4.2.3-rc", submodules=True) - version("4.2.2", branch="origin/v4.2.2-rc", submodules=True) - version("4.2.1", branch="origin/v4.2.1-rc", submodules=True) - version("4.2.0", branch="origin/v4.2-rc", submodules=True) + # Include tagged versions that use CMake (5.0.0 onwards) + tagged_versions = ["5.0.0", "5.1.0", "5.1.1", "5.2.0"] + for v in tagged_versions: + version(v, tag=f"v{v}", submodules=True) # Variants variant("adios2", default=False, description="Builds with ADIOS2 support.") From 5877277f940293a3746c85c20621cc07215d3e39 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 20 Jan 2026 14:24:01 +0000 Subject: [PATCH 18/35] Remove unnecessary "pvode" variant. --- packages/boutpp/package.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index fec12aa..66cdd11 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -55,7 +55,6 @@ class Boutpp(CMakePackage): variant("netcdf", default=True, description="Enable support for NetCDF output.") variant("openmp", default=False, description="Enable OpenMP support.") variant("petsc", default=False, description="Builds with PETSc support.") - variant("pvode", default=False, description="Builds with PVODE support.") variant("python", default=False, description="Builds with Python support.") variant("raja", default=False, description="Builds with RAJA support.") variant("sanitize_address", default=False, description="Enable address sanitizer.") @@ -143,7 +142,6 @@ def cmake_args(self): "BOUT_ENABLE_METRIC_3D": "metric3d", "BOUT_USE_NETCDF": "netcdf", "BOUT_ENABLE_OPENMP": "openmp", - "BOUT_USE_PVODE": "pvode", "BOUT_ENABLE_PYTHON": "python", "BOUT_ENABLE_RAJA": "raja", "ENABLE_SANITIZER_ADDRESS": "sanitize_address", From 56e25d6c255e7138e9bd659a0902b0e75bf38575 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 20 Jan 2026 14:36:15 +0000 Subject: [PATCH 19/35] Associate boutpp@develop with the 'next' branch. --- packages/boutpp/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 66cdd11..08d5804 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -19,7 +19,7 @@ class Boutpp(CMakePackage): license("LGPL-3.0-only") - version("develop", branch="develop", submodules=True) + version("develop", branch="next", submodules=True) version("master", branch="master", submodules=True, preferred=True) # Include tagged versions that use CMake (5.0.0 onwards) From 4c42f61d9d7deca35259d5d627b36aa069996a3e Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 20 Jan 2026 14:55:46 +0000 Subject: [PATCH 20/35] Fix typo. --- packages/boutpp/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 08d5804..5e48069 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -109,7 +109,7 @@ class Boutpp(CMakePackage): "sundials", "umpire", ] - simple_dep_versions = {"sundials": "@2.6:6.7.0"} + simple_dep_versions = {"sundials": "2.6:6.7.0"} for dep in simple_deps: dep_spec = dep if not dep in simple_dep_versions else f"{dep}@{simple_dep_versions[dep]}" depends_on(dep_spec, type=("build", "link"), when=f"+{dep}") From 23234fd70fbd81f0523e5a05c35a32021ee10371 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 20 Jan 2026 16:48:57 +0000 Subject: [PATCH 21/35] Fix logic for setting BOUT_USE_PETSC. --- packages/boutpp/package.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 5e48069..351156e 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -168,9 +168,9 @@ def cmake_args(self): ) ) petsc_variants_enabled = ( - self.spec.variants["petsc"] - or self.spec.variants["mumps"] - or self.spec.variants["superlu-dist"] + self.spec.variants["petsc"].value + or self.spec.variants["mumps"].value + or self.spec.variants["superlu-dist"].value ) variant_args.append(self.define("BOUT_USE_PETSC", petsc_variants_enabled)) From 477cc99416a4d9db3c2e628c7ba38c5dadd61aa0 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 20 Jan 2026 16:15:40 +0000 Subject: [PATCH 22/35] Limit PETSc to versions between 3.7 and 3.22 for boutpp. --- packages/boutpp/package.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 351156e..a5207a0 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -121,7 +121,7 @@ class Boutpp(CMakePackage): depends_on("py-numpy", type=("build", "link"), when="+python") # Handle PETSc separately, passing through particular variants - depends_on("petsc+mpi@3.23:", type=("build", "link"), when="+petsc") + depends_on("petsc@3.7:3.23+mpi", type=("build", "link"), when="+petsc") for petsc_var in ["hypre", "mumps", "superlu-dist"]: depends_on( f"petsc+mpi+{petsc_var}", type=("build", "link"), when=f"+{petsc_var}" From 0eed3590568bf38dcbead141966f68bca9ae6e06 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Tue, 20 Jan 2026 17:00:10 +0000 Subject: [PATCH 23/35] Better comments in boutpp/package.py --- packages/boutpp/package.py | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index a5207a0..67f747d 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -162,11 +162,8 @@ def cmake_args(self): self.define_from_variant(def_str, var_str) for def_str, var_str in variant_defs.items() ] - variant_args.append( - self.define( - "BOUT_TESTS", self.spec.variants["buildtests"].value[0] != "none" - ) - ) + + # Enable PETSc if any of the PETSc-component variants are enabled petsc_variants_enabled = ( self.spec.variants["petsc"].value or self.spec.variants["mumps"].value @@ -174,6 +171,13 @@ def cmake_args(self): ) variant_args.append(self.define("BOUT_USE_PETSC", petsc_variants_enabled)) + # Build tests unless variant buildtests=none + variant_args.append( + self.define( + "BOUT_TESTS", self.spec.variants["buildtests"].value[0] != "none" + ) + ) + # Build ALL tests if variant buildtests=all variant_args.append( self.define( "BOUT_ENABLE_ALL_TESTS", @@ -181,7 +185,7 @@ def cmake_args(self): ) ) - # Fixed definitions + # Always use these definitions fixed_args = [ self.define("BOUT_DOWNLOAD_ADIOS2", False), self.define("BOUT_DOWNLOAD_NETCDF_CXX4", False), @@ -191,7 +195,6 @@ def cmake_args(self): self.define("INSTALL_GTEST", False), self.define("BOUT_UPDATE_GIT_SUBMODULE", True), ] - # There are problems with how CMake finds the glibc/standalone versions # of gettext (see # https://github.com/boutproject/hermes-3/issues/356#issuecomment-2999715879). From 9a7032999499d748aba8e808aecf18ceff4a3309 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 21 Jan 2026 08:45:02 +0000 Subject: [PATCH 24/35] black format --- packages/boutpp/package.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 67f747d..4ed01b1 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -111,7 +111,11 @@ class Boutpp(CMakePackage): ] simple_dep_versions = {"sundials": "2.6:6.7.0"} for dep in simple_deps: - dep_spec = dep if not dep in simple_dep_versions else f"{dep}@{simple_dep_versions[dep]}" + dep_spec = ( + dep + if not dep in simple_dep_versions + else f"{dep}@{simple_dep_versions[dep]}" + ) depends_on(dep_spec, type=("build", "link"), when=f"+{dep}") # Other dependencies affected by variants From a8977c002084e6c5f9be5db262ca2d12f9b446ca Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 21 Jan 2026 10:17:03 +0000 Subject: [PATCH 25/35] Set different max PETSc version for boutpp@5.0.0 . --- packages/boutpp/package.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 4ed01b1..908cdda 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -124,12 +124,20 @@ class Boutpp(CMakePackage): depends_on("py-jinja2", type=("build", "link"), when="+python") depends_on("py-numpy", type=("build", "link"), when="+python") - # Handle PETSc separately, passing through particular variants - depends_on("petsc@3.7:3.23+mpi", type=("build", "link"), when="+petsc") + # PETSc is more complicated: + + # Require PETSc with MPI if any PETSc-related variant is enabled + depends_on("petsc+mpi", type=("build", "link"), when="+petsc") + # Pass through PETSc component variants for petsc_var in ["hypre", "mumps", "superlu-dist"]: - depends_on( - f"petsc+mpi+{petsc_var}", type=("build", "link"), when=f"+{petsc_var}" - ) + depends_on(f"petsc+{petsc_var}", type=("build", "link"), when=f"+{petsc_var}") + + # Supported PETSc version range across all BOUT versions: + depends_on("petsc@3.7:3.23", type=("build", "link")) + # Max PETSc version for BOUT v5.0.0: + depends_on("petsc@:3.17", type=("build", "link"), when="@5.0.0") + # Max PETSc version for BOUT v5.1.x: + # depends_on("petsc@:3.19", type=("build", "link"), when="@5.1") def cmake_args(self): # Definitions controlled by variants From 41b4d078eec8e38b527c53022cd1e6781525aed5 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 21 Jan 2026 10:17:42 +0000 Subject: [PATCH 26/35] Patch boutpp third party CMake. --- .../boutpp/fix_thirdparty_cmake_v5.0.0.patch | 225 ++++++++++++++++++ .../boutpp/fix_thirdparty_cmake_v5.1.x.patch | 24 ++ packages/boutpp/package.py | 6 +- 3 files changed, 254 insertions(+), 1 deletion(-) create mode 100644 packages/boutpp/fix_thirdparty_cmake_v5.0.0.patch create mode 100644 packages/boutpp/fix_thirdparty_cmake_v5.1.x.patch diff --git a/packages/boutpp/fix_thirdparty_cmake_v5.0.0.patch b/packages/boutpp/fix_thirdparty_cmake_v5.0.0.patch new file mode 100644 index 0000000..a13aa44 --- /dev/null +++ b/packages/boutpp/fix_thirdparty_cmake_v5.0.0.patch @@ -0,0 +1,225 @@ +diff --git a/cmake/FindnetCDF.cmake b/cmake/FindnetCDF.cmake +index 824fb4a3c2..42dae86b14 100644 +--- a/cmake/FindnetCDF.cmake ++++ b/cmake/FindnetCDF.cmake +@@ -3,139 +3,138 @@ + # + # Find the netCDF IO library + # +-# This module uses the ``nc-config`` helper script as a hint for the +-# location of the netCDF libraries. It should be in your PATH. ++# This module uses the ``nc-config`` helper script as a hint for the location of ++# the netCDF libraries. It should be in your PATH. + # + # This module will define the following variables: + # + # :: + # +-# netCDF_FOUND - true if netCDF was found +-# netCDF_VERSION - netCDF version in format Major.Minor.Release +-# netCDF_INCLUDE_DIRS - Location of the netCDF includes +-# netCDF_LIBRARIES - Required libraries ++# netCDF_FOUND - true if netCDF was found netCDF_VERSION - netCDF version in ++# format Major.Minor.Release netCDF_INCLUDE_DIRS - Location of the netCDF ++# includes netCDF_LIBRARIES - Required libraries + # + # This module will also export the ``netCDF::netcdf`` target. + # + # You can also set the following variables: + # +-# ``netCDF_ROOT`` +-# Specify the path to the netCDF installation to use ++# ``netCDF_ROOT`` Specify the path to the netCDF installation to use + # +-# ``netCDF_DEBUG`` +-# Set to TRUE to get extra debugging output ++# ``netCDF_DEBUG`` Set to TRUE to get extra debugging output + + include(BOUT++functions) + include(CMakePrintHelpers) + ++if(NOT netCDF_ROOT AND EXISTS "${BOUT_USE_NETCDF}") ++ set(netCDF_ROOT "${BOUT_USE_NETCDF}") ++endif() ++ ++enable_language(C) + find_package(netCDF QUIET CONFIG) + +-if (netCDF_FOUND) ++if(netCDF_FOUND) + message(STATUS "netCDF CONFIG found") + set(netCDF_FOUND TRUE) +- if (NOT TARGET netCDF::netcdf) ++ if(NOT TARGET netCDF::netcdf) + bout_add_library_alias(netCDF::netcdf netcdf) + endif() +- if (netCDF_DEBUG) +- cmake_print_properties(TARGETS netcdf PROPERTIES LOCATION VERSION) +- endif (netCDF_DEBUG) ++ if(netCDF_DEBUG) ++ cmake_print_properties(TARGETS netcdf PROPERTIES LOCATION VERSION) ++ endif(netCDF_DEBUG) + return() + endif() + +-find_program(NC_CONFIG "nc-config" ++find_program( ++ NC_CONFIG "nc-config" + PATHS "${netCDF_ROOT}" + PATH_SUFFIXES bin + DOC "Path to netCDF C config helper" +- NO_DEFAULT_PATH +- ) ++ NO_DEFAULT_PATH) + +-find_program(NC_CONFIG "nc-config" +- DOC "Path to netCDF C config helper" +- ) ++find_program(NC_CONFIG "nc-config" DOC "Path to netCDF C config helper") + + get_filename_component(NC_CONFIG_TMP "${NC_CONFIG}" DIRECTORY) + get_filename_component(NC_CONFIG_LOCATION "${NC_CONFIG_TMP}" DIRECTORY) +-if (netCDF_DEBUG) ++if(netCDF_DEBUG) + message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " +- " NC_CONFIG_LOCATION = ${NC_CONFIG_LOCATION}" +- " netCDF_ROOT = ${netCDF_ROOT}") ++ " NC_CONFIG_LOCATION = ${NC_CONFIG_LOCATION}" ++ " netCDF_ROOT = ${netCDF_ROOT}") + endif() + + bout_inspect_netcdf_config(NC_HINTS_INCLUDE_DIR "${NC_CONFIG}" "--includedir") + bout_inspect_netcdf_config(NC_HINTS_PREFIX "${NC_CONFIG}" "--prefix") + +-find_path(netCDF_C_INCLUDE_DIR ++find_path( ++ netCDF_C_INCLUDE_DIR + NAMES netcdf.h + DOC "netCDF C include directories" +- HINTS +- "${NC_HINTS_INCLUDE_DIR}" +- "${NC_HINTS_PREFIX}" +- "${NC_CONFIG_LOCATION}" +- PATH_SUFFIXES +- "include" +- ) +-if (netCDF_DEBUG) +- message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " +- " netCDF_C_INCLUDE_DIR = ${netCDF_C_INCLUDE_DIR}" +- " NC_HINTS_INCLUDE_DIR = ${NC_HINTS_INCLUDE_DIR}" +- " NC_HINTS_PREFIX = ${NC_HINTS_PREFIX}" +- ) ++ HINTS "${NC_HINTS_INCLUDE_DIR}" "${NC_HINTS_PREFIX}" "${NC_CONFIG_LOCATION}" ++ PATH_SUFFIXES "include") ++if(netCDF_DEBUG) ++ message( ++ STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " ++ " netCDF_C_INCLUDE_DIR = ${netCDF_C_INCLUDE_DIR}" ++ " NC_HINTS_INCLUDE_DIR = ${NC_HINTS_INCLUDE_DIR}" ++ " NC_HINTS_PREFIX = ${NC_HINTS_PREFIX}") + endif() + mark_as_advanced(netCDF_C_INCLUDE_DIR) + +-find_library(netCDF_C_LIBRARY ++find_library( ++ netCDF_C_LIBRARY + NAMES netcdf + DOC "netCDF C library" +- HINTS +- "${NC_HINTS_INCLUDE_DIR}" +- "${NC_HINTS_PREFIX}" +- "${NC_CONFIG_LOCATION}" +- PATH_SUFFIXES +- "lib" "lib64" +- ) +-if (netCDF_DEBUG) +- message(STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " +- " netCDF_C_LIBRARY = ${netCDF_C_LIBRARY}" +- " NC_HINTS_INCLUDE_DIR = ${NC_HINTS_INCLUDE_DIR}" +- " NC_HINTS_PREFIX = ${NC_HINTS_PREFIX}" +- ) ++ HINTS "${NC_HINTS_INCLUDE_DIR}" "${NC_HINTS_PREFIX}" "${NC_CONFIG_LOCATION}" ++ PATH_SUFFIXES "lib" "lib64") ++if(netCDF_DEBUG) ++ message( ++ STATUS "[ ${CMAKE_CURRENT_LIST_FILE}:${CMAKE_CURRENT_LIST_LINE} ] " ++ " netCDF_C_LIBRARY = ${netCDF_C_LIBRARY}" ++ " NC_HINTS_INCLUDE_DIR = ${NC_HINTS_INCLUDE_DIR}" ++ " NC_HINTS_PREFIX = ${NC_HINTS_PREFIX}") + endif() + mark_as_advanced(netCDF_C_LIBRARY) + +-if (netCDF_C_INCLUDE_DIR) ++if(netCDF_C_INCLUDE_DIR) + file(STRINGS "${netCDF_C_INCLUDE_DIR}/netcdf_meta.h" _netcdf_version_lines +- REGEX "#define[ \t]+NC_VERSION_(MAJOR|MINOR|PATCH|NOTE)") +- string(REGEX REPLACE ".*NC_VERSION_MAJOR *\([0-9]*\).*" "\\1" _netcdf_version_major "${_netcdf_version_lines}") +- string(REGEX REPLACE ".*NC_VERSION_MINOR *\([0-9]*\).*" "\\1" _netcdf_version_minor "${_netcdf_version_lines}") +- string(REGEX REPLACE ".*NC_VERSION_PATCH *\([0-9]*\).*" "\\1" _netcdf_version_patch "${_netcdf_version_lines}") +- string(REGEX REPLACE ".*NC_VERSION_NOTE *\"\([^\"]*\)\".*" "\\1" _netcdf_version_note "${_netcdf_version_lines}") +- if (NOT _netcdf_version_note STREQUAL "") ++ REGEX "#define[ \t]+NC_VERSION_(MAJOR|MINOR|PATCH|NOTE)") ++ string(REGEX REPLACE ".*NC_VERSION_MAJOR *\([0-9]*\).*" "\\1" ++ _netcdf_version_major "${_netcdf_version_lines}") ++ string(REGEX REPLACE ".*NC_VERSION_MINOR *\([0-9]*\).*" "\\1" ++ _netcdf_version_minor "${_netcdf_version_lines}") ++ string(REGEX REPLACE ".*NC_VERSION_PATCH *\([0-9]*\).*" "\\1" ++ _netcdf_version_patch "${_netcdf_version_lines}") ++ string(REGEX REPLACE ".*NC_VERSION_NOTE *\"\([^\"]*\)\".*" "\\1" ++ _netcdf_version_note "${_netcdf_version_lines}") ++ if(NOT _netcdf_version_note STREQUAL "") + # Make development version compare higher than any patch level + set(_netcdf_version_note ".99") + endif() +- set(netCDF_VERSION "${_netcdf_version_major}.${_netcdf_version_minor}.${_netcdf_version_patch}${_netcdf_version_note}") ++ set(netCDF_VERSION ++ "${_netcdf_version_major}.${_netcdf_version_minor}.${_netcdf_version_patch}${_netcdf_version_note}" ++ ) + unset(_netcdf_version_major) + unset(_netcdf_version_minor) + unset(_netcdf_version_patch) + unset(_netcdf_version_note) + unset(_netcdf_version_lines) +-endif () ++endif() + + include(FindPackageHandleStandardArgs) +-find_package_handle_standard_args(netCDF ++find_package_handle_standard_args( ++ netCDF + REQUIRED_VARS netCDF_C_LIBRARY netCDF_C_INCLUDE_DIR + VERSION_VAR netCDF_VERSION) + +-if (netCDF_FOUND) ++if(netCDF_FOUND) + set(netCDF_INCLUDE_DIR "${netCDF_C_INCLUDE_DIR}") + set(netCDF_INCLUDE_DIRS "${netCDF_C_INCLUDE_DIR}") + set(netCDF_LIBRARIES "${netCDF_C_LIBRARY}") + +- if (NOT TARGET netCDF::netcdf) ++ if(NOT TARGET netCDF::netcdf) + add_library(netCDF::netcdf UNKNOWN IMPORTED) +- set_target_properties(netCDF::netcdf PROPERTIES +- IMPORTED_LOCATION "${netCDF_C_LIBRARY}" +- INTERFACE_INCLUDE_DIRECTORIES "${netCDF_C_INCLUDE_DIR}" +- ) +- endif () +-endif () ++ set_target_properties( ++ netCDF::netcdf ++ PROPERTIES IMPORTED_LOCATION "${netCDF_C_LIBRARY}" ++ INTERFACE_INCLUDE_DIRECTORIES "${netCDF_C_INCLUDE_DIR}") ++ endif() ++endif() +diff --git a/cmake/SetupBOUTThirdParty.cmake b/cmake/SetupBOUTThirdParty.cmake +index c04cc98a69..9ee32c7214 100644 +--- a/cmake/SetupBOUTThirdParty.cmake ++++ b/cmake/SetupBOUTThirdParty.cmake +@@ -213,6 +213,7 @@ option(BOUT_DOWNLOAD_SUNDIALS "Download and build SUNDIALS" OFF) + cmake_dependent_option(BOUT_USE_SUNDIALS "Enable support for SUNDIALS time solvers" OFF + "NOT BOUT_DOWNLOAD_SUNDIALS" ON) + if (BOUT_USE_SUNDIALS) ++ enable_language(C) + if (BOUT_DOWNLOAD_SUNDIALS) + message(STATUS "Downloading and configuring SUNDIALS") + include(FetchContent) diff --git a/packages/boutpp/fix_thirdparty_cmake_v5.1.x.patch b/packages/boutpp/fix_thirdparty_cmake_v5.1.x.patch new file mode 100644 index 0000000..9b77c1c --- /dev/null +++ b/packages/boutpp/fix_thirdparty_cmake_v5.1.x.patch @@ -0,0 +1,24 @@ +diff --git a/cmake/FindnetCDF.cmake b/cmake/FindnetCDF.cmake +index 393c57549b..361095954e 100644 +--- a/cmake/FindnetCDF.cmake ++++ b/cmake/FindnetCDF.cmake +@@ -32,6 +32,7 @@ if (NOT netCDF_ROOT AND EXISTS "${BOUT_USE_NETCDF}") + set(netCDF_ROOT "${BOUT_USE_NETCDF}") + endif() + ++enable_language(C) + find_package(netCDF QUIET CONFIG) + + if (netCDF_FOUND) +diff --git a/cmake/SetupBOUTThirdParty.cmake b/cmake/SetupBOUTThirdParty.cmake +index 78dfc6b56e..37af2337d9 100644 +--- a/cmake/SetupBOUTThirdParty.cmake ++++ b/cmake/SetupBOUTThirdParty.cmake +@@ -233,6 +233,7 @@ option(BOUT_DOWNLOAD_SUNDIALS "Download and build SUNDIALS" OFF) + cmake_dependent_option(BOUT_USE_SUNDIALS "Enable support for SUNDIALS time solvers" OFF + "NOT BOUT_DOWNLOAD_SUNDIALS" ON) + if (BOUT_USE_SUNDIALS) ++ enable_language(C) + if (BOUT_DOWNLOAD_SUNDIALS) + message(STATUS "Downloading and configuring SUNDIALS") + include(FetchContent) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 908cdda..1012252 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -5,7 +5,7 @@ # ---------------------------------------------------------------------------- -from spack.package import CMakePackage, depends_on, variant, version +from spack.package import CMakePackage, depends_on, patch, variant, version class Boutpp(CMakePackage): @@ -27,6 +27,10 @@ class Boutpp(CMakePackage): for v in tagged_versions: version(v, tag=f"v{v}", submodules=True) + # Patches + patch("fix_thirdparty_cmake_v5.0.0.patch", when="@5.0.0") + patch("fix_thirdparty_cmake_v5.1.x.patch", when="@5.1") + # Variants variant("adios2", default=False, description="Builds with ADIOS2 support.") variant("backtrace", default=True, description="Enable backtrace.") From 5e2180331c8e22582595b5fd1b84d24813f54cf8 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 21 Jan 2026 10:23:20 +0000 Subject: [PATCH 27/35] Always set -DBOUT_IGNORE_CONDA_ENV=ON. --- packages/boutpp/package.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 1012252..862a860 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -208,8 +208,9 @@ def cmake_args(self): self.define("BOUT_DOWNLOAD_SUNDIALS", False), self.define("BOUT_ENABLE_MPI", True), self.define("BOUT_GENERATE_FIELDOPS", False), - self.define("INSTALL_GTEST", False), + self.define("BOUT_IGNORE_CONDA_ENV",True), self.define("BOUT_UPDATE_GIT_SUBMODULE", True), + self.define("INSTALL_GTEST", False), ] # There are problems with how CMake finds the glibc/standalone versions # of gettext (see From 05f2ae703e55b80d3f24322d702723765871ed0a Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 21 Jan 2026 10:29:41 +0000 Subject: [PATCH 28/35] Remove commented code. --- packages/boutpp/package.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 862a860..b88fab5 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -140,8 +140,6 @@ class Boutpp(CMakePackage): depends_on("petsc@3.7:3.23", type=("build", "link")) # Max PETSc version for BOUT v5.0.0: depends_on("petsc@:3.17", type=("build", "link"), when="@5.0.0") - # Max PETSc version for BOUT v5.1.x: - # depends_on("petsc@:3.19", type=("build", "link"), when="@5.1") def cmake_args(self): # Definitions controlled by variants From d349c5547db48ca1246577b989303a53e6a5588d Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 21 Jan 2026 10:40:38 +0000 Subject: [PATCH 29/35] Always set -DBOUT_USE_PVODE=ON. --- packages/boutpp/package.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index b88fab5..bde0518 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -208,6 +208,7 @@ def cmake_args(self): self.define("BOUT_GENERATE_FIELDOPS", False), self.define("BOUT_IGNORE_CONDA_ENV",True), self.define("BOUT_UPDATE_GIT_SUBMODULE", True), + self.define("BOUT_USE_PVODE", True), self.define("INSTALL_GTEST", False), ] # There are problems with how CMake finds the glibc/standalone versions From 89efd34e70e0cd7943885dbf5ee964670eb5e0ea Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 21 Jan 2026 16:06:11 +0000 Subject: [PATCH 30/35] Remove the mumps, strumpack and superlu-dist boutpp variants, leaving those options up to PETSc instead. +hypre and +slepc are left in to trigger the corresponding BOUT_USE definitions. --- packages/boutpp/package.py | 30 ++---------------------------- 1 file changed, 2 insertions(+), 28 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index bde0518..4644edc 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -79,19 +79,6 @@ class Boutpp(CMakePackage): variant("track", default=True, description="Enable field name tracking.") variant("umpire", default=False, description="Builds with Umpire support.") - # Variants that exist purely for easy pass-through to PETSc - variant("mumps", default=False, description="Build PETSc dependency with MUMPS.") - - # Disable STRUMPACK support for now; numpy build fails - might be related to https://github.com/spack/spack-packages/issues/953 - # variant( - # "strumpack", default=False, description="Build PETSc dependency with STRUMPACK." - # ) - variant( - "superlu-dist", - default=False, - description="Build PETSc dependency with SuperLU_DIST.", - ) - # Fixed dependencies depends_on("c", type="build") depends_on("cxx", type="build") @@ -128,15 +115,9 @@ class Boutpp(CMakePackage): depends_on("py-jinja2", type=("build", "link"), when="+python") depends_on("py-numpy", type=("build", "link"), when="+python") - # PETSc is more complicated: - # Require PETSc with MPI if any PETSc-related variant is enabled depends_on("petsc+mpi", type=("build", "link"), when="+petsc") - # Pass through PETSc component variants - for petsc_var in ["hypre", "mumps", "superlu-dist"]: - depends_on(f"petsc+{petsc_var}", type=("build", "link"), when=f"+{petsc_var}") - - # Supported PETSc version range across all BOUT versions: + # All supported PETSc versions (across all BOUT versions): depends_on("petsc@3.7:3.23", type=("build", "link")) # Max PETSc version for BOUT v5.0.0: depends_on("petsc@:3.17", type=("build", "link"), when="@5.0.0") @@ -156,6 +137,7 @@ def cmake_args(self): "BOUT_ENABLE_METRIC_3D": "metric3d", "BOUT_USE_NETCDF": "netcdf", "BOUT_ENABLE_OPENMP": "openmp", + "BOUT_USE_PETSC": "petsc", "BOUT_ENABLE_PYTHON": "python", "BOUT_ENABLE_RAJA": "raja", "ENABLE_SANITIZER_ADDRESS": "sanitize_address", @@ -177,14 +159,6 @@ def cmake_args(self): for def_str, var_str in variant_defs.items() ] - # Enable PETSc if any of the PETSc-component variants are enabled - petsc_variants_enabled = ( - self.spec.variants["petsc"].value - or self.spec.variants["mumps"].value - or self.spec.variants["superlu-dist"].value - ) - variant_args.append(self.define("BOUT_USE_PETSC", petsc_variants_enabled)) - # Build tests unless variant buildtests=none variant_args.append( self.define( From 81c126dc7ec2ff66a27bc98ad93fa0800833fee9 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Wed, 21 Jan 2026 17:05:55 +0000 Subject: [PATCH 31/35] Add missing slepc dependency. --- packages/boutpp/package.py | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 4644edc..23dff1c 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -97,6 +97,7 @@ class Boutpp(CMakePackage): "python", "raja", "scorep", + "slepc", "sundials", "umpire", ] From 192aca2cf94142557d7af728b990e6825a16e3cd Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Thu, 22 Jan 2026 11:08:10 +0000 Subject: [PATCH 32/35] Add comments to document the fixed CMake args used in boutpp. --- packages/boutpp/package.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 23dff1c..f4a9f3d 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -176,14 +176,20 @@ def cmake_args(self): # Always use these definitions fixed_args = [ + # Don't download any dependencies (use spack to resolve them instead) self.define("BOUT_DOWNLOAD_ADIOS2", False), self.define("BOUT_DOWNLOAD_NETCDF_CXX4", False), self.define("BOUT_DOWNLOAD_SUNDIALS", False), + # Always build with MPI self.define("BOUT_ENABLE_MPI", True), self.define("BOUT_GENERATE_FIELDOPS", False), + # Avoid any confusion between conda and spack self.define("BOUT_IGNORE_CONDA_ENV",True), + # Ensure bout submodules are up to date before building self.define("BOUT_UPDATE_GIT_SUBMODULE", True), + # Always build with PVODE self.define("BOUT_USE_PVODE", True), + # Don't install gtest (resolve dependency with spack instead) self.define("INSTALL_GTEST", False), ] # There are problems with how CMake finds the glibc/standalone versions From 73da644dd520ffc3723884c35206942d3b9a954c Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Thu, 22 Jan 2026 11:10:27 +0000 Subject: [PATCH 33/35] Don't force -DBOUT_GENERATE_FIELDOPS=OFF in boutpp. --- packages/boutpp/package.py | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index f4a9f3d..5a8f733 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -182,7 +182,6 @@ def cmake_args(self): self.define("BOUT_DOWNLOAD_SUNDIALS", False), # Always build with MPI self.define("BOUT_ENABLE_MPI", True), - self.define("BOUT_GENERATE_FIELDOPS", False), # Avoid any confusion between conda and spack self.define("BOUT_IGNORE_CONDA_ENV",True), # Ensure bout submodules are up to date before building From fd7c28eec239e2efb9238cb03aef698f702bf886 Mon Sep 17 00:00:00 2001 From: Mike Kryjak Date: Thu, 22 Jan 2026 11:35:53 +0000 Subject: [PATCH 34/35] System UUID true by default --- packages/boutpp/package.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 5a8f733..886fb9f 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -78,6 +78,7 @@ class Boutpp(CMakePackage): variant("sundials", default=False, description="Builds with SUNDIALS support.") variant("track", default=True, description="Enable field name tracking.") variant("umpire", default=False, description="Builds with Umpire support.") + variant("uuid", default=True, description="Use system UUID generator") # Fixed dependencies depends_on("c", type="build") @@ -154,6 +155,7 @@ def cmake_args(self): "BOUT_USE_SUNDIALS": "sundials", "BOUT_ENABLE_TRACK": "track", "BOUT_ENABLE_UMPIRE": "umpire", + "BOUT_USE_UUID_SYSTEM_GENERATOR": "uuid", } variant_args = [ self.define_from_variant(def_str, var_str) From 53e9edcd64445708fb16b88ee744ad500e5aee46 Mon Sep 17 00:00:00 2001 From: Owen Parry Date: Thu, 22 Jan 2026 11:39:09 +0000 Subject: [PATCH 35/35] More robust way to specify PETSc version restrictions. --- packages/boutpp/package.py | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/packages/boutpp/package.py b/packages/boutpp/package.py index 886fb9f..eeef8e3 100644 --- a/packages/boutpp/package.py +++ b/packages/boutpp/package.py @@ -5,7 +5,7 @@ # ---------------------------------------------------------------------------- -from spack.package import CMakePackage, depends_on, patch, variant, version +from spack.package import CMakePackage, conflicts, depends_on, patch, variant, version class Boutpp(CMakePackage): @@ -117,12 +117,11 @@ class Boutpp(CMakePackage): depends_on("py-jinja2", type=("build", "link"), when="+python") depends_on("py-numpy", type=("build", "link"), when="+python") - # Require PETSc with MPI if any PETSc-related variant is enabled - depends_on("petsc+mpi", type=("build", "link"), when="+petsc") - # All supported PETSc versions (across all BOUT versions): - depends_on("petsc@3.7:3.23", type=("build", "link")) - # Max PETSc version for BOUT v5.0.0: - depends_on("petsc@:3.17", type=("build", "link"), when="@5.0.0") + # PETSc dependency + # Always use MPI and specify supported version range (across all BOUT versions) + depends_on("petsc@3.7:3.23+mpi", type=("build", "link"), when="+petsc") + # BOUT v5.0.0 won't build with PETSc v3.18 onwards + conflicts("petsc@3.18:", when="+petsc@:5.0.0") def cmake_args(self): # Definitions controlled by variants