diff options
author | Ned Deily <nad@python.org> | 2019-06-03 06:34:48 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-03 06:34:48 -0400 |
commit | 0288dd6a5192074fcd5aa0db5d3513c3880209ca (patch) | |
tree | 609f8fcc34849e056930fde863dad748355589ae /setup.py | |
parent | 8565f6b6db0fa9f65449b532a5056a98bad3dc37 (diff) | |
download | cpython-git-0288dd6a5192074fcd5aa0db5d3513c3880209ca.tar.gz |
bpo-36231: Support building on macOS without /usr/include (GH-13773)
Diffstat (limited to 'setup.py')
-rw-r--r-- | setup.py | 52 |
1 files changed, 45 insertions, 7 deletions
@@ -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): |