dependencies: Handle .la lib files returned by pkgconfig in uninstalled setups

When building against software that is being built uninstalled,
pkg-config returns values from the -uninstalled.pc variant which
might contain .la files as --libs.

This patch opens the .la files to figure out where the actual shared
library are.

Some part of this is inspired by what is done in the
gobject-introspection giscanner/utils.py code
pull/113/head
Thibault Saunier 10 years ago
parent 28476aa719
commit fea0609c13
  1. 2
      authors.txt
  2. 52
      dependencies.py

@ -15,4 +15,4 @@ Hemmo Nieminen
mfrischknecht mfrischknecht
Matthew Bekkema Matthew Bekkema
Afief Halumi Afief Halumi
Thibault Saunier

@ -19,6 +19,8 @@
# Currently one file, should probably be split into a # Currently one file, should probably be split into a
# package before this gets too big. # package before this gets too big.
import re
import platform
import os, stat, glob, subprocess, shutil import os, stat, glob, subprocess, shutil
from coredata import MesonException from coredata import MesonException
import mlog import mlog
@ -59,6 +61,9 @@ class Dependency():
class PkgConfigDependency(Dependency): class PkgConfigDependency(Dependency):
pkgconfig_found = None pkgconfig_found = None
__libtool_pat = re.compile("dlname='([A-z0-9\.\-\+]+)'\n")
def __init__(self, name, kwargs): def __init__(self, name, kwargs):
required = kwargs.get('required', True) required = kwargs.get('required', True)
Dependency.__init__(self) Dependency.__init__(self)
@ -109,7 +114,21 @@ class PkgConfigDependency(Dependency):
out = p.communicate()[0] out = p.communicate()[0]
if p.returncode != 0: if p.returncode != 0:
raise RuntimeError('Could not generate libs for %s.' % name) raise RuntimeError('Could not generate libs for %s.' % name)
self.libs = out.decode().split() self.libs = []
for lib in out.decode().split():
if lib.endswith(".la"):
shared_libname = self.__extract_libtool_shlib(lib)
shared_lib = os.path.join(os.path.dirname(lib), shared_libname)
if not os.path.exists(shared_lib):
shared_lib = os.path.join(os.path.dirname(lib), ".libs", shared_libname)
if not os.path.exists(shared_lib):
raise RuntimeError('Got a libtools specific "%s" dependencies'
'but we could not compute the actual shared'
'library path' % lib)
lib = shared_lib
self.libs.append(lib)
def get_modversion(self): def get_modversion(self):
return self.modversion return self.modversion
@ -138,6 +157,37 @@ class PkgConfigDependency(Dependency):
def found(self): def found(self):
return self.is_found return self.is_found
def __extract_dlname_field(self, la_file):
f = open(la_file)
data = f.read()
f.close()
m = self.__libtool_pat.search(data)
if m:
return m.groups()[0]
else:
return None
def __extract_libtool_shlib(self, la_file):
'''
Returns the path to the shared library
corresponding to this .la file
'''
dlname = self.__extract_dlname_field(la_file)
if dlname is None:
return None
# Darwin uses absolute paths where possible; since the libtool files never
# contain absolute paths, use the libdir field
if platform.system() == 'Darwin':
dlbasename = os.path.basename(dlname)
libdir = self._extract_libdir_field(la_file)
if libdir is None:
return dlbasename
return libdir + '/' + dlbasename
# From the comments in extract_libtool(), older libtools had
# a path rather than the raw dlname
return os.path.basename(dlname)
class WxDependency(Dependency): class WxDependency(Dependency):
wx_found = None wx_found = None

Loading…
Cancel
Save