Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
allendowney
GitHub Repository: allendowney/cpython
Path: blob/main/Tools/freeze/checkextensions.py
12 views
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 mod not in mods:
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 list(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 var in vars:
88
str = str[:k] + vars[var] + str[i:]
89
i = k
90
return str
91
92