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.
This commit is contained in:
Massimiliano Culpo 2024-12-16 20:50:59 +01:00
parent da48fdd864
commit e5f8049f3d
No known key found for this signature in database
GPG Key ID: 3E52BB992233066C
10 changed files with 53 additions and 179 deletions

View File

@ -400,28 +400,13 @@ def _standard_flag(self, *, language, standard):
} }
return flags[language][standard] return flags[language][standard]
@property def _cc_path(self):
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)
return join_path(get_acfl_prefix(self.spec), "bin", "armclang") return join_path(get_acfl_prefix(self.spec), "bin", "armclang")
@property def _cxx_path(self):
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)
return join_path(get_acfl_prefix(self.spec), "bin", "armclang++") return join_path(get_acfl_prefix(self.spec), "bin", "armclang++")
@property def _fortran_path(self):
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)
return join_path(get_acfl_prefix(self.spec), "bin", "armflang") return join_path(get_acfl_prefix(self.spec), "bin", "armflang")
@property @property

View File

@ -24,12 +24,33 @@ class Cce(Package, CompilerPackage):
debug_flags = ["-g", "-G0", "-G1", "-G2", "-Gfast"] debug_flags = ["-g", "-G0", "-G1", "-G2", "-Gfast"]
liink_paths = { link_paths = {
"c": os.path.join("cce", "craycc"), "c": os.path.join("cce", "craycc"),
"cxx": os.path.join("cce", "case-insensitive", "crayCC"), "cxx": os.path.join("cce", "case-insensitive", "crayCC"),
"fortran": os.path.join("cce", "crayftn"), "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") maintainers("becker33")
version("16.0.0") version("16.0.0")

View File

@ -693,38 +693,20 @@ def validate_detected_spec(cls, spec, extra_attributes):
msg = "{0} not in {1}" msg = "{0} not in {1}"
assert key in compilers, msg.format(key, spec) assert key in compilers, msg.format(key, spec)
@property def _cc_path(self):
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
if self.spec.satisfies("languages=c"): if self.spec.satisfies("languages=c"):
result = str(self.spec.prefix.bin.gcc) return str(self.spec.prefix.bin.gcc)
return result return None
@property def _cxx_path(self):
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
if self.spec.satisfies("languages=c++"): if self.spec.satisfies("languages=c++"):
result = os.path.join(self.spec.prefix.bin, "g++") return os.path.join(self.spec.prefix.bin, "g++")
return result return None
@property def _fortran_path(self):
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
if self.spec.satisfies("languages=fortran"): if self.spec.satisfies("languages=fortran"):
result = str(self.spec.prefix.bin.gfortran) return str(self.spec.prefix.bin.gfortran)
return result return None
def url_for_version(self, version): def url_for_version(self, version):
# This function will be called when trying to fetch from url, before # This function will be called when trying to fetch from url, before

View File

@ -109,28 +109,13 @@ def symlink_dir(self, src, dest):
else: else:
os.symlink(src_path, dest_path) os.symlink(src_path, dest_path)
@property def _cc_path(self):
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)
return str(self.prefix.bin.icc) return str(self.prefix.bin.icc)
@property def _cxx_path(self):
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)
return str(self.prefix.bin.icpc) return str(self.prefix.bin.icpc)
@property def _fortran_path(self):
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)
return str(self.prefix.bin.ifort) return str(self.prefix.bin.ifort)
def archspec_name(self): def archspec_name(self):

View File

@ -671,26 +671,11 @@ def runtime_constraints(cls, *, spec, pkg):
when=f"^[deptypes=build] {spec.name}@{spec.versions}", when=f"^[deptypes=build] {spec.name}@{spec.versions}",
) )
@property def _cc_path(self):
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)
return str(self._llvm_bin.icx) return str(self._llvm_bin.icx)
@property def _cxx_path(self):
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)
return str(self._llvm_bin.icpx) return str(self._llvm_bin.icpx)
@property def _fortran_path(self):
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)
return str(self._llvm_bin.ifx) return str(self._llvm_bin.ifx)

View File

@ -354,26 +354,11 @@ def setup_dependent_build_environment(self, env, dependent_spec):
env.prepend_path("LD_LIBRARY_PATH", root) env.prepend_path("LD_LIBRARY_PATH", root)
env.prune_duplicate_paths("LD_LIBRARY_PATH") env.prune_duplicate_paths("LD_LIBRARY_PATH")
@property def _cc_path(self):
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)
return os.path.join(self.spec.prefix.bin, "amdclang") return os.path.join(self.spec.prefix.bin, "amdclang")
@property def _cxx_path(self):
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)
return os.path.join(self.spec.prefix.bin, "amdclang++") return os.path.join(self.spec.prefix.bin, "amdclang++")
@property def _fortran_path(self):
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)
return os.path.join(self.spec.prefix.bin, "amdflang") return os.path.join(self.spec.prefix.bin, "amdflang")

View File

@ -833,49 +833,20 @@ def validate_detected_spec(cls, spec, extra_attributes):
msg = "{0} compiler not found for {1}" msg = "{0} compiler not found for {1}"
assert key in compilers, msg.format(key, spec) assert key in compilers, msg.format(key, spec)
@property def _cc_path(self):
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
if self.spec.satisfies("+clang"): if self.spec.satisfies("+clang"):
result = os.path.join(self.spec.prefix.bin, "clang") return os.path.join(self.spec.prefix.bin, "clang")
return result return None
@property def _cxx_path(self):
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
if self.spec.satisfies("+clang"): if self.spec.satisfies("+clang"):
result = os.path.join(self.spec.prefix.bin, "clang++") return os.path.join(self.spec.prefix.bin, "clang++")
return result return None
@property def _fortran_path(self):
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
if self.spec.satisfies("+flang"): if self.spec.satisfies("+flang"):
result = os.path.join(self.spec.prefix.bin, "flang") return os.path.join(self.spec.prefix.bin, "flang")
return result return None
@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
debug_flags = [ debug_flags = [
"-gcodeview", "-gcodeview",

View File

@ -63,20 +63,6 @@ def determine_variants(cls, exes, version_str):
extras["compilers"]["c"] = extras["compilers"]["cxx"] extras["compilers"]["c"] = extras["compilers"]["cxx"]
return spec, extras 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): def setup_dependent_build_environment(self, env, dependent_spec):
self.init_msvc() self.init_msvc()
# Set the build environment variables for spack. Just using # Set the build environment variables for spack. Just using

View File

@ -115,10 +115,5 @@ def setup_run_environment(self, env):
openmp_flag = "-openmp" openmp_flag = "-openmp"
@property def _fortran_path(self):
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)
return str(self.spec.prefix.bin.nagfor) return str(self.spec.prefix.bin.nagfor)

View File

@ -88,24 +88,3 @@ def determine_variants(cls, exes, version_str):
if _compilers: if _compilers:
results.append(("~r", {"compilers": _compilers})) results.append(("~r", {"compilers": _compilers}))
return results 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