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.
This commit is contained in:
parent
102d813b55
commit
020250f91f
|
@ -875,9 +875,9 @@ main (int argc, char **argv) {
|
||||||
def library_filename(self, libname, lib_type='static', # or 'shared'
|
def library_filename(self, libname, lib_type='static', # or 'shared'
|
||||||
strip_dir=0, output_dir=''):
|
strip_dir=0, output_dir=''):
|
||||||
assert output_dir is not None
|
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(
|
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")
|
fmt = getattr(self, lib_type + "_lib_format")
|
||||||
ext = getattr(self, lib_type + "_lib_extension")
|
ext = getattr(self, lib_type + "_lib_extension")
|
||||||
|
|
||||||
|
|
|
@ -76,7 +76,9 @@ class UnixCCompiler(CCompiler):
|
||||||
static_lib_extension = ".a"
|
static_lib_extension = ".a"
|
||||||
shared_lib_extension = ".so"
|
shared_lib_extension = ".so"
|
||||||
dylib_lib_extension = ".dylib"
|
dylib_lib_extension = ".dylib"
|
||||||
|
xcode_stub_lib_extension = ".tbd"
|
||||||
static_lib_format = shared_lib_format = dylib_lib_format = "lib%s%s"
|
static_lib_format = shared_lib_format = dylib_lib_format = "lib%s%s"
|
||||||
|
xcode_stub_lib_format = dylib_lib_format
|
||||||
if sys.platform == "cygwin":
|
if sys.platform == "cygwin":
|
||||||
exe_extension = ".exe"
|
exe_extension = ".exe"
|
||||||
|
|
||||||
|
@ -255,12 +257,28 @@ class UnixCCompiler(CCompiler):
|
||||||
def find_library_file(self, dirs, lib, debug=0):
|
def find_library_file(self, dirs, lib, debug=0):
|
||||||
shared_f = self.library_filename(lib, lib_type='shared')
|
shared_f = self.library_filename(lib, lib_type='shared')
|
||||||
dylib_f = self.library_filename(lib, lib_type='dylib')
|
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')
|
static_f = self.library_filename(lib, lib_type='static')
|
||||||
|
|
||||||
if sys.platform == 'darwin':
|
if sys.platform == 'darwin':
|
||||||
# On OSX users can specify an alternate SDK using
|
# On OSX users can specify an alternate SDK using
|
||||||
# '-isysroot', calculate the SDK root if it is specified
|
# '-isysroot', calculate the SDK root if it is specified
|
||||||
# (and use it further on)
|
# (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')
|
cflags = sysconfig.get_config_var('CFLAGS')
|
||||||
m = re.search(r'-isysroot\s+(\S+)', cflags)
|
m = re.search(r'-isysroot\s+(\S+)', cflags)
|
||||||
if m is None:
|
if m is None:
|
||||||
|
@ -274,6 +292,7 @@ class UnixCCompiler(CCompiler):
|
||||||
shared = os.path.join(dir, shared_f)
|
shared = os.path.join(dir, shared_f)
|
||||||
dylib = os.path.join(dir, dylib_f)
|
dylib = os.path.join(dir, dylib_f)
|
||||||
static = os.path.join(dir, static_f)
|
static = os.path.join(dir, static_f)
|
||||||
|
xcode_stub = os.path.join(dir, xcode_stub_f)
|
||||||
|
|
||||||
if sys.platform == 'darwin' and (
|
if sys.platform == 'darwin' and (
|
||||||
dir.startswith('/System/') or (
|
dir.startswith('/System/') or (
|
||||||
|
@ -282,6 +301,7 @@ class UnixCCompiler(CCompiler):
|
||||||
shared = os.path.join(sysroot, dir[1:], shared_f)
|
shared = os.path.join(sysroot, dir[1:], shared_f)
|
||||||
dylib = os.path.join(sysroot, dir[1:], dylib_f)
|
dylib = os.path.join(sysroot, dir[1:], dylib_f)
|
||||||
static = os.path.join(sysroot, dir[1:], static_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
|
# 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
|
# data to go on: GCC seems to prefer the shared library, so I'm
|
||||||
|
@ -289,6 +309,8 @@ class UnixCCompiler(CCompiler):
|
||||||
# ignoring even GCC's "-static" option. So sue me.
|
# ignoring even GCC's "-static" option. So sue me.
|
||||||
if os.path.exists(dylib):
|
if os.path.exists(dylib):
|
||||||
return dylib
|
return dylib
|
||||||
|
elif os.path.exists(xcode_stub):
|
||||||
|
return xcode_stub
|
||||||
elif os.path.exists(shared):
|
elif os.path.exists(shared):
|
||||||
return shared
|
return shared
|
||||||
elif os.path.exists(static):
|
elif os.path.exists(static):
|
||||||
|
|
|
@ -270,6 +270,8 @@ Build
|
||||||
- Issue #26268: Update OS X 10.5 installer and Windows builds to use
|
- Issue #26268: Update OS X 10.5 installer and Windows builds to use
|
||||||
OpenSSL 1.0.2f.
|
OpenSSL 1.0.2f.
|
||||||
|
|
||||||
|
- Issue #25136: Support Apple Xcode 7's new textual SDK stub libraries.
|
||||||
|
|
||||||
Windows
|
Windows
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
|
16
setup.py
16
setup.py
|
@ -136,6 +136,22 @@ def find_library_file(compiler, libname, std_dirs, paths):
|
||||||
p = p.rstrip(os.sep)
|
p = p.rstrip(os.sep)
|
||||||
|
|
||||||
if host_platform == 'darwin' and is_macosx_sdk_path(p):
|
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:
|
if os.path.join(sysroot, p[1:]) == dirname:
|
||||||
return [ ]
|
return [ ]
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue