1import os 2import sys 3import unittest 4 5# Bob Ippolito: 6# 7# Ok.. the code to find the filename for __getattr__ should look 8# something like: 9# 10# import os 11# from macholib.dyld import dyld_find 12# 13# def find_lib(name): 14# possible = ['lib'+name+'.dylib', name+'.dylib', 15# name+'.framework/'+name] 16# for dylib in possible: 17# try: 18# return os.path.realpath(dyld_find(dylib)) 19# except ValueError: 20# pass 21# raise ValueError, "%s not found" % (name,) 22# 23# It'll have output like this: 24# 25# >>> find_lib('pthread') 26# '/usr/lib/libSystem.B.dylib' 27# >>> find_lib('z') 28# '/usr/lib/libz.1.dylib' 29# >>> find_lib('IOKit') 30# '/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit' 31# 32# -bob 33 34from ctypes.macholib.dyld import dyld_find 35 36def find_lib(name): 37 possible = ['lib'+name+'.dylib', name+'.dylib', name+'.framework/'+name] 38 for dylib in possible: 39 try: 40 return os.path.realpath(dyld_find(dylib)) 41 except ValueError: 42 pass 43 raise ValueError("%s not found" % (name,)) 44 45class MachOTest(unittest.TestCase): 46 @unittest.skipUnless(sys.platform == "darwin", 'OSX-specific test') 47 def test_find(self): 48 # On Mac OS 11, system dylibs are only present in the shared cache, 49 # so symlinks like libpthread.dylib -> libSystem.B.dylib will not 50 # be resolved by dyld_find 51 self.assertIn(find_lib('pthread'), 52 ('/usr/lib/libSystem.B.dylib', '/usr/lib/libpthread.dylib')) 53 54 result = find_lib('z') 55 # Issue #21093: dyld default search path includes $HOME/lib and 56 # /usr/local/lib before /usr/lib, which caused test failures if 57 # a local copy of libz exists in one of them. Now ignore the head 58 # of the path. 59 self.assertRegex(result, r".*/lib/libz.*\.dylib") 60 61 self.assertIn(find_lib('IOKit'), 62 ('/System/Library/Frameworks/IOKit.framework/Versions/A/IOKit', 63 '/System/Library/Frameworks/IOKit.framework/IOKit')) 64 65if __name__ == "__main__": 66 unittest.main() 67