diff options
author | Ned Deily <nad@python.org> | 2019-06-18 16:28:13 -0400 |
---|---|---|
committer | GitHub <noreply@github.com> | 2019-06-18 16:28:13 -0400 |
commit | c7302116573d853d3181133477d9d0e4d4d3abfd (patch) | |
tree | f90a2236b51b3aea34cd7aaf7bef48acc14e101e /setup.py | |
parent | 452b417e34489614b3003b8d08148269096239d5 (diff) | |
download | cpython-git-c7302116573d853d3181133477d9d0e4d4d3abfd.tar.gz |
bpo-36231: Support building on macOS without /usr/include (GH-13773) (GH-14208)
Diffstat (limited to 'setup.py')
-rw-r--r-- | setup.py | 53 |
1 files changed, 46 insertions, 7 deletions
@@ -90,18 +90,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): """ |