mirror of
				https://github.com/python/cpython.git
				synced 2025-10-31 13:41:24 +00:00 
			
		
		
		
	bpo-41116: Ensure system supplied libraries are found on macOS 11 (GH-23301) (GH-23455)
On macOS system provided libraries are in a shared library cache
and not at their usual location. This PR teaches distutils to search
in the SDK, even if there was no "-sysroot" argument in
the compiler flags.
(cherry picked from commit 404a719b51)
Co-authored-by: Ronald Oussoren <ronaldoussoren@mac.com>
			
			
This commit is contained in:
		
							parent
							
								
									4f87126969
								
							
						
					
					
						commit
						0aab3522b2
					
				
					 4 changed files with 38 additions and 30 deletions
				
			
		|  | @ -52,7 +52,7 @@ def _find_executable(executable, path=None): | |||
|         return executable | ||||
| 
 | ||||
| 
 | ||||
| def _read_output(commandstring): | ||||
| def _read_output(commandstring, capture_stderr=False): | ||||
|     """Output from successful command execution or None""" | ||||
|     # Similar to os.popen(commandstring, "r").read(), | ||||
|     # but without actually using os.popen because that | ||||
|  | @ -67,6 +67,9 @@ def _read_output(commandstring): | |||
|             os.getpid(),), "w+b") | ||||
| 
 | ||||
|     with contextlib.closing(fp) as fp: | ||||
|         if capture_stderr: | ||||
|             cmd = "%s >'%s' 2>&1" % (commandstring, fp.name) | ||||
|         else: | ||||
|             cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name) | ||||
|         return fp.read().decode('utf-8').strip() if not os.system(cmd) else None | ||||
| 
 | ||||
|  | @ -125,6 +128,33 @@ def _save_modified_value(_config_vars, cv, newvalue): | |||
|         _config_vars[_INITPRE + cv] = oldvalue | ||||
|     _config_vars[cv] = newvalue | ||||
| 
 | ||||
| 
 | ||||
| _cache_default_sysroot = None | ||||
| def _default_sysroot(cc): | ||||
|     """ Returns the root of the default SDK for this system, or '/' """ | ||||
|     global _cache_default_sysroot | ||||
| 
 | ||||
|     if _cache_default_sysroot is not None: | ||||
|         return _cache_default_sysroot | ||||
|     | ||||
|     contents = _read_output('%s -c -E -v - </dev/null' % (cc,), True) | ||||
|     in_incdirs = False    | ||||
|     for line in contents.splitlines(): | ||||
|         if line.startswith("#include <...>"): | ||||
|             in_incdirs = True | ||||
|         elif line.startswith("End of search list"): | ||||
|             in_incdirs = False | ||||
|         elif in_incdirs: | ||||
|             line = line.strip() | ||||
|             if line == '/usr/include': | ||||
|                 _cache_default_sysroot = '/' | ||||
|             elif line.endswith(".sdk/usr/include"): | ||||
|                 _cache_default_sysroot = line[:-12] | ||||
|     if _cache_default_sysroot is None: | ||||
|         _cache_default_sysroot = '/' | ||||
| 
 | ||||
|     return _cache_default_sysroot | ||||
| 
 | ||||
| def _supports_universal_builds(): | ||||
|     """Returns True if universal builds are supported on this system""" | ||||
|     # As an approximation, we assume that if we are running on 10.4 or above, | ||||
|  |  | |||
|  | @ -290,7 +290,7 @@ def find_library_file(self, dirs, lib, debug=0): | |||
|             cflags = sysconfig.get_config_var('CFLAGS') | ||||
|             m = re.search(r'-isysroot\s*(\S+)', cflags) | ||||
|             if m is None: | ||||
|                 sysroot = '/' | ||||
|                 sysroot = _osx_support._default_sysroot(sysconfig.get_config_var('CC')) | ||||
|             else: | ||||
|                 sysroot = m.group(1) | ||||
| 
 | ||||
|  |  | |||
|  | @ -0,0 +1 @@ | |||
| Ensure distutils.unixxcompiler.find_library_file can find system provided libraries on macOS 11. | ||||
							
								
								
									
										31
									
								
								setup.py
									
										
									
									
									
								
							
							
						
						
									
										31
									
								
								setup.py
									
										
									
									
									
								
							|  | @ -9,6 +9,7 @@ | |||
| import sys | ||||
| import sysconfig | ||||
| from glob import glob, escape | ||||
| import _osx_support | ||||
| 
 | ||||
| 
 | ||||
| try: | ||||
|  | @ -176,34 +177,10 @@ def macosx_sdk_root(): | |||
|     m = re.search(r'-isysroot\s*(\S+)', cflags) | ||||
|     if m is not None: | ||||
|         MACOS_SDK_ROOT = m.group(1) | ||||
|         MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' | ||||
|     else: | ||||
|         MACOS_SDK_ROOT = '/' | ||||
|         MACOS_SDK_SPECIFIED = False | ||||
|         cc = sysconfig.get_config_var('CC') | ||||
|         tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid() | ||||
|         try: | ||||
|             os.unlink(tmpfile) | ||||
|         except: | ||||
|             pass | ||||
|         ret = run_command('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile)) | ||||
|         in_incdirs = False | ||||
|         try: | ||||
|             if ret == 0: | ||||
|                 with open(tmpfile) as fp: | ||||
|                     for line in fp.readlines(): | ||||
|                         if line.startswith("#include <...>"): | ||||
|                             in_incdirs = True | ||||
|                         elif line.startswith("End of search list"): | ||||
|                             in_incdirs = False | ||||
|                         elif in_incdirs: | ||||
|                             line = line.strip() | ||||
|                             if line == '/usr/include': | ||||
|                                 MACOS_SDK_ROOT = '/' | ||||
|                             elif line.endswith(".sdk/usr/include"): | ||||
|                                 MACOS_SDK_ROOT = line[:-12] | ||||
|         finally: | ||||
|             os.unlink(tmpfile) | ||||
|         MACOS_SDK_ROOT = _osx_support._default_sysroot( | ||||
|             sysconfig.get_config_var('CC')) | ||||
|     MACOS_SDK_SPECIFIED = MACOS_SDK_ROOT != '/' | ||||
| 
 | ||||
|     return MACOS_SDK_ROOT | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue
	
	 Miss Islington (bot)
						Miss Islington (bot)