Dont propagate flags between different compilers (#3379)

* Dont propagate flags between different compilers

Fixes #2786

Previously when a spec had no parents with an equivalent compiler,
Spack would default to adding the compiler flags associated with the
root of the DAG. This eliminates that default.

* added test for compiler flag propagation

* simplify compiler flag propagation logic
This commit is contained in:
scheibelp 2017-03-16 21:07:35 -07:00 committed by becker33
parent 328b2142f5
commit 5936ad2ca7
2 changed files with 28 additions and 41 deletions

View File

@ -377,41 +377,26 @@ def concretize_compiler_flags(self, spec):
# running.
return True
compiler_match = lambda other: (
spec.compiler == other.compiler and
spec.architecture == other.architecture)
ret = False
for flag in spack.spec.FlagMap.valid_compiler_flags():
if flag not in spec.compiler_flags:
spec.compiler_flags[flag] = list()
try:
nearest = next(p for p in spec.traverse(direction='parents')
if ((p.compiler == spec.compiler and
p is not spec) and
if (compiler_match(p) and
(p is not spec) and
flag in p.compiler_flags))
if flag not in spec.compiler_flags or \
not (sorted(spec.compiler_flags[flag]) >=
sorted(nearest.compiler_flags[flag])):
if flag in spec.compiler_flags:
spec.compiler_flags[flag] = list(
set(spec.compiler_flags[flag]) |
set(nearest.compiler_flags[flag]))
else:
spec.compiler_flags[
flag] = nearest.compiler_flags[flag]
nearest_flags = set(nearest.compiler_flags.get(flag, []))
flags = set(spec.compiler_flags.get(flag, []))
if (nearest_flags - flags):
spec.compiler_flags[flag] = list(nearest_flags | flags)
ret = True
except StopIteration:
if (flag in spec.root.compiler_flags and
((flag not in spec.compiler_flags) or
sorted(spec.compiler_flags[flag]) !=
sorted(spec.root.compiler_flags[flag]))):
if flag in spec.compiler_flags:
spec.compiler_flags[flag] = list(
set(spec.compiler_flags[flag]) |
set(spec.root.compiler_flags[flag]))
else:
spec.compiler_flags[
flag] = spec.root.compiler_flags[flag]
ret = True
else:
if flag not in spec.compiler_flags:
spec.compiler_flags[flag] = []
pass
# Include the compiler flag defaults from the config files
# This ensures that spack will detect conflicts that stem from a change
@ -419,19 +404,11 @@ def concretize_compiler_flags(self, spec):
compiler = spack.compilers.compiler_for_spec(
spec.compiler, spec.architecture)
for flag in compiler.flags:
if flag not in spec.compiler_flags:
spec.compiler_flags[flag] = compiler.flags[flag]
if compiler.flags[flag] != []:
ret = True
else:
if ((sorted(spec.compiler_flags[flag]) !=
sorted(compiler.flags[flag])) and
(not set(spec.compiler_flags[flag]) >=
set(compiler.flags[flag]))):
ret = True
spec.compiler_flags[flag] = list(
set(spec.compiler_flags[flag]) |
set(compiler.flags[flag]))
config_flags = set(compiler.flags.get(flag, []))
flags = set(spec.compiler_flags.get(flag, []))
spec.compiler_flags[flag] = list(config_flags | flags)
if (config_flags - flags):
ret = True
return ret

View File

@ -175,6 +175,16 @@ def test_provides_handles_multiple_providers_of_same_vesrion(self):
assert Spec('builtin.mock.multi-provider-mpi@1.10.0') in providers
assert Spec('builtin.mock.multi-provider-mpi@1.8.8') in providers
def test_different_compilers_get_different_flags(self):
client = Spec('cmake-client %gcc@4.7.2 platform=test os=fe target=fe' +
' ^cmake %clang@3.5 platform=test os=fe target=fe')
client.concretize()
cmake = client['cmake']
assert set(client.compiler_flags['cflags']) == set(['-O0'])
assert set(cmake.compiler_flags['cflags']) == set(['-O3'])
assert set(client.compiler_flags['fflags']) == set(['-O0'])
assert not set(cmake.compiler_flags['fflags'])
def concretize_multi_provider(self):
s = Spec('mpileaks ^multi-provider-mpi@3.0')
s.concretize()