NovaBryan/EVE_Dump
Log | Files | 📦 下载最新源码 (.zip) | Refs | README

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()