libtool config.py :  » Build » Waf » waf-1.5.17 » utils » Python Open Source

Home
Python Open Source
1.3.1.2 Python
2.Ajax
3.Aspect Oriented
4.Blog
5.Build
6.Business Application
7.Chart Report
8.Content Management Systems
9.Cryptographic
10.Database
11.Development
12.Editor
13.Email
14.ERP
15.Game 2D 3D
16.GIS
17.GUI
18.IDE
19.Installer
20.IRC
21.Issue Tracker
22.Language Interface
23.Log
24.Math
25.Media Sound Audio
26.Mobile
27.Network
28.Parser
29.PDF
30.Project Management
31.RSS
32.Search
33.Security
34.Template Engines
35.Test
36.UML
37.USB Serial
38.Web Frameworks
39.Web Server
40.Web Services
41.Web Unit
42.Wiki
43.Windows
44.XML
Python Open Source » Build » Waf 
Waf » waf 1.5.17 » utils » libtool-config.py
#! /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()

www.java2java.com | Contact Us
Copyright 2009 - 12 Demo Source and Support. All rights reserved.
All other trademarks are property of their respective owners.