compilers: corretify deduplication direction

so: when building compile args, meson is deduplicating flags. When a
compiler argument is appended, a later appearance of a dedup'ed is going
to remove a earlier one. If the argument is prepended, the element
*before* the new one is going to be removed. And that is where the
problem reported in https://github.com/mesonbuild/meson/pull/7119 is
coming in. In the revision linked there, the order of replacement in the
prepend case was revesered.

With this patch, we restore this behaviour again.
pull/7297/head
Marcel Hollerbach 4 years ago committed by Jussi Pakkanen
parent 71d68a940b
commit 18b99b3bc3
  1. 4
      mesonbuild/compilers/compilers.py
  2. 19
      run_unittests.py

@ -481,10 +481,10 @@ class CompilerArgs(collections.abc.MutableSequence):
post_flush_set = set()
#The two lists are here walked from the front to the back, in order to not need removals for deduplication
for a in reversed(self.pre):
for a in self.pre:
dedup = self._can_dedup(a)
if a not in pre_flush_set:
pre_flush.appendleft(a)
pre_flush.append(a)
if dedup == 2:
pre_flush_set.add(a)
for a in reversed(self.post):

@ -350,6 +350,25 @@ class InternalTests(unittest.TestCase):
stat.S_IRWXU | stat.S_ISUID |
stat.S_IRGRP | stat.S_IXGRP)
def test_compiler_args_class_none_flush(self):
cargsfunc = mesonbuild.compilers.CompilerArgs
cc = mesonbuild.compilers.CCompiler([], 'fake', False, MachineChoice.HOST, mock.Mock())
a = cargsfunc(cc, ['-I.'])
#first we are checking if the tree construction deduplicates the correct -I argument
a += ['-I..']
a += ['-I./tests/']
a += ['-I./tests2/']
#think this here as assertion, we cannot apply it, otherwise the CompilerArgs would already flush the changes:
# assertEqual(a, ['-I.', '-I./tests2/', '-I./tests/', '-I..', '-I.'])
a += ['-I.']
a += ['-I.', '-I./tests/']
self.assertEqual(a, ['-I.', '-I./tests/', '-I./tests2/', '-I..'])
#then we are checking that when CompilerArgs already have a build container list, that the deduplication is taking the correct one
a += ['-I.', '-I./tests2/']
self.assertEqual(a, ['-I.', '-I./tests2/', '-I./tests/', '-I..'])
def test_compiler_args_class(self):
cargsfunc = mesonbuild.compilers.CompilerArgs
cc = mesonbuild.compilers.CCompiler([], 'fake', False, MachineChoice.HOST, mock.Mock())

Loading…
Cancel
Save