From 93187797d69d679f62d663323680dd7a611adce1 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 8 May 2017 10:36:03 -0700 Subject: [PATCH 1/4] Fix OrderedSet `__repr__` protocol for non-string objects Prefer using `repr` on the keys to `str` since `repr` is guaranteed to be implemented, and will return something "good enough" --- mesonbuild/mesonlib.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index fbd732a5d..d97ebbe99 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -708,7 +708,8 @@ class OrderedSet(collections.MutableSet): def __repr__(self): # Don't print 'OrderedSet("")' for an empty set. if self.__container: - return 'OrderedSet("{}")'.format('", "'.join(self.__container.keys())) + return 'OrderedSet("{}")'.format( + '", "'.join(repr(e) for e in self.__container.keys())) return 'OrderedSet()' def add(self, value): From 3a688dc4b7e0a023a7654cc47c390cc88606d57f Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 8 May 2017 10:37:34 -0700 Subject: [PATCH 2/4] Implement difference method for OrderedSet This implementation is obvious rather than efficient, but it's efficient enough for our uses I think. It uses `type(self)` to guarantee that it works even in subclasses or if the name of the class changes. --- mesonbuild/mesonlib.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/mesonbuild/mesonlib.py b/mesonbuild/mesonlib.py index d97ebbe99..7248be9c1 100644 --- a/mesonbuild/mesonlib.py +++ b/mesonbuild/mesonlib.py @@ -722,3 +722,6 @@ class OrderedSet(collections.MutableSet): def update(self, iterable): for item in iterable: self.__container[item] = None + + def difference(self, set_): + return type(self)(e for e in self if e not in set_) From f056b585a2ace2831f22023031d4ac28b9f55aea Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 8 May 2017 10:38:55 -0700 Subject: [PATCH 3/4] Implement a cpp blacklist for LLVM dependency This adds a set of private flags that are removed from the output of `llvm-config --cppflags` before storing them. This is unfortunately necessary since some versions of LLVM include absolute garbage like '-DNDEBUG' in their CPP flags, and we don't want to pass those. --- mesonbuild/dependencies.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mesonbuild/dependencies.py b/mesonbuild/dependencies.py index ef7be3a5e..ea5660e2a 100644 --- a/mesonbuild/dependencies.py +++ b/mesonbuild/dependencies.py @@ -1631,6 +1631,7 @@ class LLVMDependency(Dependency): llvmconfig = None _llvmconfig_found = False __best_found = None + __cpp_blacklist = {'-DNDEBUG'} def __init__(self, environment, kwargs): super().__init__('llvm-config', kwargs) @@ -1676,7 +1677,7 @@ class LLVMDependency(Dependency): p, out = Popen_safe([self.llvmconfig, '--cppflags'])[:2] if p.returncode != 0: raise DependencyException('Could not generate includedir for LLVM.') - self.cargs = shlex.split(out) + self.cargs = list(mesonlib.OrderedSet(shlex.split(out)).difference(self.__cpp_blacklist)) p, out = Popen_safe([self.llvmconfig, '--components'])[:2] if p.returncode != 0: From 45affdd5f2764b5ac3808c0446fafa63d7529663 Mon Sep 17 00:00:00 2001 From: Dylan Baker Date: Mon, 8 May 2017 10:54:25 -0700 Subject: [PATCH 4/4] Fix error log in LLVM, which used the wrong variable And that variable could be undefined at this point. --- mesonbuild/dependencies.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/mesonbuild/dependencies.py b/mesonbuild/dependencies.py index ea5660e2a..f6ca8c3fc 100644 --- a/mesonbuild/dependencies.py +++ b/mesonbuild/dependencies.py @@ -1648,7 +1648,7 @@ class LLVMDependency(Dependency): self.check_llvmconfig(req_version) if not self._llvmconfig_found: if self.__best_found is not None: - mlog.log('found {!r} but need:'.format(self.version), + mlog.log('found {!r} but need:'.format(self.__best_found), req_version) else: mlog.log("No llvm-config found; can't detect dependency")