util.py (7178B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\ctypes\util.py 2 import sys, os 3 if os.name == 'nt': 4 5 def _get_build_version(): 6 prefix = 'MSC v.' 7 i = sys.version.find(prefix) 8 if i == -1: 9 return 6 10 i = i + len(prefix) 11 s, rest = sys.version[i:].split(' ', 1) 12 majorVersion = int(s[:-2]) - 6 13 minorVersion = int(s[2:3]) / 10.0 14 if majorVersion == 6: 15 minorVersion = 0 16 if majorVersion >= 6: 17 return majorVersion + minorVersion 18 19 20 def find_msvcrt(): 21 version = _get_build_version() 22 if version is None: 23 return 24 if version <= 6: 25 clibname = 'msvcrt' 26 else: 27 clibname = 'msvcr%d' % (version * 10) 28 import imp 29 if imp.get_suffixes()[0][0] == '_d.pyd': 30 clibname += 'd' 31 return clibname + '.dll' 32 33 34 def find_library(name): 35 if name in ('c', 'm'): 36 return find_msvcrt() 37 for directory in os.environ['PATH'].split(os.pathsep): 38 fname = os.path.join(directory, name) 39 if os.path.isfile(fname): 40 return fname 41 if fname.lower().endswith('.dll'): 42 continue 43 fname = fname + '.dll' 44 if os.path.isfile(fname): 45 return fname 46 47 48 if os.name == 'ce': 49 50 def find_library(name): 51 return name 52 53 54 if os.name == 'posix' and sys.platform == 'darwin': 55 from ctypes.macholib.dyld import dyld_find as _dyld_find 56 57 def find_library(name): 58 possible = ['lib%s.dylib' % name, '%s.dylib' % name, '%s.framework/%s' % (name, name)] 59 for name in possible: 60 try: 61 return _dyld_find(name) 62 except ValueError: 63 continue 64 65 66 elif os.name == 'posix': 67 import re, tempfile, errno 68 69 def _findLib_gcc(name): 70 expr = '[^\\(\\)\\s]*lib%s\\.[^\\(\\)\\s]*' % re.escape(name) 71 fdout, ccout = tempfile.mkstemp() 72 os.close(fdout) 73 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 74 try: 75 f = os.popen(cmd) 76 try: 77 trace = f.read() 78 finally: 79 rv = f.close() 80 81 finally: 82 try: 83 os.unlink(ccout) 84 except OSError as e: 85 if e.errno != errno.ENOENT: 86 raise 87 88 if rv == 10: 89 raise OSError, 'gcc or cc command not found' 90 res = re.search(expr, trace) 91 if not res: 92 return 93 return res.group(0) 94 95 96 if sys.platform == 'sunos5': 97 98 def _get_soname(f): 99 if not f: 100 return 101 cmd = '/usr/ccs/bin/dump -Lpv 2>/dev/null ' + f 102 f = os.popen(cmd) 103 try: 104 data = f.read() 105 finally: 106 f.close() 107 108 res = re.search('\\[.*\\]\\sSONAME\\s+([^\\s]+)', data) 109 if not res: 110 return 111 return res.group(1) 112 113 114 else: 115 116 def _get_soname(f): 117 if not f: 118 return 119 cmd = 'if ! type objdump >/dev/null 2>&1; then exit 10; fi;objdump -p -j .dynamic 2>/dev/null ' + f 120 f = os.popen(cmd) 121 dump = f.read() 122 rv = f.close() 123 if rv == 10: 124 raise OSError, 'objdump command not found' 125 f = os.popen(cmd) 126 try: 127 data = f.read() 128 finally: 129 f.close() 130 131 res = re.search('\\sSONAME\\s+([^\\s]+)', data) 132 if not res: 133 return 134 return res.group(1) 135 136 137 if sys.platform.startswith('freebsd') or sys.platform.startswith('openbsd') or sys.platform.startswith('dragonfly'): 138 139 def _num_version(libname): 140 parts = libname.split('.') 141 nums = [] 142 try: 143 while parts: 144 nums.insert(0, int(parts.pop())) 145 146 except ValueError: 147 pass 148 149 return nums or [sys.maxint] 150 151 152 def find_library(name): 153 ename = re.escape(name) 154 expr = ':-l%s\\.\\S+ => \\S*/(lib%s\\.\\S+)' % (ename, ename) 155 f = os.popen('/sbin/ldconfig -r 2>/dev/null') 156 try: 157 data = f.read() 158 finally: 159 f.close() 160 161 res = re.findall(expr, data) 162 if not res: 163 return _get_soname(_findLib_gcc(name)) 164 res.sort(cmp=lambda x, y: cmp(_num_version(x), _num_version(y))) 165 return res[-1] 166 167 168 else: 169 170 def _findLib_ldconfig(name): 171 expr = '/[^\\(\\)\\s]*lib%s\\.[^\\(\\)\\s]*' % re.escape(name) 172 f = os.popen('LC_ALL=C LANG=C /sbin/ldconfig -p 2>/dev/null') 173 try: 174 data = f.read() 175 finally: 176 f.close() 177 178 res = re.search(expr, data) 179 if not res: 180 cmd = 'ldd %s 2>/dev/null' % sys.executable 181 f = os.popen(cmd) 182 try: 183 data = f.read() 184 finally: 185 f.close() 186 187 res = re.search(expr, data) 188 if not res: 189 return 190 return res.group(0) 191 192 193 def _findSoname_ldconfig(name): 194 import struct 195 if struct.calcsize('l') == 4: 196 machine = os.uname()[4] + '-32' 197 else: 198 machine = os.uname()[4] + '-64' 199 mach_map = {'x86_64-64': 'libc6,x86-64', 200 'ppc64-64': 'libc6,64bit', 201 'sparc64-64': 'libc6,64bit', 202 's390x-64': 'libc6,64bit', 203 'ia64-64': 'libc6,IA-64'} 204 abi_type = mach_map.get(machine, 'libc6') 205 expr = '(\\S+)\\s+\\((%s(?:, OS ABI:[^\\)]*)?)\\)[^/]*(/[^\\(\\)\\s]*lib%s\\.[^\\(\\)\\s]*)' % (abi_type, re.escape(name)) 206 f = os.popen('/sbin/ldconfig -p 2>/dev/null') 207 try: 208 data = f.read() 209 finally: 210 f.close() 211 212 res = re.search(expr, data) 213 if not res: 214 return 215 return res.group(1) 216 217 218 def find_library(name): 219 return _findSoname_ldconfig(name) or _get_soname(_findLib_gcc(name)) 220 221 222 def test(): 223 from ctypes import cdll 224 if os.name == 'nt': 225 print cdll.msvcrt 226 print cdll.load('msvcrt') 227 print find_library('msvcrt') 228 if os.name == 'posix': 229 print find_library('m') 230 print find_library('c') 231 print find_library('bz2') 232 if sys.platform == 'darwin': 233 print cdll.LoadLibrary('libm.dylib') 234 print cdll.LoadLibrary('libcrypto.dylib') 235 print cdll.LoadLibrary('libSystem.dylib') 236 print cdll.LoadLibrary('System.framework/System') 237 else: 238 print cdll.LoadLibrary('libm.so') 239 print cdll.LoadLibrary('libcrypt.so') 240 print find_library('crypt') 241 242 243 if __name__ == '__main__': 244 test()