pkgconfig deps: Warn when a static library isn't found

A hard error makes this feature useless in most cases since a static
library usually won't be found for every library, particularly system
libraries like -lm. Instead, warn so the user can provide the static
library if they wish.

This feature will be expanded and made more extensible and more usable
in the future.

Closes https://github.com/mesonbuild/meson/issues/2785
pull/3108/head
Nirbheek Chauhan 7 years ago committed by Jussi Pakkanen
parent 0c1c387703
commit 8842839bb4
  1. 5
      mesonbuild/compilers/c.py
  2. 20
      mesonbuild/dependencies/base.py
  3. 6
      run_unittests.py
  4. 3
      test cases/frameworks/7 gnome/meson.build
  5. 1
      test cases/unit/17 pkgconfig static/foo.pc.in

@ -780,9 +780,12 @@ class CCompiler(Compiler):
args = ['-l' + libname]
if self.links(code, env, extra_args=args):
return args
# Ensure that we won't modify the list that was passed to us
extra_dirs = extra_dirs[:]
# Search in the system libraries too
extra_dirs += self.get_library_dirs()
# Not found or we want to use a specific libtype? Try to find the
# library file itself.
extra_dirs += self.get_library_dirs()
prefixes, suffixes = self.get_library_naming(env, libtype)
# Triply-nested loop!
for d in extra_dirs:

@ -516,6 +516,7 @@ class PkgConfigDependency(ExternalDependency):
(self.name, out))
self.link_args = []
libpaths = []
static_libs_notfound = []
for lib in self._convert_mingw_paths(shlex.split(out)):
# If we want to use only static libraries, we have to look for the
# file ourselves instead of depending on the compiler to find it
@ -524,13 +525,26 @@ class PkgConfigDependency(ExternalDependency):
if self.static:
if lib.startswith('-L'):
libpaths.append(lib[2:])
print(lib)
continue
# FIXME: try to handle .la files in static mode too?
elif lib.startswith('-l') and libpaths:
args = self.compiler.find_library(lib[2:], self.env, libpaths, libtype='static')
if not args or len(args) < 1:
raise DependencyException('Static library not found for {!r}'
''.format(lib[2:]))
lib = args[0]
if lib in static_libs_notfound:
continue
mlog.warning('Static library {!r} not found for dependency {!r}, may '
'not be statically linked'.format(lib[2:], self.name))
static_libs_notfound.append(lib)
# Preserve the -l arg since we couldn't resolve it to
# a static library. Also need all previous -L args now.
for p in libpaths:
lp = '-L' + p
if lp not in self.link_args:
self.link_args.append(lp)
else:
# Replace -l arg with full path to static library
lib = args[0]
elif lib.endswith(".la"):
shared_libname = self.extract_libtool_shlib(lib)
shared_lib = os.path.join(os.path.dirname(lib), shared_libname)

@ -1567,9 +1567,13 @@ int main(int argc, char **argv) {
def test_pkgconfig_static(self):
'''
Test that the we only use static libraries when `static: true` is
Test that the we prefer static libraries when `static: true` is
passed to dependency() with pkg-config. Can't be an ordinary test
because we need to build libs and try to find them from meson.build
Also test that it's not a hard error to have unsatisfiable library deps
since system libraries -lm will never be found statically.
https://github.com/mesonbuild/meson/issues/2785
'''
if not shutil.which('pkg-config'):
raise unittest.SkipTest('pkg-config not found')

@ -30,6 +30,9 @@ gobj = dependency('gobject-2.0')
gir = dependency('gobject-introspection-1.0')
gmod = dependency('gmodule-2.0')
# Test that static deps don't error out when static libraries aren't found
glib_static = dependency('glib-2.0', static : true)
subdir('resources-data')
subdir('resources')
subdir('gir')

@ -7,4 +7,5 @@ Name: libfoo
Description: A foo library.
Version: 1.0
Libs: -L${libdir} -lfoo
Libs.private: -lm
Cflags: -I${includedir}

Loading…
Cancel
Save