diff options
author | Massimiliano Culpo <massimiliano.culpo@gmail.com> | 2020-12-02 20:30:28 +0100 |
---|---|---|
committer | Tamara Dahlgren <dahlgren1@llnl.gov> | 2021-02-17 17:07:21 -0800 |
commit | b78cc5b43d5fe6c4c477f00d7a524fdb7d480951 (patch) | |
tree | 1839f4da10787412b8777a9ea627bf806b9f4147 | |
parent | 571e36787b96ac1d24824218024954c83dea8c8f (diff) | |
download | spack-b78cc5b43d5fe6c4c477f00d7a524fdb7d480951.tar.gz spack-b78cc5b43d5fe6c4c477f00d7a524fdb7d480951.tar.bz2 spack-b78cc5b43d5fe6c4c477f00d7a524fdb7d480951.tar.xz spack-b78cc5b43d5fe6c4c477f00d7a524fdb7d480951.zip |
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.
-rw-r--r-- | lib/spack/spack/solver/asp.py | 34 | ||||
-rw-r--r-- | lib/spack/spack/test/concretize.py | 8 | ||||
-rw-r--r-- | lib/spack/spack/test/data/config/compilers.yaml | 14 |
3 files changed, 53 insertions, 3 deletions
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 |