blob: c18af78f0183e23a7dd9a3c3155e4931675d1f14 [file] [log] [blame]
Guido van Rossumd8336c21994-10-05 16:13:01 +00001# 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
5import os
Guido van Rossumd8336c21994-10-05 16:13:01 +00006import parsesetup
7
8def checkextensions(unknown, extensions):
Tim Peters182b5ac2004-07-18 06:16:08 +00009 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]
Georg Brandlbf82e372008-05-16 17:02:34 +000021 if mod not in mods:
Tim Peters182b5ac2004-07-18 06:16:08 +000022 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)
Georg Brandlbf82e372008-05-16 17:02:34 +000031 for m in list(mods.keys()):
Tim Peters182b5ac2004-07-18 06:16:08 +000032 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
Guido van Rossumd8336c21994-10-05 16:13:01 +000038
39def select(e, mods, vars, mod, skipofiles):
Tim Peters182b5ac2004-07-18 06:16:08 +000040 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
Guido van Rossumd8336c21994-10-05 16:13:01 +000056
57cc_flags = ['-I', '-D', '-U']
58cc_exts = ['.c', '.C', '.cc', '.c++']
59
60def treatword(w):
Tim Peters182b5ac2004-07-18 06:16:08 +000061 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
Guido van Rossumd8336c21994-10-05 16:13:01 +000071
72def expandvars(str, vars):
Tim Peters182b5ac2004-07-18 06:16:08 +000073 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
Georg Brandlbf82e372008-05-16 17:02:34 +000087 if var in vars:
Tim Peters182b5ac2004-07-18 06:16:08 +000088 str = str[:k] + vars[var] + str[i:]
89 i = k
90 return str