diff options
-rw-r--r-- | mesonbuild/dependencies/base.py | 21 | ||||
-rw-r--r-- | mesonbuild/modules/pkgconfig.py | 10 | ||||
-rw-r--r-- | test cases/unit/33 external, internal library rpath/external library/meson.build | 2 |
3 files changed, 22 insertions, 11 deletions
diff --git a/mesonbuild/dependencies/base.py b/mesonbuild/dependencies/base.py index 3bff0d2..8319cb7 100644 --- a/mesonbuild/dependencies/base.py +++ b/mesonbuild/dependencies/base.py @@ -589,9 +589,12 @@ class PkgConfigDependency(ExternalDependency): if ret != 0: raise DependencyException('Could not generate libs for %s:\n\n%s' % (self.name, out)) - # These libraries should be safe to de-dup - link_args = OrderedSet() + link_args = [] + # Library paths should be safe to de-dup libpaths = OrderedSet() + # Track -lfoo libraries to avoid duplicate work + libs_found = OrderedSet() + # Track not-found libraries to know whether to add library paths libs_notfound = [] libtype = 'static' if self.static else 'default' # We always look for the file ourselves instead of depending on the @@ -609,6 +612,9 @@ class PkgConfigDependency(ExternalDependency): libpaths.add(lib[2:]) continue elif lib.startswith('-l'): + # Don't resolve the same -lfoo argument again + if lib in libs_found: + continue if self.clib_compiler: args = self.clib_compiler.find_library(lib[2:], self.env, list(libpaths), libtype) @@ -618,10 +624,11 @@ class PkgConfigDependency(ExternalDependency): else: args = None if args: + libs_found.add(lib) # Replace -l arg with full path to library if available + # else, library is provided by the compiler and can't be resolved if not args[0].startswith('-l'): lib = args[0] - # else, library is provided by the compiler and can't be resolved else: # Library wasn't found, maybe we're looking in the wrong # places or the library will be provided with LDFLAGS or @@ -645,10 +652,12 @@ class PkgConfigDependency(ExternalDependency): raise DependencyException('Got a libtools specific "%s" dependencies' 'but we could not compute the actual shared' 'library path' % lib) - lib = shared_lib self.is_libtool = True - link_args.add(lib) - self.link_args = list(link_args) + lib = shared_lib + if lib in link_args: + continue + link_args.append(lib) + self.link_args = link_args # Add all -Lbar args if we have -lfoo args in link_args if libs_notfound: # Order of -L flags doesn't matter with ld, but it might with other diff --git a/mesonbuild/modules/pkgconfig.py b/mesonbuild/modules/pkgconfig.py index 68c2dc5..63d1109 100644 --- a/mesonbuild/modules/pkgconfig.py +++ b/mesonbuild/modules/pkgconfig.py @@ -170,16 +170,18 @@ class DependenciesHelper: return ', '.join(result) def remove_dups(self): - def _fn(xs): + def _fn(xs, libs=False): # Remove duplicates whilst preserving original order result = [] for x in xs: - if x not in result: + # Don't de-dup unknown strings to avoid messing up arguments like: + # ['-framework', 'CoreAudio', '-framework', 'CoreMedia'] + if x not in result or (libs and (isinstance(x, str) and not x.endswith(('-l', '-L')))): result.append(x) return result - self.pub_libs = _fn(self.pub_libs) + self.pub_libs = _fn(self.pub_libs, True) self.pub_reqs = _fn(self.pub_reqs) - self.priv_libs = _fn(self.priv_libs) + self.priv_libs = _fn(self.priv_libs, True) self.priv_reqs = _fn(self.priv_reqs) self.cflags = _fn(self.cflags) diff --git a/test cases/unit/33 external, internal library rpath/external library/meson.build b/test cases/unit/33 external, internal library rpath/external library/meson.build index 0e9f443..6dcc97e 100644 --- a/test cases/unit/33 external, internal library rpath/external library/meson.build +++ b/test cases/unit/33 external, internal library rpath/external library/meson.build @@ -5,5 +5,5 @@ l = shared_library('faa_pkg', 'faa.c', install: true) pkg = import('pkgconfig') pkg.generate(name: 'faa_pkg', - libraries: l, + libraries: [l, '-framework', 'CoreFoundation', '-framework', 'CoreMedia'], description: 'FAA, a pkg-config test library') |