From e5f8049f3d1ea309a9d26203658be4f96cc231bf Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Mon, 16 Dec 2024 20:50:59 +0100 Subject: [PATCH] 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 556f0d781cf..0129cbd7365 100644 --- a/var/spack/repos/builtin/packages/acfl/package.py +++ b/var/spack/repos/builtin/packages/acfl/package.py @@ -400,28 +400,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 dfb929d8723..f2c805337df 100644 --- a/var/spack/repos/builtin/packages/gcc/package.py +++ b/var/spack/repos/builtin/packages/gcc/package.py @@ -693,38 +693,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 e55a39afa32..5fb644e5c8b 100644 --- a/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py +++ b/var/spack/repos/builtin/packages/intel-oneapi-compilers/package.py @@ -671,26 +671,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 c93ba1890c2..5c74a720c61 100644 --- a/var/spack/repos/builtin/packages/llvm-amdgpu/package.py +++ b/var/spack/repos/builtin/packages/llvm-amdgpu/package.py @@ -354,26 +354,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 5f81c4d0525..a8fd1e4f9ec 100644 --- a/var/spack/repos/builtin/packages/llvm/package.py +++ b/var/spack/repos/builtin/packages/llvm/package.py @@ -833,49 +833,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