mirror of
				https://github.com/python/cpython.git
				synced 2025-10-30 21:21:22 +00:00 
			
		
		
		
	Issue #21042: Return full path in ctypes.util.find_library() on Linux
Patch by Tamás Bence Gedai.
This commit is contained in:
		
							parent
							
								
									aadaa3614e
								
							
						
					
					
						commit
						b9f3114d42
					
				
					 5 changed files with 37 additions and 22 deletions
				
			
		|  | @ -1252,15 +1252,15 @@ The exact functionality is system dependent. | |||
| 
 | ||||
| On Linux, :func:`find_library` tries to run external programs | ||||
| (``/sbin/ldconfig``, ``gcc``, and ``objdump``) to find the library file.  It | ||||
| returns the filename of the library file.  Here are some examples:: | ||||
| returns the absolute path of the library file.  Here are some examples:: | ||||
| 
 | ||||
|    >>> from ctypes.util import find_library | ||||
|    >>> find_library("m") | ||||
|    'libm.so.6' | ||||
|    '/lib/x86_64-linux-gnu/libm.so.6' | ||||
|    >>> find_library("c") | ||||
|    'libc.so.6' | ||||
|    '/lib/x86_64-linux-gnu/libc.so.6' | ||||
|    >>> find_library("bz2") | ||||
|    'libbz2.so.1.0' | ||||
|    '/lib/x86_64-linux-gnu/libbz2.so.1.0' | ||||
|    >>> | ||||
| 
 | ||||
| On OS X, :func:`find_library` tries several predefined naming schemes and paths | ||||
|  | @ -1829,6 +1829,9 @@ Utility functions | |||
| 
 | ||||
|    The exact functionality is system dependent. | ||||
| 
 | ||||
|    .. versionchanged:: 3.6 | ||||
|       On Linux it returns an absolute path. | ||||
| 
 | ||||
| 
 | ||||
| .. function:: find_msvcrt() | ||||
|    :module: ctypes.util | ||||
|  |  | |||
|  | @ -9,39 +9,39 @@ | |||
| class Test_OpenGL_libs(unittest.TestCase): | ||||
|     @classmethod | ||||
|     def setUpClass(cls): | ||||
|         lib_gl = lib_glu = lib_gle = None | ||||
|         cls.lib_gl = cls.lib_glu = cls.lib_gle = None | ||||
|         if sys.platform == "win32": | ||||
|             lib_gl = find_library("OpenGL32") | ||||
|             lib_glu = find_library("Glu32") | ||||
|             cls.lib_gl = find_library("OpenGL32") | ||||
|             cls.lib_glu = find_library("Glu32") | ||||
|         elif sys.platform == "darwin": | ||||
|             lib_gl = lib_glu = find_library("OpenGL") | ||||
|             cls.lib_gl = cls.lib_glu = find_library("OpenGL") | ||||
|         else: | ||||
|             lib_gl = find_library("GL") | ||||
|             lib_glu = find_library("GLU") | ||||
|             lib_gle = find_library("gle") | ||||
|             cls.lib_gl = find_library("GL") | ||||
|             cls.lib_glu = find_library("GLU") | ||||
|             cls.lib_gle = find_library("gle") | ||||
| 
 | ||||
|         ## print, for debugging | ||||
|         if test.support.verbose: | ||||
|             print("OpenGL libraries:") | ||||
|             for item in (("GL", lib_gl), | ||||
|                          ("GLU", lib_glu), | ||||
|                          ("gle", lib_gle)): | ||||
|             for item in (("GL", cls.lib_gl), | ||||
|                          ("GLU", cls.lib_glu), | ||||
|                          ("gle", cls.lib_gle)): | ||||
|                 print("\t", item) | ||||
| 
 | ||||
|         cls.gl = cls.glu = cls.gle = None | ||||
|         if lib_gl: | ||||
|         if cls.lib_gl: | ||||
|             try: | ||||
|                 cls.gl = CDLL(lib_gl, mode=RTLD_GLOBAL) | ||||
|                 cls.gl = CDLL(cls.lib_gl, mode=RTLD_GLOBAL) | ||||
|             except OSError: | ||||
|                 pass | ||||
|         if lib_glu: | ||||
|         if cls.lib_glu: | ||||
|             try: | ||||
|                 cls.glu = CDLL(lib_glu, RTLD_GLOBAL) | ||||
|                 cls.glu = CDLL(cls.lib_glu, RTLD_GLOBAL) | ||||
|             except OSError: | ||||
|                 pass | ||||
|         if lib_gle: | ||||
|         if cls.lib_gle: | ||||
|             try: | ||||
|                 cls.gle = CDLL(lib_gle) | ||||
|                 cls.gle = CDLL(cls.lib_gle) | ||||
|             except OSError: | ||||
|                 pass | ||||
| 
 | ||||
|  | @ -64,6 +64,14 @@ def test_gle(self): | |||
|             self.skipTest('lib_gle not available') | ||||
|         self.gle.gleGetJoinStyle | ||||
| 
 | ||||
|     def test_abspath(self): | ||||
|         if self.lib_gl: | ||||
|             self.assertTrue(os.path.isabs(self.lib_gl)) | ||||
|         if self.lib_glu: | ||||
|             self.assertTrue(os.path.isabs(self.lib_glu)) | ||||
|         if self.lib_gle: | ||||
|             self.assertTrue(os.path.isabs(self.lib_gle)) | ||||
| 
 | ||||
| # On platforms where the default shared library suffix is '.so', | ||||
| # at least some libraries can be loaded as attributes of the cdll | ||||
| # object, since ctypes now tries loading the lib again | ||||
|  |  | |||
|  | @ -221,8 +221,8 @@ def _findSoname_ldconfig(name): | |||
|             abi_type = mach_map.get(machine, 'libc6') | ||||
| 
 | ||||
|             # XXX assuming GLIBC's ldconfig (with option -p) | ||||
|             regex = os.fsencode( | ||||
|                 '\s+(lib%s\.[^\s]+)\s+\(%s' % (re.escape(name), abi_type)) | ||||
|             regex = r'lib%s\.[^\s]+\s\(%s(?:,\s.*)?\)\s=>\s(.*)' | ||||
|             regex = os.fsencode(regex % (re.escape(name), abi_type)) | ||||
|             try: | ||||
|                 with subprocess.Popen(['/sbin/ldconfig', '-p'], | ||||
|                                       stdin=subprocess.DEVNULL, | ||||
|  |  | |||
|  | @ -487,6 +487,7 @@ Matthieu Gautier | |||
| Stephen M. Gava | ||||
| Xavier de Gaye | ||||
| Harry Henry Gebel | ||||
| Tamás Bence Gedai | ||||
| Marius Gedminas | ||||
| Jan-Philip Gehrcke | ||||
| Thomas Gellekum | ||||
|  |  | |||
|  | @ -201,6 +201,9 @@ Core and Builtins | |||
| Library | ||||
| ------- | ||||
| 
 | ||||
| - Issue #21042: Make ctypes.util.find_library() return the full path on | ||||
|   Linux, similar to other platforms.  Patch by Tamás Bence Gedai. | ||||
| 
 | ||||
| - Issue #15068: Got rid of excessive buffering in fileinput. | ||||
|   The bufsize parameter is now deprecated and ignored. | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Martin Panter
						Martin Panter