(original) (raw)

changeset: 100319:b0490b8af7aa branch: 3.5 parent: 100316:758cb13aaa2c user: Ned Deily nad@python.org date: Thu Feb 25 00:56:38 2016 +1100 files: Lib/distutils/ccompiler.py Lib/distutils/unixccompiler.py Misc/NEWS setup.py description: Issue #25136: Support Apple Xcode 7's new textual SDK stub libraries. As of Xcode 7, SDKs for Apple platforms now include textual-format stub libraries whose file names have a .tbd extension rather than the standard OS X .dylib extension. The Apple compiler tool chain handles these stub libraries transparently and the installed system shared libraries are still .dylibs. However, the new stub libraries cause problems for third-party programs that support building with Apple SDKs and make build-time decisions based on the presence or paths of system-supplied shared libraries in the SDK. In particular, building Python itself with an SDK fails to find system-supplied libraries during setup.py's build of standard library extension modules. The solution is to have find_library_file() in Distutils search for .tbd files, along with the existing types (.a, .so, and .dylib). Patch by Tim Smith. diff -r 758cb13aaa2c -r b0490b8af7aa Lib/distutils/ccompiler.py --- a/Lib/distutils/ccompiler.py Sun Feb 07 05:36:00 2016 +0500 +++ b/Lib/distutils/ccompiler.py Thu Feb 25 00:56:38 2016 +1100 @@ -875,9 +875,9 @@ def library_filename(self, libname, lib_type='static', # or 'shared' strip_dir=0, output_dir=''): assert output_dir is not None - if lib_type not in ("static", "shared", "dylib"): + if lib_type not in ("static", "shared", "dylib", "xcode_stub"): raise ValueError( - "'lib_type' must be \"static\", \"shared\" or \"dylib\"") + "'lib_type' must be \"static\", \"shared\", \"dylib\", or \"xcode_stub\"") fmt = getattr(self, lib_type + "_lib_format") ext = getattr(self, lib_type + "_lib_extension") diff -r 758cb13aaa2c -r b0490b8af7aa Lib/distutils/unixccompiler.py --- a/Lib/distutils/unixccompiler.py Sun Feb 07 05:36:00 2016 +0500 +++ b/Lib/distutils/unixccompiler.py Thu Feb 25 00:56:38 2016 +1100 @@ -76,7 +76,9 @@ static_lib_extension = ".a" shared_lib_extension = ".so" dylib_lib_extension = ".dylib" + xcode_stub_lib_extension = ".tbd" static_lib_format = shared_lib_format = dylib_lib_format = "lib%s%s" + xcode_stub_lib_format = dylib_lib_format if sys.platform == "cygwin": exe_extension = ".exe" @@ -255,12 +257,28 @@ def find_library_file(self, dirs, lib, debug=0): shared_f = self.library_filename(lib, lib_type='shared') dylib_f = self.library_filename(lib, lib_type='dylib') + xcode_stub_f = self.library_filename(lib, lib_type='xcode_stub') static_f = self.library_filename(lib, lib_type='static') if sys.platform == 'darwin': # On OSX users can specify an alternate SDK using # '-isysroot', calculate the SDK root if it is specified # (and use it further on) + # + # Note that, as of Xcode 7, Apple SDKs may contain textual stub + # libraries with .tbd extensions rather than the normal .dylib + # shared libraries installed in /. The Apple compiler tool + # chain handles this transparently but it can cause problems + # for programs that are being built with an SDK and searching + # for specific libraries. Callers of find_library_file need to + # keep in mind that the base filename of the returned SDK library + # file might have a different extension from that of the library + # file installed on the running system, for example: + # /Applications/Xcode.app/Contents/Developer/Platforms/ + # MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/ + # usr/lib/libedit.tbd + # vs + # /usr/lib/libedit.dylib cflags = sysconfig.get_config_var('CFLAGS') m = re.search(r'-isysroot\s+(\S+)', cflags) if m is None: @@ -274,6 +292,7 @@ shared = os.path.join(dir, shared_f) dylib = os.path.join(dir, dylib_f) static = os.path.join(dir, static_f) + xcode_stub = os.path.join(dir, xcode_stub_f) if sys.platform == 'darwin' and ( dir.startswith('/System/') or ( @@ -282,6 +301,7 @@ shared = os.path.join(sysroot, dir[1:], shared_f) dylib = os.path.join(sysroot, dir[1:], dylib_f) static = os.path.join(sysroot, dir[1:], static_f) + xcode_stub = os.path.join(sysroot, dir[1:], xcode_stub_f) # We're second-guessing the linker here, with not much hard # data to go on: GCC seems to prefer the shared library, so I'm @@ -289,6 +309,8 @@ # ignoring even GCC's "-static" option. So sue me. if os.path.exists(dylib): return dylib + elif os.path.exists(xcode_stub): + return xcode_stub elif os.path.exists(shared): return shared elif os.path.exists(static): diff -r 758cb13aaa2c -r b0490b8af7aa Misc/NEWS --- a/Misc/NEWS Sun Feb 07 05:36:00 2016 +0500 +++ b/Misc/NEWS Thu Feb 25 00:56:38 2016 +1100 @@ -270,6 +270,8 @@ - Issue #26268: Update OS X 10.5 installer and Windows builds to use OpenSSL 1.0.2f. +- Issue #25136: Support Apple Xcode 7's new textual SDK stub libraries. + Windows ------- diff -r 758cb13aaa2c -r b0490b8af7aa setup.py --- a/setup.py Sun Feb 07 05:36:00 2016 +0500 +++ b/setup.py Thu Feb 25 00:56:38 2016 +1100 @@ -136,6 +136,22 @@ p = p.rstrip(os.sep) if host_platform == 'darwin' and is_macosx_sdk_path(p): + # Note that, as of Xcode 7, Apple SDKs may contain textual stub + # libraries with .tbd extensions rather than the normal .dylib + # shared libraries installed in /. The Apple compiler tool + # chain handles this transparently but it can cause problems + # for programs that are being built with an SDK and searching + # for specific libraries. Distutils find_library_file() now + # knows to also search for and return .tbd files. But callers + # of find_library_file need to keep in mind that the base filename + # of the returned SDK library file might have a different extension + # from that of the library file installed on the running system, + # for example: + # /Applications/Xcode.app/Contents/Developer/Platforms/ + # MacOSX.platform/Developer/SDKs/MacOSX10.11.sdk/ + # usr/lib/libedit.tbd + # vs + # /usr/lib/libedit.dylib if os.path.join(sysroot, p[1:]) == dirname: return [ ] /nad@python.org