From 2cbc21d5846d7ce9b87c2c6d7f010807742bbbc1 Mon Sep 17 00:00:00 2001 From: "Adam J. Stewart" Date: Mon, 14 Apr 2025 16:35:03 +0200 Subject: [PATCH] Remove runtime errors for Fortran compilers (#49981) --- var/spack/repos/builtin/packages/adios/package.py | 14 -------------- var/spack/repos/builtin/packages/cmor/package.py | 6 ------ .../repos/builtin/packages/eccodes/package.py | 5 ----- .../repos/builtin/packages/flibcpp/package.py | 8 -------- .../repos/builtin/packages/fortrilinos/package.py | 8 -------- var/spack/repos/builtin/packages/h5hut/package.py | 7 ------- var/spack/repos/builtin/packages/hdf5/package.py | 6 ------ var/spack/repos/builtin/packages/msmpi/package.py | 5 ----- .../repos/builtin/packages/mvapich-plus/package.py | 8 -------- var/spack/repos/builtin/packages/ncl/package.py | 3 --- .../repos/builtin/packages/nek5000/package.py | 6 ------ .../repos/builtin/packages/nekbone/package.py | 6 ------ var/spack/repos/builtin/packages/nekcem/package.py | 6 ------ .../repos/builtin/packages/nektools/package.py | 6 ------ .../repos/builtin/packages/openblas/package.py | 14 -------------- .../repos/builtin/packages/openloops/package.py | 2 -- .../repos/builtin/packages/openmpi/package.py | 8 -------- var/spack/repos/builtin/packages/papi/package.py | 6 ------ var/spack/repos/builtin/packages/petaca/package.py | 6 ------ var/spack/repos/builtin/packages/petsc/package.py | 6 ------ var/spack/repos/builtin/packages/pnmpi/package.py | 9 --------- .../repos/builtin/packages/py-scipy/package.py | 5 ----- .../repos/builtin/packages/spherepack/package.py | 2 -- var/spack/repos/builtin/packages/wrf/package.py | 6 ------ 24 files changed, 158 deletions(-) diff --git a/var/spack/repos/builtin/packages/adios/package.py b/var/spack/repos/builtin/packages/adios/package.py index b98876ce228..d2f788cb105 100644 --- a/var/spack/repos/builtin/packages/adios/package.py +++ b/var/spack/repos/builtin/packages/adios/package.py @@ -107,19 +107,6 @@ class Adios(AutotoolsPackage): sha256="aea47e56013b57c2d5d36e23e0ae6010541c3333a84003784437768c2e350b05", ) - def validate(self, spec): - """Checks if incompatible variants have been activated at the same time - - Args: - spec: spec of the package - - Raises: - RuntimeError: in case of inconsistencies - """ - if "+fortran" in spec and not self.compiler.fc: - msg = "cannot build a fortran variant without a fortran compiler" - raise RuntimeError(msg) - def with_or_without_hdf5(self, activated): if activated: return f"--with-phdf5={self.spec['hdf5'].prefix}" @@ -133,7 +120,6 @@ def setup_build_environment(self, env): def configure_args(self): spec = self.spec - self.validate(spec) extra_args = [ # required, otherwise building its python bindings will fail diff --git a/var/spack/repos/builtin/packages/cmor/package.py b/var/spack/repos/builtin/packages/cmor/package.py index 17df84b273b..5f1e5e8a274 100644 --- a/var/spack/repos/builtin/packages/cmor/package.py +++ b/var/spack/repos/builtin/packages/cmor/package.py @@ -48,12 +48,6 @@ class Cmor(AutotoolsPackage): depends_on("py-wheel", when="+python", type="build") depends_on("py-numpy", type=("build", "run"), when="+python") - @run_before("configure") - def validate(self): - if self.spec.satisfies("+fortran") and not self.compiler.fc: - msg = "cannot build a fortran variant without a fortran compiler" - raise RuntimeError(msg) - def configure_args(self): spec = self.spec args = ["--disable-debug"] diff --git a/var/spack/repos/builtin/packages/eccodes/package.py b/var/spack/repos/builtin/packages/eccodes/package.py index b29e5599a2b..dd883952c44 100644 --- a/var/spack/repos/builtin/packages/eccodes/package.py +++ b/var/spack/repos/builtin/packages/eccodes/package.py @@ -305,11 +305,6 @@ def libs(self): msg.format("shared" if shared else "static", self.spec.name, self.spec.prefix) ) - @run_before("cmake") - def check_fortran(self): - if "+fortran" in self.spec and self.compiler.fc is None: - raise InstallError("Fortran interface requires a Fortran compiler!") - def cmake_args(self): jp2k = self.spec.variants["jp2k"].value diff --git a/var/spack/repos/builtin/packages/flibcpp/package.py b/var/spack/repos/builtin/packages/flibcpp/package.py index 6c93e076723..3aceea0912f 100644 --- a/var/spack/repos/builtin/packages/flibcpp/package.py +++ b/var/spack/repos/builtin/packages/flibcpp/package.py @@ -42,14 +42,6 @@ class Flibcpp(CMakePackage): depends_on("swig@4.0.2-fortran", type="build", when="+swig") depends_on("py-sphinx", type="build", when="+doc") - @run_before("cmake") - def die_without_fortran(self): - # Until we can pass compiler requirements through virtual - # dependencies, explicitly check for Fortran compiler instead of - # waiting for configure error. - if (self.compiler.f77 is None) or (self.compiler.fc is None): - raise InstallError("Flibcpp requires a Fortran compiler") - def cmake_args(self): from_variant = self.define_from_variant fstd_key = ( diff --git a/var/spack/repos/builtin/packages/fortrilinos/package.py b/var/spack/repos/builtin/packages/fortrilinos/package.py index 86b1ddcdcb1..011745525ba 100644 --- a/var/spack/repos/builtin/packages/fortrilinos/package.py +++ b/var/spack/repos/builtin/packages/fortrilinos/package.py @@ -69,14 +69,6 @@ class Fortrilinos(CMakePackage): "trilinos+amesos2+anasazi+belos+kokkos+ifpack2+muelu+nox+tpetra" "+stratimikos", when="+hl" ) - @run_before("cmake") - def die_without_fortran(self): - # Until we can pass variants such as +fortran through virtual - # dependencies, require Fortran compiler to - # avoid delayed build errors in dependents. - if (self.compiler.f77 is None) or (self.compiler.fc is None): - raise InstallError("ForTrilinos requires a Fortran compiler") - def cmake_args(self): return [ self.define_from_variant("BUILD_SHARED_LIBS", "shared"), diff --git a/var/spack/repos/builtin/packages/h5hut/package.py b/var/spack/repos/builtin/packages/h5hut/package.py index d3214cf555d..b01f30ae64c 100644 --- a/var/spack/repos/builtin/packages/h5hut/package.py +++ b/var/spack/repos/builtin/packages/h5hut/package.py @@ -38,13 +38,6 @@ class H5hut(AutotoolsPackage): # install: .libs/libH5hut.a: No such file or directory parallel = False - @run_before("configure") - def validate(self): - """Checks if Fortran compiler is available.""" - - if self.spec.satisfies("+fortran") and not self.compiler.fc: - raise RuntimeError("Cannot build Fortran variant without a Fortran compiler.") - def flag_handler(self, name, flags): build_system_flags = [] if ( diff --git a/var/spack/repos/builtin/packages/hdf5/package.py b/var/spack/repos/builtin/packages/hdf5/package.py index 4cf2cd44c51..cca72214e6a 100644 --- a/var/spack/repos/builtin/packages/hdf5/package.py +++ b/var/spack/repos/builtin/packages/hdf5/package.py @@ -516,12 +516,6 @@ def setup_run_environment(self, env): # LD_LIBRARY_PATH. env.append_path("LD_LIBRARY_PATH", self.prefix.lib) - @run_before("cmake") - def fortran_check(self): - if self.spec.satisfies("+fortran") and not self.compiler.fc: - msg = "cannot build a Fortran variant without a Fortran compiler" - raise RuntimeError(msg) - def cmake_args(self): spec = self.spec diff --git a/var/spack/repos/builtin/packages/msmpi/package.py b/var/spack/repos/builtin/packages/msmpi/package.py index f7db4d4b48c..988b95a603f 100644 --- a/var/spack/repos/builtin/packages/msmpi/package.py +++ b/var/spack/repos/builtin/packages/msmpi/package.py @@ -68,11 +68,6 @@ def is_64bit(self): def build_command_line(self): args = ["-noLogo"] ifort_bin = self.pkg.compiler.fc - if not ifort_bin: - raise InstallError( - "Cannot install MSMPI without fortran" - "please select a compiler with fortran support." - ) args.append("/p:IFORT_BIN=%s" % os.path.dirname(ifort_bin)) args.append("/p:VCToolsVersion=%s" % self.pkg.compiler.msvc_version) args.append("/p:WindowsTargetPlatformVersion=%s" % str(self.pkg.spec["wdk"].version)) diff --git a/var/spack/repos/builtin/packages/mvapich-plus/package.py b/var/spack/repos/builtin/packages/mvapich-plus/package.py index 784a952281d..4c4b6690f2f 100644 --- a/var/spack/repos/builtin/packages/mvapich-plus/package.py +++ b/var/spack/repos/builtin/packages/mvapich-plus/package.py @@ -276,14 +276,6 @@ def setup_dependent_package(self, module, dependent_spec): os.path.join(self.prefix.lib, f"libmpi.{dso_suffix}"), ] - @run_before("configure") - def die_without_fortran(self): - # Until we can pass variants such as +fortran through virtual - # dependencies depends_on('mpi'), require Fortran compiler to - # avoid delayed build errors in dependents. - if (self.compiler.f77 is None) or (self.compiler.fc is None): - raise InstallError("Mvapich requires both C and Fortran compilers!") - def configure_args(self): spec = self.spec args = [ diff --git a/var/spack/repos/builtin/packages/ncl/package.py b/var/spack/repos/builtin/packages/ncl/package.py index eb626f29150..18ea26c3a2c 100644 --- a/var/spack/repos/builtin/packages/ncl/package.py +++ b/var/spack/repos/builtin/packages/ncl/package.py @@ -161,9 +161,6 @@ def patch(self): ) def install(self, spec, prefix): - if (self.compiler.fc is None) or (self.compiler.cc is None): - raise InstallError("NCL package requires both " "C and Fortran compilers.") - self.prepare_site_config() self.prepare_install_config() self.prepare_src_tree() diff --git a/var/spack/repos/builtin/packages/nek5000/package.py b/var/spack/repos/builtin/packages/nek5000/package.py index 6d9c3e560ac..565efc89b57 100644 --- a/var/spack/repos/builtin/packages/nek5000/package.py +++ b/var/spack/repos/builtin/packages/nek5000/package.py @@ -48,12 +48,6 @@ class Nek5000(Package): patch("add_fjfortran.patch", when="%fj") - @run_before("install") - def fortran_check(self): - if not self.compiler.f77: - msg = "Cannot build Nek5000 without a Fortran 77 compiler." - raise RuntimeError(msg) - @run_after("install") def check_install(self): with working_dir("short_tests/eddy"): diff --git a/var/spack/repos/builtin/packages/nekbone/package.py b/var/spack/repos/builtin/packages/nekbone/package.py index 35d75b52bea..500cec7c6fa 100644 --- a/var/spack/repos/builtin/packages/nekbone/package.py +++ b/var/spack/repos/builtin/packages/nekbone/package.py @@ -35,12 +35,6 @@ class Nekbone(Package): depends_on("mpi", when="+mpi") - @run_before("install") - def fortran_check(self): - if not self.compiler.fc: - msg = "Nekbone can not be built without a Fortran compiler." - raise RuntimeError(msg) - def install(self, spec, prefix): mkdir(prefix.bin) diff --git a/var/spack/repos/builtin/packages/nekcem/package.py b/var/spack/repos/builtin/packages/nekcem/package.py index 5b50dc69195..fb9b3e5e573 100644 --- a/var/spack/repos/builtin/packages/nekcem/package.py +++ b/var/spack/repos/builtin/packages/nekcem/package.py @@ -34,12 +34,6 @@ class Nekcem(Package): depends_on("blas") depends_on("lapack") - @run_before("install") - def fortran_check(self): - if not self.compiler.fc: - msg = "NekCEM can not be built without a Fortran compiler." - raise RuntimeError(msg) - @run_after("install") def check_install(self): nekcem_test = join_path(self.prefix.bin, "NekCEM", "tests", "2dboxpec") diff --git a/var/spack/repos/builtin/packages/nektools/package.py b/var/spack/repos/builtin/packages/nektools/package.py index 1ddb0a40ca8..886b8446088 100644 --- a/var/spack/repos/builtin/packages/nektools/package.py +++ b/var/spack/repos/builtin/packages/nektools/package.py @@ -68,12 +68,6 @@ class Nektools(Package): depends_on("libxt", when="+postnek") depends_on("visit", when="+visit") - @run_before("install") - def fortran_check(self): - if not self.compiler.f77: - msg = "Cannot build Nek5000 without a Fortran 77 compiler." - raise RuntimeError(msg) - def install(self, spec, prefix): tools_dir = "tools" bin_dir = "bin" diff --git a/var/spack/repos/builtin/packages/openblas/package.py b/var/spack/repos/builtin/packages/openblas/package.py index 52e6149fb12..7eadea25c98 100644 --- a/var/spack/repos/builtin/packages/openblas/package.py +++ b/var/spack/repos/builtin/packages/openblas/package.py @@ -297,20 +297,6 @@ def parallel(self): # unclear whether setting `-j N` externally was supported before 0.3 return self.spec.version >= Version("0.3.0") - @run_before("edit") - def check_compilers(self): - # As of 06/2016 there is no mechanism to specify that packages which - # depends on Blas/Lapack need C or/and Fortran symbols. For now - # require both. - # As of 08/2022 (0.3.21), we can build purely with a C compiler using - # a f2c translated LAPACK version - # https://github.com/xianyi/OpenBLAS/releases/tag/v0.3.21 - if self.compiler.fc is None and "~fortran" not in self.spec: - raise InstallError( - self.compiler.cc - + " has no Fortran compiler added in spack. Add it or use openblas~fortran!" - ) - @property def headers(self): # The only public headers for cblas and lapacke in diff --git a/var/spack/repos/builtin/packages/openloops/package.py b/var/spack/repos/builtin/packages/openloops/package.py index da83a4e056c..7cc746bb40f 100644 --- a/var/spack/repos/builtin/packages/openloops/package.py +++ b/var/spack/repos/builtin/packages/openloops/package.py @@ -277,8 +277,6 @@ def configure(self, spec, prefix): f.write("process_lib_dir = {0}\n".format(self.spec.prefix.proclib)) f.write("cc = {0}\n".format(env["SPACK_CC"])) f.write("cxx = {0}\n".format(env["SPACK_CXX"])) - if not self.compiler.fc: - raise InstallError(f"{self.spec.compiler} has no Fortran compiler in spack!") f.write("fortran_compiler = {0}\n".format(env["SPACK_FC"])) if self.spec.satisfies("@1.3.1") and not is_intel: f.write("gfortran_f_flags = -ffree-line-length-none\n") diff --git a/var/spack/repos/builtin/packages/openmpi/package.py b/var/spack/repos/builtin/packages/openmpi/package.py index aa01dde228f..bf81f691d15 100644 --- a/var/spack/repos/builtin/packages/openmpi/package.py +++ b/var/spack/repos/builtin/packages/openmpi/package.py @@ -1013,14 +1013,6 @@ def with_or_without_tm(self, activated): return "--without-tm" return f"--with-tm={self.spec['pbs'].prefix}" - @run_before("autoreconf") - def die_without_fortran(self): - # Until we can pass variants such as +fortran through virtual - # dependencies depends_on('mpi'), require Fortran compiler to - # avoid delayed build errors in dependents. - if (self.compiler.f77 is None) and (self.compiler.fc is None): - raise InstallError("OpenMPI requires both C and Fortran compilers!") - @when("@main") def autoreconf(self, spec, prefix): perl = which("perl") diff --git a/var/spack/repos/builtin/packages/papi/package.py b/var/spack/repos/builtin/packages/papi/package.py index 10f4c206788..4bac82088eb 100644 --- a/var/spack/repos/builtin/packages/papi/package.py +++ b/var/spack/repos/builtin/packages/papi/package.py @@ -177,12 +177,6 @@ def configure_args(self): return options - @run_before("configure") - def fortran_check(self): - if not self.compiler.fc: - msg = "PAPI requires a Fortran compiler to build" - raise RuntimeError(msg) - @run_before("configure") def component_configure(self): configure_script = Executable("./configure") diff --git a/var/spack/repos/builtin/packages/petaca/package.py b/var/spack/repos/builtin/packages/petaca/package.py index 3eb5fbd27e5..26cae762062 100644 --- a/var/spack/repos/builtin/packages/petaca/package.py +++ b/var/spack/repos/builtin/packages/petaca/package.py @@ -52,12 +52,6 @@ class Petaca(CMakePackage): variant("std_name", default=False, description="enables std_mod_proc_name with intel") - # copied from openmpi/package.py to ensure fortran support - @run_before("cmake") - def die_without_fortran(self): - if (self.compiler.f77 is None) or (self.compiler.fc is None): - raise InstallError("petaca requires both C and Fortran compilers!") - def cmake_args(self): return [ self.define("ENABLE_TESTS", self.run_tests), diff --git a/var/spack/repos/builtin/packages/petsc/package.py b/var/spack/repos/builtin/packages/petsc/package.py index 50c25999661..ed377bab791 100644 --- a/var/spack/repos/builtin/packages/petsc/package.py +++ b/var/spack/repos/builtin/packages/petsc/package.py @@ -314,12 +314,6 @@ class Petsc(Package, CudaPackage, ROCmPackage): filter_compiler_wrappers("petscvariables", "reconfigure*.py", relative_root="lib/petsc/conf") filter_compiler_wrappers("petsc.pc", "PETSc.pc", relative_root="lib/pkgconfig") - @run_before("configure") - def check_fortran_compiler(self): - # Raise error if +fortran and there isn't a fortran compiler! - if "+fortran" in self.spec and self.compiler.fc is None: - raise InstallError("+fortran requires a fortran compiler!") - # temporary workaround Clang 8.1.0 with XCode 8.3 on macOS, see # https://bitbucket.org/petsc/petsc/commits/4f290403fdd060d09d5cb07345cbfd52670e3cbc # the patch is an adaptation of the original commit to 3.7.5 diff --git a/var/spack/repos/builtin/packages/pnmpi/package.py b/var/spack/repos/builtin/packages/pnmpi/package.py index 9052b9a69f5..0f8d8a82360 100644 --- a/var/spack/repos/builtin/packages/pnmpi/package.py +++ b/var/spack/repos/builtin/packages/pnmpi/package.py @@ -32,15 +32,6 @@ class Pnmpi(CMakePackage): depends_on("doxygen") depends_on("mpi") - @run_before("cmake") - def check_fortran(self): - is_no_fortran_compiler = not self.compiler.f77 and not self.compiler.fc - if self.spec.satisfies("+fortran"): - if is_no_fortran_compiler: - raise InstallError( - "pnmpi+fortran requires Fortran compiler " "but no Fortran compiler found!" - ) - def cmake_args(self): args = [] spec = self.spec diff --git a/var/spack/repos/builtin/packages/py-scipy/package.py b/var/spack/repos/builtin/packages/py-scipy/package.py index 2209dc499c1..f4e613c07e7 100644 --- a/var/spack/repos/builtin/packages/py-scipy/package.py +++ b/var/spack/repos/builtin/packages/py-scipy/package.py @@ -230,11 +230,6 @@ def archive_files(self): @run_before("install") def set_fortran_compiler(self): - if self.compiler.f77 is None or self.compiler.fc is None: - raise InstallError( - "py-scipy requires Fortran compilers. Configure Fortran compiler to proceed." - ) - if self.spec.satisfies("%fj"): with open("setup.cfg", "w") as f: f.write("[config_fc]\n") diff --git a/var/spack/repos/builtin/packages/spherepack/package.py b/var/spack/repos/builtin/packages/spherepack/package.py index 236b2710eda..215db4ab89b 100644 --- a/var/spack/repos/builtin/packages/spherepack/package.py +++ b/var/spack/repos/builtin/packages/spherepack/package.py @@ -18,8 +18,6 @@ class Spherepack(Package): depends_on("gmake", type="build") def install(self, spec, prefix): - if self.compiler.fc is None: - raise InstallError("SPHEREPACK requires a Fortran 90 compiler") make("MAKE=make", "F90=f90 -O2 -fallow-argument-mismatch", "AR=ar", "libspherepack") make("MAKE=make", "F90=f90 -O2 -fallow-argument-mismatch", "AR=ar", "testspherepack") install_tree("lib", prefix.lib) diff --git a/var/spack/repos/builtin/packages/wrf/package.py b/var/spack/repos/builtin/packages/wrf/package.py index f76c45ecb19..b6725f8f2bc 100644 --- a/var/spack/repos/builtin/packages/wrf/package.py +++ b/var/spack/repos/builtin/packages/wrf/package.py @@ -424,12 +424,6 @@ def do_configure_fixup(self): ) config.filter("^CC_TOOLS(.*?)=([^#\n\r]*)(.*)$", r"CC_TOOLS\1=\2 -fpermissive \3") - @run_before("configure") - def fortran_check(self): - if not self.compiler.fc: - msg = "cannot build WRF without a Fortran compiler" - raise RuntimeError(msg) - def configure(self, spec, prefix): # Remove broken default options... self.do_configure_fixup()