From 396d7ab2a91b1683d3a2beb9d2d10cc4a991a362 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 16 Dec 2024 20:50:59 +0100 Subject: [PATCH] (To be revisited) builtin: add cc, cxx, and fortran properties These properties are implemented in the same way in each compiler package, at least for external specs. So, push the implementation to the base class for now. This needs to be revisited, to make the base class less dependent on C, C++, and Fortran. --- .../repos/builtin/packages/acfl/package.py | 21 ++------- .../repos/builtin/packages/cce/package.py | 23 ++++++++- .../repos/builtin/packages/gcc/package.py | 36 ++++---------- .../intel-oneapi-compilers-classic/package.py | 21 ++------- .../intel-oneapi-compilers/package.py | 21 ++------- .../builtin/packages/llvm-amdgpu/package.py | 21 ++------- .../repos/builtin/packages/llvm/package.py | 47 ++++--------------- .../repos/builtin/packages/msvc/package.py | 14 ------ .../repos/builtin/packages/nag/package.py | 7 +-- .../repos/builtin/packages/xl/package.py | 21 --------- 10 files changed, 53 insertions(+), 179 deletions(-) diff --git a/var/spack/repos/builtin/packages/acfl/package.py b/var/spack/repos/builtin/packages/acfl/package.py index f123292c998..62e4d06945a 100644 --- a/var/spack/repos/builtin/packages/acfl/package.py +++ b/var/spack/repos/builtin/packages/acfl/package.py @@ -398,28 +398,13 @@ def _standard_flag(self, *, language, standard): } return flags[language][standard] - @property - def cc(self): - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("c", None) + def _cc_path(self): return join_path(get_acfl_prefix(self.spec), "bin", "armclang") - @property - def cxx(self): - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("cxx", None) + def _cxx_path(self): return join_path(get_acfl_prefix(self.spec), "bin", "armclang++") - @property - def fortran(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fortran", None) + def _fortran_path(self): return join_path(get_acfl_prefix(self.spec), "bin", "armflang") @property diff --git a/var/spack/repos/builtin/packages/cce/package.py b/var/spack/repos/builtin/packages/cce/package.py index 86105b8ce95..31f1fc240ac 100644 --- a/var/spack/repos/builtin/packages/cce/package.py +++ b/var/spack/repos/builtin/packages/cce/package.py @@ -24,12 +24,33 @@ class Cce(Package, CompilerPackage): debug_flags = ["-g", "-G0", "-G1", "-G2", "-Gfast"] - liink_paths = { + link_paths = { "c": os.path.join("cce", "craycc"), "cxx": os.path.join("cce", "case-insensitive", "crayCC"), "fortran": os.path.join("cce", "crayftn"), } + required_libs = [ + "libalign", + "libcrayacc_amdgpu", + "libcrayacc_x86_64", + "libcraymath", + "libcraymp", + "libcrayompd", + "libcsup", + "libfi", + "libf", + "libmodules64", + "libmodules", + "libopenacc_amdgpu", + "libopenacc", + "libopenacc_x86_64", + "libpgas-shmem", + "libplinterface", + "libquadmath", + "libu", + ] + maintainers("becker33") version("16.0.0") diff --git a/var/spack/repos/builtin/packages/gcc/package.py b/var/spack/repos/builtin/packages/gcc/package.py index dcdc3fecb2c..40876f0345f 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -657,38 +657,20 @@ def validate_detected_spec(cls, spec, extra_attributes): msg = "{0} not in {1}" assert key in compilers, msg.format(key, spec) - @property - def cc(self): - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("c", None) - result = None + def _cc_path(self): if self.spec.satisfies("languages=c"): - result = str(self.spec.prefix.bin.gcc) - return result + return str(self.spec.prefix.bin.gcc) + return None - @property - def cxx(self): - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("cxx", None) - result = None + def _cxx_path(self): if self.spec.satisfies("languages=c++"): - result = os.path.join(self.spec.prefix.bin, "g++") - return result + return os.path.join(self.spec.prefix.bin, "g++") + return None - @property - def fortran(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fortran", None) - result = None + def _fortran_path(self): if self.spec.satisfies("languages=fortran"): - result = str(self.spec.prefix.bin.gfortran) - return result + return str(self.spec.prefix.bin.gfortran) + return None def url_for_version(self, version): # This function will be called when trying to fetch from url, before diff --git a/var/spack/repos/builtin/packages/intel-oneapi-compilers-classic/package.py b/var/spack/repos/builtin/packages/intel-oneapi-compilers-classic/package.py index 60727f3ace4..f6d61864f34 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-compilers-classic/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-compilers-classic/package.py @@ -109,28 +109,13 @@ def symlink_dir(self, src, dest): else: os.symlink(src_path, dest_path) - @property - def cc(self): - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("c", None) + def _cc_path(self): return str(self.prefix.bin.icc) - @property - def cxx(self): - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("cxx", None) + def _cxx_path(self): return str(self.prefix.bin.icpc) - @property - def fortran(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fortran", None) + def _fortran_path(self): return str(self.prefix.bin.ifort) def archspec_name(self): diff --git a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py index 3b2e49488c8..7d419dafb5e 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py @@ -670,26 +670,11 @@ def runtime_constraints(cls, *, spec, pkg): when=f"^[deptypes=build] {spec.name}@{spec.versions}", ) - @property - def cc(self): - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("c", None) + def _cc_path(self): return str(self._llvm_bin.icx) - @property - def cxx(self): - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("cxx", None) + def _cxx_path(self): return str(self._llvm_bin.icpx) - @property - def fortran(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fortran", None) + def _fortran_path(self): return str(self._llvm_bin.ifx) diff --git a/var/spack/repos/builtin/packages/llvm-amdgpu/package.py b/var/spack/repos/builtin/packages/llvm-amdgpu/package.py index 9e15f045c67..9c15138c3c2 100644 --- a/var/spack/repos/builtin/packages/llvm-amdgpu/package.py +++ b/var/spack/repos/builtin/packages/llvm-amdgpu/package.py @@ -350,26 +350,11 @@ def setup_dependent_build_environment(self, env, dependent_spec): env.prepend_path("LD_LIBRARY_PATH", root) env.prune_duplicate_paths("LD_LIBRARY_PATH") - @property - def cc(self): - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("c", None) + def _cc_path(self): return os.path.join(self.spec.prefix.bin, "amdclang") - @property - def cxx(self): - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("cxx", None) + def _cxx_path(self): return os.path.join(self.spec.prefix.bin, "amdclang++") - @property - def fc(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fc", None) + def _fortran_path(self): return os.path.join(self.spec.prefix.bin, "amdflang") diff --git a/var/spack/repos/builtin/packages/llvm/package.py b/var/spack/repos/builtin/packages/llvm/package.py index 68e7ff1465d..d06f6e03487 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -736,49 +736,20 @@ def validate_detected_spec(cls, spec, extra_attributes): msg = "{0} compiler not found for {1}" assert key in compilers, msg.format(key, spec) - @property - def cc(self): - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("c", None) - result = None + def _cc_path(self): if self.spec.satisfies("+clang"): - result = os.path.join(self.spec.prefix.bin, "clang") - return result + return os.path.join(self.spec.prefix.bin, "clang") + return None - @property - def cxx(self): - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("cxx", None) - result = None + def _cxx_path(self): if self.spec.satisfies("+clang"): - result = os.path.join(self.spec.prefix.bin, "clang++") - return result + return os.path.join(self.spec.prefix.bin, "clang++") + return None - @property - def fc(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fc", None) - result = None + def _fortran_path(self): if self.spec.satisfies("+flang"): - result = os.path.join(self.spec.prefix.bin, "flang") - return result - - @property - def f77(self): - msg = "cannot retrieve Fortran 77 compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("f77", None) - result = None - if self.spec.satisfies("+flang"): - result = os.path.join(self.spec.prefix.bin, "flang") - return result + return os.path.join(self.spec.prefix.bin, "flang") + return None debug_flags = [ "-gcodeview", diff --git a/var/spack/repos/builtin/packages/msvc/package.py b/var/spack/repos/builtin/packages/msvc/package.py index 0f5cd750ef8..d70455462fc 100644 --- a/var/spack/repos/builtin/packages/msvc/package.py +++ b/var/spack/repos/builtin/packages/msvc/package.py @@ -63,20 +63,6 @@ def determine_variants(cls, exes, version_str): extras["compilers"]["c"] = extras["compilers"]["cxx"] return spec, extras - @property - def cc(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["c"] - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - - @property - def cxx(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["cxx"] - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - def setup_dependent_build_environment(self, env, dependent_spec): self.init_msvc() # Set the build environment variables for spack. Just using diff --git a/var/spack/repos/builtin/packages/nag/package.py b/var/spack/repos/builtin/packages/nag/package.py index cca7669e363..264007e08e3 100644 --- a/var/spack/repos/builtin/packages/nag/package.py +++ b/var/spack/repos/builtin/packages/nag/package.py @@ -115,10 +115,5 @@ def setup_run_environment(self, env): openmp_flag = "-openmp" - @property - def fortran(self): - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg - if self.spec.external: - return self.spec.extra_attributes["compilers"].get("fortran", None) + def _fortran_path(self): return str(self.spec.prefix.bin.nagfor) diff --git a/var/spack/repos/builtin/packages/xl/package.py b/var/spack/repos/builtin/packages/xl/package.py index c63bcd54fdb..6528946e364 100644 --- a/var/spack/repos/builtin/packages/xl/package.py +++ b/var/spack/repos/builtin/packages/xl/package.py @@ -88,24 +88,3 @@ def determine_variants(cls, exes, version_str): if _compilers: results.append(("~r", {"compilers": _compilers})) return results - - @property - def cc(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["c"] - msg = "cannot retrieve C compiler [spec is not concrete]" - assert self.spec.concrete, msg - - @property - def cxx(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["cxx"] - msg = "cannot retrieve C++ compiler [spec is not concrete]" - assert self.spec.concrete, msg - - @property - def fortran(self): - if self.spec.external: - return self.spec.extra_attributes["compilers"]["fortran"] - msg = "cannot retrieve Fortran compiler [spec is not concrete]" - assert self.spec.concrete, msg