From 16f70ca78d03eaaded4488f0454a6aee9ab7d125 Mon Sep 17 00:00:00 2001 From: Rocco Meli Date: Tue, 14 Mar 2023 16:02:11 +0100 Subject: pexsi: add v1.2 and v2.0 (#36049) --- var/spack/repos/builtin/packages/pexsi/package.py | 94 +++++++++++++++-------- 1 file changed, 61 insertions(+), 33 deletions(-) (limited to 'var') diff --git a/var/spack/repos/builtin/packages/pexsi/package.py b/var/spack/repos/builtin/packages/pexsi/package.py index 47a550c103..a72fe3044b 100644 --- a/var/spack/repos/builtin/packages/pexsi/package.py +++ b/var/spack/repos/builtin/packages/pexsi/package.py @@ -3,14 +3,15 @@ # # SPDX-License-Identifier: (Apache-2.0 OR MIT) - import inspect import os.path +import spack.build_systems.cmake +import spack.build_systems.makefile from spack.package import * -class Pexsi(MakefilePackage): +class Pexsi(MakefilePackage, CMakePackage): """The PEXSI library is written in C++, and uses message passing interface (MPI) to parallelize the computation on distributed memory computing systems and achieve scalability on more than 10,000 processors. @@ -25,71 +26,98 @@ class Pexsi(MakefilePackage): """ homepage = "https://math.berkeley.edu/~linlin/pexsi/index.html" - url = "https://math.berkeley.edu/~linlin/pexsi/download/pexsi_v0.9.0.tar.gz" - # version('1.0', sha256='1574c66fd69ff2a37c6250d65c4df43b57c79822b49bd65662582a0cd5d82f54') + build_system( + conditional("cmake", when="@1:"), conditional("makefile", when="@0"), default="cmake" + ) + version("2.0.0", sha256="c5c83c2931b2bd0c68a462a49eeec983e78b5aaa1f17dd0454de4e27b91ca11f") + version("1.2.0", sha256="8bfad6ec6866c6a29e1cc87fb1c17a39809795e79ede98373c8ba9a3aaf820dd") version("0.10.2", sha256="8714c71b76542e096211b537a9cb1ffb2c28f53eea4f5a92f94cc1ca1e7b499f") version("0.9.0", sha256="e5efe0c129013392cdac3234e37f1f4fea641c139b1fbea47618b4b839d05029") depends_on("parmetis") - depends_on("superlu-dist@5.1.2:5.3", when="@0.10.2:") + depends_on("superlu-dist@5.1.2:5.3", when="@0.10.2:0") + depends_on("superlu-dist@:6.1.0", when="@1") # Upper limit from CP2K toolchain + depends_on("superlu-dist@7", when="@2") + + with when("build_system=cmake"): + depends_on("cmake@3.10:", type="build") + depends_on("cmake@3.17:", type="build", when="@2:") + variant("openmp", default=False, description="Build with OpenMP support", when="@1.2") variant("fortran", default=False, description="Builds the Fortran interface") + def url_for_version(self, version): + if version == Version("0"): + return f"https://math.berkeley.edu/~linlin/pexsi/download/pexsi_v{version}.tar.gz" + + return f"https://bitbucket.org/berkeleylab/pexsi/downloads/pexsi_v{version}.tar.gz" + + +class MakefileBuilder(spack.build_systems.makefile.MakefileBuilder): parallel = False - def edit(self, spec, prefix): + def edit(self, pkg, spec, prefix): substitutions = [ - ("@MPICC", self.spec["mpi"].mpicc), - ("@MPICXX_LIB", self.spec["mpi:cxx"].libs.joined()), - ("@MPICXX", self.spec["mpi"].mpicxx), - ("@MPIFC", self.spec["mpi"].mpifc), + ("@MPICC", spec["mpi"].mpicc), + ("@MPICXX_LIB", spec["mpi:cxx"].libs.joined()), + ("@MPICXX", spec["mpi"].mpicxx), + ("@MPIFC", spec["mpi"].mpifc), ("@RANLIB", "ranlib"), - ("@PEXSI_STAGE", self.stage.source_path), - ("@SUPERLU_PREFIX", self.spec["superlu-dist"].prefix), - ("@METIS_PREFIX", self.spec["metis"].prefix), - ("@PARMETIS_PREFIX", self.spec["parmetis"].prefix), - ("@LAPACK_PREFIX", self.spec["lapack"].prefix), - ("@BLAS_PREFIX", self.spec["blas"].prefix), - ("@LAPACK_LIBS", self.spec["lapack"].libs.joined()), - ("@BLAS_LIBS", self.spec["blas"].libs.joined()), + ("@PEXSI_STAGE", pkg.stage.source_path), + ("@SUPERLU_PREFIX", spec["superlu-dist"].prefix), + ("@METIS_PREFIX", spec["metis"].prefix), + ("@PARMETIS_PREFIX", spec["parmetis"].prefix), + ("@LAPACK_PREFIX", spec["lapack"].prefix), + ("@BLAS_PREFIX", spec["blas"].prefix), + ("@LAPACK_LIBS", spec["lapack"].libs.joined()), + ("@BLAS_LIBS", spec["blas"].libs.joined()), # FIXME : what to do with compiler provided libraries ? - ("@STDCXX_LIB", " ".join(self.compiler.stdcxx_libs)), + ("@STDCXX_LIB", " ".join(pkg.compiler.stdcxx_libs)), ] fldflags = "" - if "@0.9.2" in self.spec: + if "@0.9.2" in spec: fldflags += " -Wl,--allow-multiple-definition" - if "^superlu +openmp" in self.spec or "^openblas threads=openmp" in self.spec: - fldflags += " " + self.compiler.openmp_flag + if "^superlu +openmp" in spec or "^openblas threads=openmp" in spec: + fldflags += " " + pkg.compiler.openmp_flag substitutions.append(("@FLDFLAGS", fldflags.lstrip())) template = join_path(os.path.dirname(inspect.getmodule(self).__file__), "make.inc") - makefile = join_path(self.stage.source_path, "make.inc") + makefile = join_path(pkg.stage.source_path, "make.inc") copy(template, makefile) for key, value in substitutions: filter_file(key, value, makefile) - def build(self, spec, prefix): - super(Pexsi, self).build(spec, prefix) - if "+fortran" in self.spec: + def build(self, pkg, spec, prefix): + super().build(pkg, spec, prefix) + if "+fortran" in spec: make("-C", "fortran") - def install(self, spec, prefix): + def install(self, pkg, spec, prefix): # 'make install' does not exist, despite what documentation says - mkdirp(self.prefix.lib) + mkdirp(pkg.prefix.lib) install( - join_path(self.stage.source_path, "src", "libpexsi_linux.a"), - join_path(self.prefix.lib, "libpexsi.a"), + join_path(pkg.stage.source_path, "src", "libpexsi_linux.a"), + join_path(pkg.prefix.lib, "libpexsi.a"), ) - install_tree(join_path(self.stage.source_path, "include"), self.prefix.include) + install_tree(join_path(pkg.stage.source_path, "include"), pkg.prefix.include) # fortran "interface" - if "+fortran" in self.spec: + if "+fortran" in spec: install_tree( - join_path(self.stage.source_path, "fortran"), join_path(self.prefix, "fortran") + join_path(pkg.stage.source_path, "fortran"), join_path(pkg.prefix, "fortran") ) + + +class CMakeBuilder(spack.build_systems.cmake.CMakeBuilder): + def cmake_args(self): + args = [ + self.define_from_variant("PEXSI_ENABLE_FORTRAN", "fortran"), + self.define_from_variant("PEXSI_ENABLE_OPENMP ", "openmp"), + ] + return args -- cgit v1.2.3-60-g2f50