diff --git a/authors.txt b/authors.txt index e963f517e..b3f0ddc58 100644 --- a/authors.txt +++ b/authors.txt @@ -15,4 +15,4 @@ Hemmo Nieminen mfrischknecht Matthew Bekkema Afief Halumi - +Thibault Saunier diff --git a/dependencies.py b/dependencies.py index 6ba345355..d57df5e04 100644 --- a/dependencies.py +++ b/dependencies.py @@ -19,6 +19,8 @@ # Currently one file, should probably be split into a # package before this gets too big. +import re +import platform import os, stat, glob, subprocess, shutil from coredata import MesonException import mlog @@ -59,6 +61,9 @@ class Dependency(): class PkgConfigDependency(Dependency): pkgconfig_found = None + __libtool_pat = re.compile("dlname='([A-z0-9\.\-\+]+)'\n") + + def __init__(self, name, kwargs): required = kwargs.get('required', True) Dependency.__init__(self) @@ -109,7 +114,21 @@ class PkgConfigDependency(Dependency): out = p.communicate()[0] if p.returncode != 0: 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): return self.modversion @@ -138,6 +157,37 @@ class PkgConfigDependency(Dependency): def found(self): 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): wx_found = None