sw4: fix build options (#48774)

* Fix sw4 build options

* Update constraint to hdf5@1.14

* Change edit to setup_build_environment

* Use append_flags

* Fix style
This commit is contained in:
Derek Ryan Strong 2025-02-20 14:02:52 -08:00 committed by GitHub
parent 3e8cb852b0
commit d32b6099b3
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194

View File

@ -8,70 +8,88 @@
class Sw4(MakefilePackage):
"""This package builds SW4 with MPI, OpenMP, HDF5, FFTW, PROJ, and ZFP."""
"""SW4 implements substantial capabilities for 3-D seismic modeling."""
homepage = "https://github.com/geodynamics/sw4"
git = "https://github.com/geodynamics/sw4.git"
maintainers("houjun", "andersp")
license("GPL-2.0-or-later")
version("master", branch="master")
version("developer", branch="developer")
version("3.0", tag="v3.0", commit="13e6d431976f7fc49124c997bf87353aa7afd35e")
depends_on("cxx", type="build") # generated
depends_on("fortran", type="build") # generated
variant("openmp", default=True, description="build with OpenMP")
variant("hdf5", default=True, description="build with HDF5")
variant("proj", default=True, description="build with proj")
variant("zfp", default=False, description="build with ZFP")
variant("fftw", default=True, description="build with FFTW")
variant("openmp", default=True, description="Build with OpenMP")
variant("proj", default=True, description="Build with PROJ")
variant("hdf5", default=True, description="Build with HDF5")
variant("zfp", default=False, when="+hdf5", description="Build with ZFP")
variant("fftw", default=True, description="Build with FFTW")
variant("debug", default=False, description="Build with debugging symbols")
depends_on("cxx", type="build")
depends_on("fortran", type="build")
depends_on("mpi")
depends_on("blas")
depends_on("lapack")
depends_on("proj", when="+proj")
depends_on("hdf5+mpi", when="+hdf5")
depends_on("fftw@3.0: +mpi", when="+fftw")
depends_on("python")
depends_on("proj@9:", when="+proj")
depends_on("hdf5@1.14: +mpi", when="+hdf5")
depends_on("py-h5py", when="+hdf5")
depends_on("zfp", when="+zfp")
depends_on("h5z-zfp@develop", when="+zfp")
depends_on("python")
depends_on("py-h5py")
depends_on("fftw@3: +mpi", when="+fftw")
depends_on("llvm-openmp", when="%apple-clang +openmp")
def edit(self, spec, prefix):
os.environ["CXX"] = spec["mpi"].mpicxx
os.environ["FC"] = spec["mpi"].mpifc
os.environ["proj"] = "yes"
os.environ["openmp"] = "yes"
os.environ["hdf5"] = "yes"
os.environ["zfp"] = "yes"
os.environ["fftw"] = "yes"
os.environ["SW4ROOT"] = spec["proj"].prefix
os.environ["HDF5ROOT"] = spec["hdf5"].prefix
os.environ["H5ZROOT"] = spec["h5z-zfp"].prefix
os.environ["ZFPROOT"] = spec["zfp"].prefix
os.environ["FFTWHOME"] = spec["fftw"].prefix
os.environ["EXTRA_LINK_FLAGS"] = "-lstdc++ -lm -ldl "
os.environ["EXTRA_LINK_FLAGS"] += spec["blas"].libs.ld_flags + " "
os.environ["EXTRA_LINK_FLAGS"] += spec["blas"].libs.ld_flags + " "
if "+openmp" in spec:
if spec.satisfies("%apple-clang"):
os.environ["EXTRA_LINK_FLAGS"] += spec["llvm-openmp"].libs.ld_flags + " "
def setup_build_environment(self, env):
env.set("CXX", self.spec["mpi"].mpicxx)
env.set("FC", self.spec["mpi"].mpifc)
# openmp is enabled by default
if self.spec.satisfies("~openmp"):
env.set("openmp", "no")
if self.spec.satisfies("+proj"):
env.set("proj", "yes")
env.set("SW4ROOT", self.spec["proj"].prefix)
if self.spec.satisfies("+hdf5"):
env.set("hdf5", "yes")
env.set("HDF5ROOT", self.spec["hdf5"].prefix)
if self.spec.satisfies("+zfp"):
env.set("zfp", "yes")
env.set("ZFPROOT", self.spec["zfp"].prefix)
env.set("H5ZROOT", self.spec["h5z-zfp"].prefix)
if self.spec.satisfies("+fftw"):
env.set("fftw", "yes")
env.set("FFTWHOME", self.spec["fftw"].prefix)
if self.spec.satisfies("+debug"):
env.set("debug", "yes")
env.set("EXTRA_LINK_FLAGS", "-lstdc++ -lm -ldl")
env.append_flags("EXTRA_LINK_FLAGS", self.spec["blas"].libs.ld_flags)
env.append_flags("EXTRA_LINK_FLAGS", self.spec["lapack"].libs.ld_flags)
if self.spec.satisfies("%apple-clang +openmp"):
env.append_flags("EXTRA_LINK_FLAGS", self.spec["llvm-openmp"].libs.ld_flags)
# From spack/trilinos
if spec.satisfies("%gcc") or spec.satisfies("%clang") or spec.satisfies("%apple-clang"):
if (
self.spec.satisfies("%gcc")
or self.spec.satisfies("%clang")
or self.spec.satisfies("%apple-clang")
):
fc = Executable(self.compiler.fc)
libgfortran = fc("--print-file-name", "libgfortran." + dso_suffix, output=str).strip()
if libgfortran == "libgfortran." + dso_suffix:
libgfortran = fc("--print-file-name", "libgfortran.a", output=str).strip()
os.environ["EXTRA_LINK_FLAGS"] += " -L{0} -lgfortran ".format(
os.path.dirname(libgfortran)
env.append_flags(
"EXTRA_LINK_FLAGS", "-L{0} -lgfortran".format(os.path.dirname(libgfortran))
)
def install(self, spec, prefix):
mkdir(prefix.bin)
install("optimize_mp/sw4", prefix.bin)
if spec.satisfies("+openmp~debug"):
install("optimize_mp/sw4", prefix.bin)
elif spec.satisfies("+openmp+debug"):
install("debug_mp/sw4", prefix.bin)
elif spec.satisfies("~openmp~debug"):
install("optimize/sw4", prefix.bin)
elif spec.satisfies("~openmp+debug"):
install("debug/sw4", prefix.bin)
install_tree("pytest", prefix.test)