spack/var/spack/repos/builtin/packages/ffb/package.py
Adam J. Stewart a3f4fd68d6
Packages: add missing compiler dependencies (#49920)
* Packages: add missing compiler dependencies

* Undo changes to cray-mpich
2025-04-07 09:42:54 -07:00

176 lines
6.9 KiB
Python

# Copyright Spack Project Developers. See COPYRIGHT file for details.
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
from spack.package import *
class Ffb(MakefilePackage):
"""Computational Fluid Dynamics Software for aeroacoustics"""
homepage = "http://www.ciss.iis.u-tokyo.ac.jp/dl/index.php"
url = "file://{0}/FrontFlow_blue.8.1.tar.gz".format(os.getcwd())
manual_download = True
version("8.1", sha256="1ad008c909152b6c27668bafbad820da3e6ec3309c7e858ddb785f0a3d6e43ae")
patch("revocap_refiner.patch")
patch("revocap_refiner-size_t.patch")
patch("fortran-format.patch")
patch("xvx.patch")
patch("gffv3tr.patch")
depends_on("c", type="build")
depends_on("cxx", type="build")
depends_on("fortran", type="build")
depends_on("mpi")
depends_on("blas")
depends_on("scalapack")
parallel = False
def flag_handler(self, name, flags):
opt_flag_found = any(f in self.compiler.opt_flags for f in flags)
if name == "cflags":
if not opt_flag_found:
flags.append("-O3")
elif name == "cxxflags":
if not opt_flag_found:
flags.append("-O2")
flags.append(self.compiler.cxx_pic_flag)
if name == "fflags":
if not opt_flag_found:
flags.append("-O3")
flags.append("-mcmodel=large")
if name in ("cflags", "cxxflags", "fflags"):
return (None, flags, None)
else:
return (flags, None, flags)
def edit(self, spec, prefix):
workdir = os.getcwd()
cflags = env["CFLAGS"]
cxxflags = env["CXXFLAGS"]
fflags = env["FFLAGS"]
make = join_path("make", "makefile")
m = FileFilter(make)
m.filter(r"#LES3DHOME =", "LES3DHOME= {0}\n".format(workdir))
make = join_path("make", "OPTION")
m = FileFilter(make)
m.filter(r"CPP\s*=.*$", "CPP = /usr/bin/cpp")
m.filter(r"CCOM\s*=.*$", "CCOM = {0}".format(spack_cc))
m.filter(r"COPT\s*=.*$", "COPT = {0}".format(cflags))
m.filter(r"FCOM\s*=.*$", "FCOM = {0}\n".format(spack_fc))
m.filter(r"FOPT\s*=.*$", "FOPT = {0}\n".format(fflags))
m.filter(r"INCDIR\s*=.*$", "INCDIR = {0}\n".format(spec["mpi"].headers.directories[0]))
m.filter(r"LIBDIR\s*=.*$", "LIBDIR = {0}\n".format(spec["mpi"].libs.directories[0]))
srcdir = join_path("lib", "src")
utildir = join_path(workdir, "util")
with open(join_path("make", "Makeall"), "w") as m:
m.write("#!/bin/csh -f\n")
m.write("setenv LES3DHOME {0}\n".format(workdir))
m.write("cd {0}\n".format(srcdir))
m.write("./Makeall\n")
m.write("cd {0}\n".format(utildir))
m.write("./Makeall\n")
makeall = join_path("lib", "src", "dd_mpi", "Makeall")
dd_mpi_dir = join_path("lib", "src", "dd_mpi")
with open(makeall, "w") as m:
m.write("#!/bin/csh -f\n")
m.write("setenv LES3DHOME {0}\n".format(workdir))
m.write("cd {0}\n".format(dd_mpi_dir))
m.write("make lib FCOM={0}\n".format(spec["mpi"].mpifc))
os.chmod(makeall, 0o755)
makeall = join_path(".", "Makeall.les")
les3d_dir = join_path("util", "les3d.mpi")
les3c_dir = join_path("util", "les3c.mpi")
les3ct_dir = join_path("util", "les3ct.mpi")
les3x_dir = join_path("util", "les3x.mpi")
with open(makeall, "w") as m:
m.write("#!/bin/csh -f\n")
m.write("setenv LES3DHOME {0}\n".format(workdir))
m.write("cd {0}\n".format(join_path(workdir, les3d_dir)))
m.write("make CCOM={0}".format(spec["mpi"].mpicc))
m.write(" FCOM={0}\n".format(spec["mpi"].mpifc))
m.write("cd {0}\n".format(join_path(workdir, les3c_dir)))
m.write("make CCOM={0}".format(spec["mpi"].mpicc))
m.write(" FCOM={0}\n".format(spec["mpi"].mpifc))
m.write("cd {0}\n".format(join_path(workdir, les3ct_dir)))
m.write("make CCOM={0}".format(spec["mpi"].mpicc))
m.write(" FCOM={0}\n".format(spec["mpi"].mpifc))
m.write("cd {0}\n".format(join_path(workdir, les3x_dir)))
m.write("make CCOM={0}".format(spec["mpi"].mpicc))
m.write(" FCOM={0}\n".format(spec["mpi"].mpifc))
for d in [les3c_dir, les3ct_dir, les3d_dir]:
editfile = join_path(d, "FILES")
m = FileFilter(editfile)
m.filter(r"-lmpi_f77", "")
os.chmod(makeall, 0o755)
editfile = join_path("lib", "src", "Makeall")
m = FileFilter(editfile)
m.filter(r"x86_64-linux", "{0}-linux".format(spec.target.family))
editfile = join_path("lib", "src", "REVOCAP_Refiner-0.4.3", "OPTIONS")
m = FileFilter(editfile)
m.filter(r"ARCH\s*=.*$", "ARCH= $(shell arch)-linux")
m.filter(r"CC\s*=.*$", "CC={0}".format(spack_cc))
m.filter(r"CFLAGS\s*=.*$", "CFLAGS={0}".format(cflags))
m.filter(r"CXX\s*=.*$", "CXX={0}".format(spack_cxx))
m.filter(r"CXXFLAGS\s*=.*$", "CXXFLAGS={0}".format(cxxflags))
m.filter(r"F90\s*=.*$", "CC={0}".format(spack_fc))
m.filter(r"LD\s*=.*$", "LD={0}".format(spack_fc))
m.filter(r"LIBPATH\s*=.*$", "LIBPATH= ")
m.filter(r"FFLAGS\s*=.*$", "FFLAGS={0}".format(fflags))
m.filter(r"LDFLAGS\s*=.*$", "LDFLAGS={0}".format(fflags))
editfile = join_path("lib", "src", "ParMetis-3.1", "Makefile.in")
m = FileFilter(editfile)
m.filter(r"CC \s*=.*$", "CC ={0}".format(spack_cc))
m.filter(r"INCDIR\s*=.*$", "INCDIR = \n")
editfile = join_path("util", "xvx2gf", "Makefile")
m = FileFilter(editfile)
m.filter(r"#LES3DHOME =", "LES3DHOME= {0}\n".format(workdir))
m.filter(r"g\+\+", (spack_cxx))
editfile = join_path("util", "les3x.mpi", "FILES")
m = FileFilter(editfile)
m.filter(r"LIBS = -lfort -lgf2 -ldd_mpi -lmpi_f77", "LIBS = -lfort -lgf2 -ldd_mpi")
editfile = join_path("util", "xvx2gf", "FILES")
cxx_fortran_flags = []
if spec.satisfies("%gcc"):
cxx_fortran_flags.append("-lgfortran")
m = FileFilter(editfile)
m.filter("-lifcore -limf", " ".join(cxx_fortran_flags))
elif spec.satisfies("%fj"):
cxx_fortran_flags.append("--linkfortran")
m = FileFilter(editfile)
m.filter("-lifcore -limf", " ".join(cxx_fortran_flags))
elif spec.satisfies("%intel"):
pass
def build(self, spec, prefix):
for m in [
join_path("make", "Makeall"),
join_path("lib", "src", "dd_mpi", "Makeall"),
join_path(".", "Makeall.les"),
]:
Executable(m)()
def install(self, spec, prefix):
install_tree("bin", prefix.bin)
install_tree("macro", prefix.macro)
def setup_run_environment(self, env):
env.prepend_path("PATH", prefix.macro)