From 85a263a6708f865bffe77c2fe9bb5e888c466709 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 17 Jun 2017 13:29:13 +0300 Subject: [PATCH 1/2] Failing test for -D dedupping. --- run_unittests.py | 8 ++++++++ test cases/unit/10 d dedup/meson.build | 6 ++++++ test cases/unit/10 d dedup/prog.c | 14 ++++++++++++++ 3 files changed, 28 insertions(+) create mode 100644 test cases/unit/10 d dedup/meson.build create mode 100644 test cases/unit/10 d dedup/prog.c diff --git a/run_unittests.py b/run_unittests.py index a405b01be..7e3a2f11a 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -1221,6 +1221,14 @@ int main(int argc, char **argv) { for path in rpath.split(':'): self.assertTrue(path.startswith('$ORIGIN'), msg=(each, path)) + def test_dash_d_dedup(self): + testdir = os.path.join(self.unit_test_dir, '10 d dedup') + self.init(testdir) + cmd = self.get_compdb()[0]['command'] + self.assertTrue('-D FOO -D BAR' in cmd or \ + '/D FOO /D BAR' in cmd) + + class FailureTests(BasePlatformTests): ''' diff --git a/test cases/unit/10 d dedup/meson.build b/test cases/unit/10 d dedup/meson.build new file mode 100644 index 000000000..08f3a6c67 --- /dev/null +++ b/test cases/unit/10 d dedup/meson.build @@ -0,0 +1,6 @@ +project('d dedup', 'c') + +add_project_arguments('-D', 'FOO', '-D', 'BAR', language : 'c') + +executable('prog', 'prog.c') + diff --git a/test cases/unit/10 d dedup/prog.c b/test cases/unit/10 d dedup/prog.c new file mode 100644 index 000000000..505f12280 --- /dev/null +++ b/test cases/unit/10 d dedup/prog.c @@ -0,0 +1,14 @@ +#include + +#ifndef FOO +#error FOO is not defined. +#endif + +#ifndef BAR +#error BAR is not defined. +#endif + +int main(int argc, char **argv) { + printf("All is well.\n"); + return 0; +} From 1c34707aeeedfe499bf2101253788cb41e970383 Mon Sep 17 00:00:00 2001 From: Jussi Pakkanen Date: Sat, 17 Jun 2017 13:48:59 +0300 Subject: [PATCH 2/2] Preserve standalone -D arguments always. --- mesonbuild/compilers.py | 11 +++++++++++ run_unittests.py | 7 ++++--- 2 files changed, 15 insertions(+), 3 deletions(-) diff --git a/mesonbuild/compilers.py b/mesonbuild/compilers.py index 2b54cc85c..6a9ad4f57 100644 --- a/mesonbuild/compilers.py +++ b/mesonbuild/compilers.py @@ -430,6 +430,17 @@ class CompilerArgs(list): to recursively search for symbols in the libraries. This is not needed with other linkers. ''' + + # A standalone argument must never be deduplicated because it is + # defined by what comes _after_ it. Thus dedupping this: + # -D FOO -D BAR + # would yield either + # -D FOO BAR + # or + # FOO -D BAR + # both of which are invalid. + if arg in cls.dedup2_prefixes: + return 0 if arg in cls.dedup2_args or \ arg.startswith(cls.dedup2_prefixes) or \ arg.endswith(cls.dedup2_suffixes): diff --git a/run_unittests.py b/run_unittests.py index 7e3a2f11a..c21db089a 100755 --- a/run_unittests.py +++ b/run_unittests.py @@ -1225,9 +1225,10 @@ int main(int argc, char **argv) { testdir = os.path.join(self.unit_test_dir, '10 d dedup') self.init(testdir) cmd = self.get_compdb()[0]['command'] - self.assertTrue('-D FOO -D BAR' in cmd or \ - '/D FOO /D BAR' in cmd) - + self.assertTrue('-D FOO -D BAR' in cmd or + '"-D" "FOO" "-D" "BAR"' in cmd or + '/D FOO /D BAR' in cmd or + '"/D" "FOO" "/D" "BAR"' in cmd) class FailureTests(BasePlatformTests):