symbian-qemu-0.9.1-12/python-2.6.1/Tools/freeze/checkextensions.py
changeset 1 2fb8b9db1c86
equal deleted inserted replaced
0:ffa851df0825 1:2fb8b9db1c86
       
     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