|
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 |