#! /usr/bin/env python # encoding: utf-8 # Copyright (C) 2006 Matthias Jahn <jahn.matthias@freenet.de> import os, sys from optparse import OptionParser REVISION="0.1.3" class libtool_la_file: def __init__ (self, la_filename): self.__la_filename = la_filename #remove path and .la suffix self.linkname = str(os.path.split(la_filename)[-1])[:-3] if self.linkname.startswith("lib"): self.linkname = self.linkname[3:] # The name that we can dlopen(3). self.dlname = None # Names of this library self.library_names = None # The name of the static archive. self.old_library = None # Libraries that this one depends upon. self.dependency_libs = None # Version information for libIlmImf. self.current = None self.age = None self.revision = None # Is this an already installed library? self.installed = None # Should we warn about portability when linking against -modules? self.shouldnotlink = None # Files to dlopen/dlpreopen self.dlopen = None self.dlpreopen = None # Directory that this library needs to be installed in: self.libdir = '/usr/lib' if not self.__parse(): raise "file %s not found!!" %(la_filename) def __parse(self): "Retrieve the variables from a file" if not os.path.isfile(self.__la_filename): return 0 la_file=open(self.__la_filename, 'r') for line in la_file: ln = line.strip() if not ln: continue if ln[0]=='#': continue (key,value) = str(ln).split('=', 1) value = value.strip() if value == "no": value = False if value == "yes": value = True line = 'self.%s = %s'%(key.strip(), value) exec line la_file.close() return 1 def get_libs(self): """return linkflags for this lib""" libs = [] if self.dependency_libs: libs = str(self.dependency_libs).strip().split() if libs == None: libs = [] # add la lib and libdir libs.insert(0, "-l%s" % self.linkname.strip()) libs.insert(0,"-L%s" % self.libdir.strip()) return libs def __str__(self): r = [ "dlname = \"%s\"" % self.dlname, "library_names = \"%s\"" % self.library_names, "old_library = \"%s\"" % self.old_library, "dependency_libs = \"%s\"" % self.dependency_libs, "version = %s.%s.%s" %(self.current, self.age, self.revision), "installed = \"%s\"" % self.installed, "shouldnotlink = \"%s\"" % self.shouldnotlink, "dlopen = \"%s\"" % self.dlopen, "dlpreopen = \"%s\"" % self.dlpreopen, "libdir = \"%s\"" % self.libdir, ] return "\n".join(r) class libtool_config: def __init__ (self, la_filename): self.__libtool_la_file = libtool_la_file(la_filename) tmp = self.__libtool_la_file self.__version = [int(tmp.current), int(tmp.age), int(tmp.revision)] self.__sub_la_files = [] self.__sub_la_files.append(la_filename) self.__libs = None def __cmp__(self, other): """make it compareable with X.Y.Z versions (Y and Z are optional)""" if not other: return 1 othervers = [int(s) for s in str(other).split(".")] selfvers = self.__version if selfvers > othervers: return 1 if selfvers < othervers: return -1 return 0 def __str__(self): tmp = str(self.__libtool_la_file) tmp += str(" ").join(self.__libtool_la_file.get_libs()) tmp += "\nNew getlibs:\n" tmp += str(" ").join(self.get_libs()) return tmp def __get_la_libs(self, la_filename): return libtool_la_file(la_filename).get_libs() def get_libs(self): """return the complete uniqe linkflags that do not contain .la files anymore""" libs_list = list(self.__libtool_la_file.get_libs()) libs_map = {} while len(libs_list) > 0: entry = libs_list.pop(0) if entry: if str(entry).endswith(".la"): ## prevents duplicate .la checks if entry not in self.__sub_la_files: self.__sub_la_files.append(entry) libs_list.extend(self.__get_la_libs(entry)) else: libs_map[entry]=1 self.__libs = libs_map.keys() return self.__libs def get_libs_only_L(self): if not self.__libs: self.get_libs() libs = self.__libs libs = filter(lambda s: str(s).startswith('-L'), libs) return libs def get_libs_only_l(self): if not self.__libs: self.get_libs() libs = self.__libs libs = filter(lambda s: str(s).startswith('-l'), libs) return libs def get_libs_only_other(self): if not self.__libs: self.get_libs() libs = self.__libs libs = filter(lambda s: not (str(s).startswith('-L') or str(s).startswith('-l')), libs) return libs def useCmdLine(): """parse cmdline args and control build""" usage = "Usage: %prog [options] PathToFile.la \ \nexample: %prog --atleast-version=2.0.0 /usr/lib/libIlmImf.la \ \nor: %prog --libs /usr/lib/libamarok.la" parser = OptionParser(usage) a = parser.add_option a("--version", dest = "versionNumber", action = "store_true", default = False, help = "output version of libtool-config" ) a("--debug", dest = "debug", action = "store_true", default = False, help = "enable debug" ) a("--libs", dest = "libs", action = "store_true", default = False, help = "output all linker flags" ) a("--libs-only-l", dest = "libs_only_l", action = "store_true", default = False, help = "output -l flags" ) a("--libs-only-L", dest = "libs_only_L", action = "store_true", default = False, help = "output -L flags" ) a("--libs-only-other", dest = "libs_only_other", action = "store_true", default = False, help = "output other libs (e.g. -pthread)" ) a("--atleast-version", dest = "atleast_version", default=None, help = "return 0 if the module is at least version ATLEAST_VERSION" ) a("--exact-version", dest = "exact_version", default=None, help = "return 0 if the module is exactly version EXACT_VERSION" ) a("--max-version", dest = "max_version", default=None, help = "return 0 if the module is at no newer than version MAX_VERSION" ) (options, args) = parser.parse_args() if len(args) != 1 and not options.versionNumber: parser.error("incorrect number of arguments") if options.versionNumber: print "libtool-config version %s" % REVISION return 0 ltf = libtool_config(args[0]) if options.debug: print(ltf) if options.atleast_version: if ltf >= options.atleast_version: return 0 sys.exit(1) if options.exact_version: if ltf == options.exact_version: return 0 sys.exit(1) if options.max_version: if ltf <= options.max_version: return 0 sys.exit(1) if options.libs: print str(" ").join(ltf.get_libs()) return 0 if options.libs_only_l: libs = ltf.get_libs_only_l() print str(" ").join(libs) return 0 if options.libs_only_L: libs = ltf.get_libs_only_L() print str(" ").join(libs) return 0 if options.libs_only_other: libs = ltf.get_libs_only_other() print str(" ").join(libs) return 0 if __name__ == "__main__": useCmdLine()