1994-10-05 16:13:01 +00:00
|
|
|
# Check for a module in a set of extension directories.
|
|
|
|
# An extension directory should contain a Setup file
|
|
|
|
# and one or more .o files or a lib.a file.
|
|
|
|
|
|
|
|
import os
|
|
|
|
import string
|
|
|
|
import parsesetup
|
|
|
|
|
|
|
|
def checkextensions(unknown, extensions):
|
|
|
|
files = []
|
|
|
|
modules = []
|
|
|
|
edict = {}
|
|
|
|
for e in extensions:
|
|
|
|
setup = os.path.join(e, 'Setup')
|
|
|
|
liba = os.path.join(e, 'lib.a')
|
|
|
|
if not os.path.isfile(liba):
|
|
|
|
liba = None
|
|
|
|
edict[e] = parsesetup.getsetupinfo(setup), liba
|
|
|
|
for mod in unknown:
|
|
|
|
for e in extensions:
|
|
|
|
(mods, vars), liba = edict[e]
|
|
|
|
if not mods.has_key(mod):
|
|
|
|
continue
|
|
|
|
modules.append(mod)
|
|
|
|
if liba:
|
|
|
|
# If we find a lib.a, use it, ignore the
|
|
|
|
# .o files, and use *all* libraries for
|
|
|
|
# *all* modules in the Setup file
|
|
|
|
if liba in files:
|
|
|
|
break
|
|
|
|
files.append(liba)
|
|
|
|
for m in mods.keys():
|
|
|
|
files = files + select(e, mods, vars,
|
|
|
|
m, 1)
|
|
|
|
break
|
|
|
|
files = files + select(e, mods, vars, mod, 0)
|
|
|
|
break
|
|
|
|
return files, modules
|
|
|
|
|
|
|
|
def select(e, mods, vars, mod, skipofiles):
|
|
|
|
files = []
|
|
|
|
for w in mods[mod]:
|
|
|
|
w = treatword(w)
|
|
|
|
if not w:
|
|
|
|
continue
|
|
|
|
w = expandvars(w, vars)
|
1998-05-06 14:38:30 +00:00
|
|
|
for w in string.split(w):
|
|
|
|
if skipofiles and w[-2:] == '.o':
|
|
|
|
continue
|
Simplified version of a patch by Chih-Hao Huang, who wrote:
"""
When there are additional Setup files, specified by -e option of freeze,
checkextenstions.py assumes that *.o, *.a, -Lpath, and -Rpath are all
relative to where the Setup file is. select() inserts the path to the
Setup file to make them absolute. However, the assumption is not true.
There are cases that absolute paths are specified for them. The inserted
prefix, by select(), results in error.
The following fix check for absolute paths. The assumption is: an
absolute path begins with either '/' or '$'. In the latter case, it is
from the environmental variable. (Variables defined locally in the Setup
file have already been handled by expandvars())
"""
My version of the patch has been verified by Charles Waldman (a
colleague of Chih-Hao).
1999-06-23 21:37:57 +00:00
|
|
|
# Assume $var expands to absolute pathname
|
|
|
|
if w[0] not in ('-', '$') and w[-2:] in ('.o', '.a'):
|
1998-05-06 14:38:30 +00:00
|
|
|
w = os.path.join(e, w)
|
Simplified version of a patch by Chih-Hao Huang, who wrote:
"""
When there are additional Setup files, specified by -e option of freeze,
checkextenstions.py assumes that *.o, *.a, -Lpath, and -Rpath are all
relative to where the Setup file is. select() inserts the path to the
Setup file to make them absolute. However, the assumption is not true.
There are cases that absolute paths are specified for them. The inserted
prefix, by select(), results in error.
The following fix check for absolute paths. The assumption is: an
absolute path begins with either '/' or '$'. In the latter case, it is
from the environmental variable. (Variables defined locally in the Setup
file have already been handled by expandvars())
"""
My version of the patch has been verified by Charles Waldman (a
colleague of Chih-Hao).
1999-06-23 21:37:57 +00:00
|
|
|
if w[:2] in ('-L', '-R') and w[2:3] != '$':
|
1998-05-06 14:38:30 +00:00
|
|
|
w = w[:2] + os.path.join(e, w[2:])
|
|
|
|
files.append(w)
|
1994-10-05 16:13:01 +00:00
|
|
|
return files
|
|
|
|
|
|
|
|
cc_flags = ['-I', '-D', '-U']
|
|
|
|
cc_exts = ['.c', '.C', '.cc', '.c++']
|
|
|
|
|
|
|
|
def treatword(w):
|
|
|
|
if w[:2] in cc_flags:
|
|
|
|
return None
|
|
|
|
if w[:1] == '-':
|
|
|
|
return w # Assume loader flag
|
|
|
|
head, tail = os.path.split(w)
|
|
|
|
base, ext = os.path.splitext(tail)
|
|
|
|
if ext in cc_exts:
|
|
|
|
tail = base + '.o'
|
|
|
|
w = os.path.join(head, tail)
|
|
|
|
return w
|
|
|
|
|
|
|
|
def expandvars(str, vars):
|
|
|
|
i = 0
|
|
|
|
while i < len(str):
|
|
|
|
i = k = string.find(str, '$', i)
|
|
|
|
if i < 0:
|
|
|
|
break
|
|
|
|
i = i+1
|
|
|
|
var = str[i:i+1]
|
|
|
|
i = i+1
|
|
|
|
if var == '(':
|
|
|
|
j = string.find(str, ')', i)
|
|
|
|
if j < 0:
|
|
|
|
break
|
|
|
|
var = str[i:j]
|
|
|
|
i = j+1
|
|
|
|
if vars.has_key(var):
|
|
|
|
str = str[:k] + vars[var] + str[i:]
|
|
|
|
i = k
|
|
|
|
return str
|