amg2023 package: cmake build (#39618)
Switch from makefile to CMake-based build. CMake support is currently in a specific branch of the amg2023 repo, so add this branch as a version in the package.
This commit is contained in:
		@@ -6,7 +6,7 @@
 | 
			
		||||
from spack.package import *
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
class Amg2023(MakefilePackage):
 | 
			
		||||
class Amg2023(CMakePackage, CudaPackage, ROCmPackage):
 | 
			
		||||
    """AMG2023 is a parallel algebraic multigrid solver for linear systems
 | 
			
		||||
    arising from problems on unstructured grids. The driver provided here
 | 
			
		||||
    builds linear systems for various 3-dimensional problems. It requires
 | 
			
		||||
@@ -18,66 +18,34 @@ class Amg2023(MakefilePackage):
 | 
			
		||||
    git = "https://github.com/LLNL/AMG2023.git"
 | 
			
		||||
 | 
			
		||||
    version("develop", branch="main")
 | 
			
		||||
    version("cmake-build", git="https://github.com/dyokelson/AMG2023.git", branch="cmake")
 | 
			
		||||
 | 
			
		||||
    variant("mpi", default=True, description="Enable MPI support")
 | 
			
		||||
    variant("openmp", default=False, description="Enable OpenMP support")
 | 
			
		||||
    variant("caliper", default=False, description="Enable Caliper monitoring")
 | 
			
		||||
    variant("adiak", default=False, description="Enable Adiak metadata gathering")
 | 
			
		||||
 | 
			
		||||
    depends_on("mpi", when="+mpi")
 | 
			
		||||
    depends_on("hypre+mpi", when="+mpi")
 | 
			
		||||
    requires("+mpi", when="^hypre+mpi")
 | 
			
		||||
    depends_on("caliper", when="+caliper")
 | 
			
		||||
    depends_on("adiak", when="+adiak")
 | 
			
		||||
    depends_on("adiak", when="+caliper")
 | 
			
		||||
    depends_on("hypre+caliper", when="+caliper")
 | 
			
		||||
    depends_on("hypre@2.27.0:")
 | 
			
		||||
    depends_on("mpi", when="+mpi")
 | 
			
		||||
    depends_on("hypre+cuda", when="+cuda")
 | 
			
		||||
    requires("+cuda", when="^hypre+cuda")
 | 
			
		||||
    depends_on("hypre+rocm", when="+rocm")
 | 
			
		||||
    requires("+rocm", when="^hypre+rocm")
 | 
			
		||||
 | 
			
		||||
    def flag_handler(self, name, flags):
 | 
			
		||||
        if name == "ldlibs":
 | 
			
		||||
            if self.spec.satisfies("+caliper"):
 | 
			
		||||
                flags.append("-lcaliper")
 | 
			
		||||
            if self.spec.satisfies("+adiak"):
 | 
			
		||||
                flags.append("-ladiak")
 | 
			
		||||
        return (flags, None, None)
 | 
			
		||||
    def cmake_args(self):
 | 
			
		||||
        cmake_options = []
 | 
			
		||||
        cmake_options.append(self.define_from_variant("AMG_WITH_CALIPER", "caliper"))
 | 
			
		||||
        cmake_options.append(self.define_from_variant("AMG_WITH_OMP", "openmp"))
 | 
			
		||||
        cmake_options.append("-DHYPRE_PREFIX={0}".format(self.spec["hypre"].prefix))
 | 
			
		||||
        if self.spec["hypre"].satisfies("+cuda"):
 | 
			
		||||
            cmake_options.append("-DAMG_WITH_CUDA=ON")
 | 
			
		||||
        if self.spec["hypre"].satisfies("+rocm"):
 | 
			
		||||
            cmake_options.append("-DAMG_WITH_HIP=ON")
 | 
			
		||||
        if self.spec["hypre"].satisfies("+mpi"):
 | 
			
		||||
            cmake_options.append("-DAMG_WITH_MPI=ON")
 | 
			
		||||
 | 
			
		||||
    def edit(self, spec, prefix):
 | 
			
		||||
        makefile = FileFilter("Makefile")
 | 
			
		||||
        if "+mpi" in spec:
 | 
			
		||||
            makefile.filter(r"CC\s*=.*", f"CC = {spec['mpi'].mpicc}")
 | 
			
		||||
            makefile.filter(r"CXX\s*=.*", f"CXX = {spec['mpi'].mpicxx}")
 | 
			
		||||
            makefile.filter(r"#MPIPATH = .*", f"MPIPATH = {spec['mpi'].prefix}")
 | 
			
		||||
            makefile.filter(r"#MPIINCLUDE", "MPIINCLUDE")
 | 
			
		||||
            if spec["mpi"].extra_attributes and "ldflags" in spec["mpi"].extra_attributes:
 | 
			
		||||
                makefile.filter(
 | 
			
		||||
                    "#MPILIBS    = .*",
 | 
			
		||||
                    "MPILIBS    = {0}".format(spec["mpi"].extra_attributes["ldflags"]),
 | 
			
		||||
                )
 | 
			
		||||
            else:
 | 
			
		||||
                makefile.filter("#MPILIBDIRS", "MPILIBDIRS")
 | 
			
		||||
                makefile.filter("#MPILIBS", "MPILIBS")
 | 
			
		||||
            makefile.filter("#MPIFLAGS", "MPIFLAGS")
 | 
			
		||||
        else:
 | 
			
		||||
            makefile.filter(r"CC\s*=.*", "CC = {0}".format(spack_cc))
 | 
			
		||||
            makefile.filter(r"CXX\s*=.*", "CXX = {0}".format(spack_cxx))
 | 
			
		||||
 | 
			
		||||
        makefile.filter(r"HYPRE_DIR = .*", f'HYPRE_DIR = {spec["hypre"].prefix}')
 | 
			
		||||
 | 
			
		||||
        if spec["hypre"].satisfies("+cuda"):
 | 
			
		||||
            makefile.filter(
 | 
			
		||||
                "HYPRE_CUDA_PATH    = .*", "HYPRE_CUDA_PATH    = %s" % (spec["cuda"].prefix)
 | 
			
		||||
            )
 | 
			
		||||
            makefile.filter("HYPRE_CUDA_INCLUDE = #", "HYPRE_CUDA_INCLUDE = ")
 | 
			
		||||
            makefile.filter("HYPRE_CUDA_LIBS    = #", "HYPRE_CUDA_LIBS    = ")
 | 
			
		||||
            makefile.filter("HYPRE_HIP_PATH    =", "#HYPRE_HIP_PATH    =")
 | 
			
		||||
            makefile.filter("HYPRE_HIP_INCLUDE =", "#HYPRE_HIP_INCLUDE =")
 | 
			
		||||
            makefile.filter("HYPRE_HIP_LIBS    =", "#HYPRE_HIP_LIBS    =")
 | 
			
		||||
 | 
			
		||||
        if spec["hypre"].satisfies("+rocm"):
 | 
			
		||||
            makefile.filter("HYPRE_HIP_PATH    = .*", "HYPRE_HIP_PATH    = ${ROCM_PATH}")
 | 
			
		||||
        else:
 | 
			
		||||
            makefile.filter("HYPRE_HIP_PATH    =", "#HYPRE_HIP_PATH    =")
 | 
			
		||||
            makefile.filter("HYPRE_HIP_INCLUDE =", "#HYPRE_HIP_INCLUDE =")
 | 
			
		||||
            makefile.filter("HYPRE_HIP_LIBS    =", "#HYPRE_HIP_LIBS    =")
 | 
			
		||||
 | 
			
		||||
    def install(self, spec, prefix):
 | 
			
		||||
        make()
 | 
			
		||||
        mkdirp(prefix.bin)
 | 
			
		||||
        install("amg", prefix.bin)
 | 
			
		||||
        return cmake_options
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user