Merge pull request #113 from thiblahute/uninstalled_pkg_config

dependencies: Handle .la lib files returned by pkgconfig in uninstalled setups
pull/121/head
jpakkane 10 years ago
commit dbf3d0e376
  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