Clone of https://github.com/NixOS/nixpkgs.git (to stress-test knotserver)
at 21.05 161 lines 6.4 kB view raw
1diff --git a/shapely/geos.py b/shapely/geos.py 2index d5a67d2..19b7ffc 100644 3--- a/shapely/geos.py 4+++ b/shapely/geos.py 5@@ -61,127 +61,17 @@ def load_dll(libname, fallbacks=None, mode=DEFAULT_MODE): 6 "Could not find lib {} or load any of its variants {}.".format( 7 libname, fallbacks or [])) 8 9-_lgeos = None 10- 11-if sys.platform.startswith('linux'): 12- # Test to see if we have a wheel repaired by 'auditwheel' containing its 13- # own libgeos_c 14- geos_whl_so = glob.glob(os.path.abspath(os.path.join(os.path.dirname( 15- __file__), '.libs/libgeos_c-*.so.*'))) 16- if len(geos_whl_so) == 1: 17- _lgeos = CDLL(geos_whl_so[0]) 18- LOG.debug("Found GEOS DLL: %r, using it.", _lgeos) 19- elif hasattr(sys, 'frozen'): 20- geos_pyinstaller_so = glob.glob(os.path.join(sys.prefix, 'libgeos_c-*.so.*')) 21- if len(geos_pyinstaller_so) == 1: 22- _lgeos = CDLL(geos_pyinstaller_so[0]) 23- LOG.debug("Found GEOS DLL: %r, using it.", _lgeos) 24- elif os.getenv('CONDA_PREFIX', ''): 25- # conda package. 26- _lgeos = CDLL(os.path.join(sys.prefix, 'lib', 'libgeos_c.so')) 27- else: 28- alt_paths = [ 29- 'libgeos_c.so.1', 30- 'libgeos_c.so', 31- ] 32- _lgeos = load_dll('geos_c', fallbacks=alt_paths) 33- # Necessary for environments with only libc.musl 34- c_alt_paths = [ 35- 'libc.musl-x86_64.so.1' 36- ] 37- free = load_dll('c', fallbacks=c_alt_paths).free 38- free.argtypes = [c_void_p] 39- free.restype = None 40- 41-elif sys.platform == 'darwin': 42- # Test to see if we have a delocated wheel with a GEOS dylib. 43- geos_whl_dylib = os.path.abspath(os.path.join(os.path.dirname( 44- __file__), '.dylibs/libgeos_c.1.dylib')) 45- 46- if os.path.exists(geos_whl_dylib): 47- handle = CDLL(None) 48- if hasattr(handle, "initGEOS_r"): 49- LOG.debug("GEOS already loaded") 50- _lgeos = handle 51- else: 52- _lgeos = CDLL(geos_whl_dylib) 53- LOG.debug("Found GEOS DLL: %r, using it.", _lgeos) 54- 55- elif os.getenv('CONDA_PREFIX', ''): 56- # conda package. 57- _lgeos = CDLL(os.path.join(sys.prefix, 'lib', 'libgeos_c.dylib')) 58- else: 59- if hasattr(sys, 'frozen'): 60- try: 61- # .app file from py2app 62- alt_paths = [os.path.join( 63- os.environ['RESOURCEPATH'], '..', 'Frameworks', 64- 'libgeos_c.dylib')] 65- except KeyError: 66- # binary from pyinstaller 67- alt_paths = [ 68- os.path.join(sys.executable, 'libgeos_c.dylib')] 69- if hasattr(sys, '_MEIPASS'): 70- alt_paths.append( 71- os.path.join(sys._MEIPASS, 'libgeos_c.1.dylib')) 72- else: 73- alt_paths = [ 74- # The Framework build from Kyng Chaos 75- "/Library/Frameworks/GEOS.framework/Versions/Current/GEOS", 76- # macports 77- '/opt/local/lib/libgeos_c.dylib', 78- # homebrew 79- '/usr/local/lib/libgeos_c.dylib', 80- ] 81- _lgeos = load_dll('geos_c', fallbacks=alt_paths) 82- 83- # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen 84- # manpage says, "If filename is NULL, then the returned handle is for the 85- # main program". This way we can let the linker do the work to figure out 86- # which libc Python is actually using. 87- free = CDLL(None).free 88- free.argtypes = [c_void_p] 89- free.restype = None 90- 91-elif sys.platform == 'win32': 92- if os.getenv('CONDA_PREFIX', ''): 93- # conda package. 94- _lgeos = CDLL(os.path.join(sys.prefix, 'Library', 'bin', 'geos_c.dll')) 95- else: 96- try: 97- egg_dlls = os.path.abspath( 98- os.path.join(os.path.dirname(__file__), 'DLLs')) 99- if hasattr(sys, '_MEIPASS'): 100- wininst_dlls = sys._MEIPASS 101- elif hasattr(sys, "frozen"): 102- wininst_dlls = os.path.normpath( 103- os.path.abspath(sys.executable + '../../DLLS')) 104- else: 105- wininst_dlls = os.path.abspath(os.__file__ + "../../../DLLs") 106- original_path = os.environ['PATH'] 107- os.environ['PATH'] = "%s;%s;%s" % \ 108- (egg_dlls, wininst_dlls, original_path) 109- _lgeos = load_dll("geos_c.dll") 110- except (ImportError, WindowsError, OSError): 111- raise 112- 113- def free(m): 114- try: 115- cdll.msvcrt.free(m) 116- except WindowsError: 117- # XXX: See http://trac.gispython.org/projects/PCL/ticket/149 118- pass 119- 120-elif sys.platform == 'sunos5': 121- _lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so']) 122- free = CDLL('libc.so.1').free 123- free.argtypes = [c_void_p] 124- free.restype = None 125-else: # other *nix systems 126- _lgeos = load_dll('geos_c', fallbacks=['libgeos_c.so.1', 'libgeos_c.so']) 127- free = load_dll('c', fallbacks=['libc.so.6']).free 128- free.argtypes = [c_void_p] 129- free.restype = None 130+_lgeos = CDLL('@libgeos_c@') 131+if sys.platform == 'darwin': 132+ # ctypes.CDLL(None) internally calls dlopen(NULL), and as the dlopen 133+ # manpage says, "If filename is NULL, then the returned handle is for the 134+ # main program". This way we can let the linker do the work to figure out 135+ # which libc Python is actually using. 136+ free = CDLL(None).free 137+else: 138+ free = CDLL('@libc@').free 139+free.argtypes = [c_void_p] 140+free.restype = None 141 142 143 def _geos_version(): 144diff --git a/tests/test_dlls.py b/tests/test_dlls.py 145index 35f9cc2..3dfcaac 100644 146--- a/tests/test_dlls.py 147+++ b/tests/test_dlls.py 148@@ -12,12 +12,7 @@ class LoadingTestCase(unittest.TestCase): 149 @unittest.skipIf(sys.platform == "win32", "FIXME: adapt test for win32") 150 def test_fallbacks(self): 151 load_dll('geos_c', fallbacks=[ 152- os.path.join(sys.prefix, "lib", "libgeos_c.dylib"), # anaconda (Mac OS X) 153- '/opt/local/lib/libgeos_c.dylib', # MacPorts 154- '/usr/local/lib/libgeos_c.dylib', # homebrew (Mac OS X) 155- os.path.join(sys.prefix, "lib", "libgeos_c.so"), # anaconda (Linux) 156- 'libgeos_c.so.1', 157- 'libgeos_c.so']) 158+ '@libgeos_c@']) 159 160 161 def test_suite():