Home | History | Annotate | Download | only in freeze
      1 # Check for a module in a set of extension directories.

      2 # An extension directory should contain a Setup file

      3 # and one or more .o files or a lib.a file.

      4 
      5 import os
      6 import parsesetup
      7 
      8 def checkextensions(unknown, extensions):
      9     files = []
     10     modules = []
     11     edict = {}
     12     for e in extensions:
     13         setup = os.path.join(e, 'Setup')
     14         liba = os.path.join(e, 'lib.a')
     15         if not os.path.isfile(liba):
     16             liba = None
     17         edict[e] = parsesetup.getsetupinfo(setup), liba
     18     for mod in unknown:
     19         for e in extensions:
     20             (mods, vars), liba = edict[e]
     21             if not mods.has_key(mod):
     22                 continue
     23             modules.append(mod)
     24             if liba:
     25                 # If we find a lib.a, use it, ignore the

     26                 # .o files, and use *all* libraries for

     27                 # *all* modules in the Setup file

     28                 if liba in files:
     29                     break
     30                 files.append(liba)
     31                 for m in mods.keys():
     32                     files = files + select(e, mods, vars,
     33                                            m, 1)
     34                 break
     35             files = files + select(e, mods, vars, mod, 0)
     36             break
     37     return files, modules
     38 
     39 def select(e, mods, vars, mod, skipofiles):
     40     files = []
     41     for w in mods[mod]:
     42         w = treatword(w)
     43         if not w:
     44             continue
     45         w = expandvars(w, vars)
     46         for w in w.split():
     47             if skipofiles and w[-2:] == '.o':
     48                 continue
     49             # Assume $var expands to absolute pathname

     50             if w[0] not in ('-', '$') and w[-2:] in ('.o', '.a'):
     51                 w = os.path.join(e, w)
     52             if w[:2] in ('-L', '-R') and w[2:3] != '$':
     53                 w = w[:2] + os.path.join(e, w[2:])
     54             files.append(w)
     55     return files
     56 
     57 cc_flags = ['-I', '-D', '-U']
     58 cc_exts = ['.c', '.C', '.cc', '.c++']
     59 
     60 def treatword(w):
     61     if w[:2] in cc_flags:
     62         return None
     63     if w[:1] == '-':
     64         return w # Assume loader flag

     65     head, tail = os.path.split(w)
     66     base, ext = os.path.splitext(tail)
     67     if ext in cc_exts:
     68         tail = base + '.o'
     69         w = os.path.join(head, tail)
     70     return w
     71 
     72 def expandvars(str, vars):
     73     i = 0
     74     while i < len(str):
     75         i = k = str.find('$', i)
     76         if i < 0:
     77             break
     78         i = i+1
     79         var = str[i:i+1]
     80         i = i+1
     81         if var == '(':
     82             j = str.find(')', i)
     83             if j < 0:
     84                 break
     85             var = str[i:j]
     86             i = j+1
     87         if vars.has_key(var):
     88             str = str[:k] + vars[var] + str[i:]
     89             i = k
     90     return str
     91