Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
Support building Python on macOS without /usr/include installed. As of macOS
10.14, system header files are only available within an SDK provided by
either the Command Line Tools or the Xcode app.
52 changes: 45 additions & 7 deletions setup.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,19 +125,57 @@ def sysroot_paths(make_vars, subdirs):
break
return dirs

MACOS_SDK_ROOT = None

def macosx_sdk_root():
"""Return the directory of the current macOS SDK.

If no SDK was explicitly configured, call the compiler to find which
include files paths are being searched by default. Use '/' if the
compiler is searching /usr/include (meaning system header files are
installed) or use the root of an SDK if that is being searched.
(The SDK may be supplied via Xcode or via the Command Line Tools).
The SDK paths used by Apple-supplied tool chains depend on the
setting of various variables; see the xcrun man page for more info.
"""
Return the directory of the current OSX SDK,
or '/' if no SDK was specified.
"""
global MACOS_SDK_ROOT

# If already called, return cached result.
if MACOS_SDK_ROOT:
return MACOS_SDK_ROOT

cflags = sysconfig.get_config_var('CFLAGS')
m = re.search(r'-isysroot\s+(\S+)', cflags)
if m is None:
sysroot = '/'
if m is not None:
MACOS_SDK_ROOT = m.group(1)
else:
sysroot = m.group(1)
return sysroot
MACOS_SDK_ROOT = '/'
cc = sysconfig.get_config_var('CC')
tmpfile = '/tmp/setup_sdk_root.%d' % os.getpid()
try:
os.unlink(tmpfile)
except:
pass
ret = os.system('%s -E -v - </dev/null 2>%s 1>/dev/null' % (cc, tmpfile))
in_incdirs = False
try:
if ret >> 8 == 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)

return MACOS_SDK_ROOT


def is_macosx_sdk_path(path):
Expand Down