dyld.py (4035B)
1 #Embedded file name: C:\BuildAgent\work\20d73f1b24eed06e\eve\release\V24.01\carbon\common\stdlib\ctypes\macholib\dyld.py 2 import os 3 from framework import framework_info 4 from dylib import dylib_info 5 from itertools import * 6 __all__ = ['dyld_find', 7 'framework_find', 8 'framework_info', 9 'dylib_info'] 10 DEFAULT_FRAMEWORK_FALLBACK = [os.path.expanduser('~/Library/Frameworks'), 11 '/Library/Frameworks', 12 '/Network/Library/Frameworks', 13 '/System/Library/Frameworks'] 14 DEFAULT_LIBRARY_FALLBACK = [os.path.expanduser('~/lib'), 15 '/usr/local/lib', 16 '/lib', 17 '/usr/lib'] 18 19 def ensure_utf8(s): 20 if isinstance(s, unicode): 21 return s.encode('utf8') 22 return s 23 24 25 def dyld_env(env, var): 26 if env is None: 27 env = os.environ 28 rval = env.get(var) 29 if rval is None: 30 return [] 31 return rval.split(':') 32 33 34 def dyld_image_suffix(env = None): 35 if env is None: 36 env = os.environ 37 return env.get('DYLD_IMAGE_SUFFIX') 38 39 40 def dyld_framework_path(env = None): 41 return dyld_env(env, 'DYLD_FRAMEWORK_PATH') 42 43 44 def dyld_library_path(env = None): 45 return dyld_env(env, 'DYLD_LIBRARY_PATH') 46 47 48 def dyld_fallback_framework_path(env = None): 49 return dyld_env(env, 'DYLD_FALLBACK_FRAMEWORK_PATH') 50 51 52 def dyld_fallback_library_path(env = None): 53 return dyld_env(env, 'DYLD_FALLBACK_LIBRARY_PATH') 54 55 56 def dyld_image_suffix_search(iterator, env = None): 57 suffix = dyld_image_suffix(env) 58 if suffix is None: 59 return iterator 60 61 def _inject(iterator = iterator, suffix = suffix): 62 for path in iterator: 63 if path.endswith('.dylib'): 64 yield path[:-len('.dylib')] + suffix + '.dylib' 65 else: 66 yield path + suffix 67 yield path 68 69 return _inject() 70 71 72 def dyld_override_search(name, env = None): 73 framework = framework_info(name) 74 if framework is not None: 75 for path in dyld_framework_path(env): 76 yield os.path.join(path, framework['name']) 77 78 for path in dyld_library_path(env): 79 yield os.path.join(path, os.path.basename(name)) 80 81 82 def dyld_executable_path_search(name, executable_path = None): 83 if name.startswith('@executable_path/') and executable_path is not None: 84 yield os.path.join(executable_path, name[len('@executable_path/'):]) 85 86 87 def dyld_default_search(name, env = None): 88 yield name 89 framework = framework_info(name) 90 if framework is not None: 91 fallback_framework_path = dyld_fallback_framework_path(env) 92 for path in fallback_framework_path: 93 yield os.path.join(path, framework['name']) 94 95 fallback_library_path = dyld_fallback_library_path(env) 96 for path in fallback_library_path: 97 yield os.path.join(path, os.path.basename(name)) 98 99 if framework is not None and not fallback_framework_path: 100 for path in DEFAULT_FRAMEWORK_FALLBACK: 101 yield os.path.join(path, framework['name']) 102 103 if not fallback_library_path: 104 for path in DEFAULT_LIBRARY_FALLBACK: 105 yield os.path.join(path, os.path.basename(name)) 106 107 108 def dyld_find(name, executable_path = None, env = None): 109 name = ensure_utf8(name) 110 executable_path = ensure_utf8(executable_path) 111 for path in dyld_image_suffix_search(chain(dyld_override_search(name, env), dyld_executable_path_search(name, executable_path), dyld_default_search(name, env)), env): 112 if os.path.isfile(path): 113 return path 114 115 raise ValueError('dylib %s could not be found' % (name,)) 116 117 118 def framework_find(fn, executable_path = None, env = None): 119 try: 120 return dyld_find(fn, executable_path=executable_path, env=env) 121 except ValueError as e: 122 pass 123 124 fmwk_index = fn.rfind('.framework') 125 if fmwk_index == -1: 126 fmwk_index = len(fn) 127 fn += '.framework' 128 fn = os.path.join(fn, os.path.basename(fn[:fmwk_index])) 129 try: 130 return dyld_find(fn, executable_path=executable_path, env=env) 131 except ValueError: 132 raise e 133 134 135 def test_dyld_find(): 136 env = {} 137 138 139 if __name__ == '__main__': 140 test_dyld_find()