[Python-checkins] r68487 - in python/trunk: Lib/ctypes/util.py Misc/NEWS (original) (raw)
matthias.klose python-checkins at python.org
Sat Jan 10 18:00:42 CET 2009
- Previous message: [Python-checkins] buildbot failure in sparc solaris10 gcc 3.x
- Next message: [Python-checkins] r68488 - python/branches/py3k/Lib/pickle.py
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Author: matthias.klose Date: Sat Jan 10 18:00:42 2009 New Revision: 68487
Log:
- Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on biarch systems. Try to rely on ldconfig only, without using objdump and gcc.
Modified: python/trunk/Lib/ctypes/util.py python/trunk/Misc/NEWS
Modified: python/trunk/Lib/ctypes/util.py
--- python/trunk/Lib/ctypes/util.py (original) +++ python/trunk/Lib/ctypes/util.py Sat Jan 10 18:00:42 2009 @@ -92,18 +92,20 @@ expr = r'[^()\s]lib%s.[^()\s]' % re.escape(name) fdout, ccout = tempfile.mkstemp() os.close(fdout)
cmd = 'if type gcc >/dev/null 2>&1; then CC=gcc; else CC=cc; fi;' \
cmd = 'if type gcc >/dev/null 2>&1; then CC=gcc; elif type cc >/dev/null 2>&1; then CC=cc;else exit 10; fi;' \ '$CC -Wl,-t -o ' + ccout + ' 2>&1 -l' + name try: f = os.popen(cmd) trace = f.read()
f.close()
rv = f.close() finally: try: os.unlink(ccout) except OSError, e: if e.errno != errno.ENOENT: raise
if rv == 10:
raise OSError, 'gcc or cc command not found' res = re.search(expr, trace) if not res: return None
@@ -125,7 +127,13 @@ # assuming GNU binutils / ELF if not f: return None
cmd = "objdump -p -j .dynamic 2>/dev/null " + f
cmd = 'if ! type objdump >/dev/null 2>&1; then exit 10; fi;' \
"objdump -p -j .dynamic 2>/dev/null " + f
f = os.popen(cmd)
dump = f.read()
rv = f.close()
if rv == 10:
raise OSError, 'objdump command not found' res = re.search(r'\sSONAME\s+([^\s]+)', os.popen(cmd).read()) if not res: return None
@@ -171,8 +179,32 @@ return None return res.group(0)
def _findSoname_ldconfig(name):
import struct
if struct.calcsize('l') == 4:
machine = os.uname()[4] + '-32'
else:
machine = os.uname()[4] + '-64'
mach_map = {
'x86_64-64': 'libc6,x86-64',
'ppc64-64': 'libc6,64bit',
'sparc64-64': 'libc6,64bit',
's390x-64': 'libc6,64bit',
'ia64-64': 'libc6,IA-64',
}
abi_type = mach_map.get(machine, 'libc6')
# XXX assuming GLIBC's ldconfig (with option -p)
expr = r'(\S+)\s+\((%s(?:, OS ABI:[^\)]*)?)\)[^/]*(/[^\(\)\s]*lib%s\.[^\(\)\s]*)' \
% (abi_type, re.escape(name))
res = re.search(expr,
os.popen('/sbin/ldconfig -p 2>/dev/null').read())
if not res:
return None
return res.group(1)
def find_library(name):
return _get_soname(_findLib_ldconfig(name) or _findLib_gcc(name))
return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name))
################################################################
test code
Modified: python/trunk/Misc/NEWS
--- python/trunk/Misc/NEWS (original) +++ python/trunk/Misc/NEWS Sat Jan 10 18:00:42 2009 @@ -286,6 +286,9 @@ - Issue #841800: bundlebuilder now works with 'python -O' +- Issue #4861: ctypes.util.find_library(): Robustify. Fix library detection on + biarch systems. Try to rely on ldconfig only, without using objdump and gcc. + Tools/Demos
- Previous message: [Python-checkins] buildbot failure in sparc solaris10 gcc 3.x
- Next message: [Python-checkins] r68488 - python/branches/py3k/Lib/pickle.py
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]