From b78cc5b43d5fe6c4c477f00d7a524fdb7d480951 Mon Sep 17 00:00:00 2001 From: Massimiliano Culpo Date: Wed, 2 Dec 2020 20:30:28 +0100 Subject: concretizer: try hard to infer the real version of compilers (#20099) fixes #20055 Compiler with custom versions like gcc@foo are not currently matched to the appropriate targets. This is because the version of spec doesn't match the "real" version of the compiler. This PR replicates the strategy used in the original concretizer to deal with that and tries to detect the real version of compilers if the version in the spec returns no results. --- lib/spack/spack/solver/asp.py | 34 ++++++++++++++++++++++--- lib/spack/spack/test/concretize.py | 8 ++++++ lib/spack/spack/test/data/config/compilers.yaml | 14 ++++++++++ 3 files changed, 53 insertions(+), 3 deletions(-) (limited to 'lib') diff --git a/lib/spack/spack/solver/asp.py b/lib/spack/spack/solver/asp.py index f0fa41fb6e..f4b2da319a 100644 --- a/lib/spack/spack/solver/asp.py +++ b/lib/spack/spack/solver/asp.py @@ -31,6 +31,7 @@ import llnl.util.tty.color as color import spack import spack.architecture import spack.cmd +import spack.compilers import spack.config import spack.dependency import spack.error @@ -829,6 +830,18 @@ class SpackSolverSetup(object): f = fn.default_compiler_preference(cspec.name, cspec.version, i) self.gen.fact(f) + # Enumerate target families. This may be redundant, but compilers with + # custom versions will be able to concretize properly. + for entry in spack.compilers.all_compilers_config(): + compiler_entry = entry['compiler'] + cspec = spack.spec.CompilerSpec(compiler_entry['spec']) + if not compiler_entry.get('target', None): + continue + + self.gen.fact(fn.compiler_supports_target( + cspec.name, cspec.version, compiler_entry['target'] + )) + def compiler_supports_os(self): compilers_yaml = spack.compilers.all_compilers_config() for entry in compilers_yaml: @@ -1230,7 +1243,7 @@ class SpackSolverSetup(object): if dep.versions.concrete: self.possible_versions[dep.name].add(dep.version) - def _supported_targets(self, compiler, targets): + def _supported_targets(self, compiler_name, compiler_version, targets): """Get a list of which targets are supported by the compiler. Results are ordered most to least recent. @@ -1239,7 +1252,7 @@ class SpackSolverSetup(object): for target in targets: try: - target.optimization_flags(compiler.name, compiler.version) + target.optimization_flags(compiler_name, compiler_version) supported.append(target) except archspec.cpu.UnsupportedMicroarchitecture: continue @@ -1289,7 +1302,22 @@ class SpackSolverSetup(object): # TODO: investigate this. best_targets = set([uarch.family.name]) for compiler in sorted(compilers): - supported = self._supported_targets(compiler, compatible_targets) + supported = self._supported_targets( + compiler.name, compiler.version, compatible_targets + ) + + # If we can't find supported targets it may be due to custom + # versions in the spec, e.g. gcc@foo. Try to match the + # real_version from the compiler object to get more accurate + # results. + if not supported: + compiler_obj = spack.compilers.compilers_for_spec(compiler) + compiler_obj = compiler_obj[0] + supported = self._supported_targets( + compiler.name, + compiler_obj.real_version, + compatible_targets + ) if not supported: continue diff --git a/lib/spack/spack/test/concretize.py b/lib/spack/spack/test/concretize.py index e5cd8b162a..8366ecca14 100644 --- a/lib/spack/spack/test/concretize.py +++ b/lib/spack/spack/test/concretize.py @@ -959,3 +959,11 @@ class TestConcretize(object): # Check that non-default variant values are forced on the dependency d = s['dep-with-variants'] assert '+foo+bar+baz' in d + + @pytest.mark.regression('20055') + def test_custom_compiler_version(self): + if spack.config.get('config:concretizer') == 'original': + pytest.xfail('Known failure of the original concretizer') + + s = Spec('a %gcc@foo os=redhat6').concretized() + assert '%gcc@foo' in s diff --git a/lib/spack/spack/test/data/config/compilers.yaml b/lib/spack/spack/test/data/config/compilers.yaml index 3a63796941..641331dc9f 100644 --- a/lib/spack/spack/test/data/config/compilers.yaml +++ b/lib/spack/spack/test/data/config/compilers.yaml @@ -8,6 +8,7 @@ compilers: f77: None fc: None modules: 'None' + target: x86_64 - compiler: spec: gcc@4.5.0 operating_system: {0.name}{0.version} @@ -17,6 +18,7 @@ compilers: f77: None fc: None modules: 'None' + target: x86_64 - compiler: spec: clang@3.3 operating_system: CNL @@ -35,6 +37,7 @@ compilers: f77: None fc: None modules: 'None' + target: x86_64 - compiler: spec: clang@3.3 operating_system: yosemite @@ -44,6 +47,7 @@ compilers: f77: None fc: None modules: 'None' + target: x86_64 - compiler: paths: cc: /path/to/gcc @@ -62,6 +66,7 @@ compilers: operating_system: SuSE11 spec: gcc@4.5.0 modules: 'None' + target: x86_64 - compiler: paths: cc: /path/to/gcc @@ -71,6 +76,7 @@ compilers: operating_system: yosemite spec: gcc@4.5.0 modules: 'None' + target: x86_64 - compiler: paths: cc: /path/to/gcc @@ -80,6 +86,7 @@ compilers: operating_system: elcapitan spec: gcc@4.5.0 modules: 'None' + target: x86_64 - compiler: spec: clang@3.3 operating_system: elcapitan @@ -89,6 +96,7 @@ compilers: f77: None fc: None modules: 'None' + target: x86_64 - compiler: spec: gcc@4.7.2 operating_system: redhat6 @@ -102,6 +110,7 @@ compilers: cxxflags: -O0 -g fflags: -O0 -g modules: 'None' + target: x86_64 - compiler: spec: gcc@4.4.0 operating_system: redhat6 @@ -123,6 +132,7 @@ compilers: cflags: -O3 cxxflags: -O3 modules: 'None' + target: x86_64 - compiler: spec: clang@8.0.0 operating_system: redhat7 @@ -135,6 +145,7 @@ compilers: cflags: -O3 cxxflags: -O3 modules: 'None' + target: x86_64 - compiler: spec: apple-clang@9.1.0 operating_system: elcapitan @@ -144,6 +155,7 @@ compilers: f77: None fc: None modules: 'None' + target: x86_64 - compiler: spec: gcc@foo operating_system: redhat6 @@ -153,6 +165,7 @@ compilers: f77: /path/to/gfortran fc: /path/to/gfortran modules: 'None' + target: x86_64 - compiler: spec: gcc@4.4.0-special operating_system: redhat6 @@ -162,3 +175,4 @@ compilers: f77: /path/to/gfortran fc: /path/to/gfortran modules: 'None' + target: x86_64 -- cgit v1.2.3-70-g09d2