aboutsummaryrefslogtreecommitdiff
path: root/dependencies.py
diff options
context:
space:
mode:
Diffstat (limited to 'dependencies.py')
-rw-r--r--dependencies.py52
1 files changed, 51 insertions, 1 deletions
diff --git a/dependencies.py b/dependencies.py
index 6ba3453..d57df5e 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