Skip to content

Commit

Permalink
bpo-41116: Ensure system supplied libraries are found on macOS 11 (GH…
Browse files Browse the repository at this point in the history
…-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 404a719)

Co-authored-by: Ronald Oussoren <ronaldoussoren@mac.com>
  • Loading branch information
miss-islington and ronaldoussoren committed Nov 22, 2020
1 parent 4f87126 commit 0aab352
Show file tree
Hide file tree
Showing 4 changed files with 38 additions and 30 deletions.
34 changes: 32 additions & 2 deletions Lib/_osx_support.py
Expand Up @@ -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
Expand All @@ -67,7 +67,10 @@ def _read_output(commandstring):
os.getpid(),), "w+b")

with contextlib.closing(fp) as fp:
cmd = "%s 2>/dev/null >'%s'" % (commandstring, fp.name)
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


Expand Down Expand Up @@ -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,
Expand Down
2 changes: 1 addition & 1 deletion Lib/distutils/unixccompiler.py
Expand Up @@ -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)

Expand Down
@@ -0,0 +1 @@
Ensure distutils.unixxcompiler.find_library_file can find system provided libraries on macOS 11.
31 changes: 4 additions & 27 deletions setup.py
Expand Up @@ -9,6 +9,7 @@
import sys
import sysconfig
from glob import glob, escape
import _osx_support


try:
Expand Down Expand Up @@ -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

Expand Down

0 comments on commit 0aab352

Please sign in to comment.