summaryrefslogtreecommitdiffstats
path: root/Lib/distutils
diff options
context:
space:
mode:
authorNed Deily <nad@acm.org>2012-02-10 12:01:08 (GMT)
committerNed Deily <nad@acm.org>2012-02-10 12:01:08 (GMT)
commit9937748f0c5590f8d14a68b7aab5eac26e974be8 (patch)
treed4a59be523d6ca829ce1180f69e6defd43801627 /Lib/distutils
parentfa3702dc28fa8aef291785c560832c9af60305a8 (diff)
downloadcpython-9937748f0c5590f8d14a68b7aab5eac26e974be8.zip
cpython-9937748f0c5590f8d14a68b7aab5eac26e974be8.tar.gz
cpython-9937748f0c5590f8d14a68b7aab5eac26e974be8.tar.bz2
Issue #13590: On OS X 10.7 and 10.6 with Xcode 4.2, building
Distutils-based packages with C extension modules may fail because Apple has removed gcc-4.2, the version used to build python.org 64-bit/32-bit Pythons. If the user does not explicitly override the default C compiler by setting the CC environment variable, Distutils will now attempt to compile extension modules with clang if gcc-4.2 is required but not found. Also as a convenience, if the user does explicitly set CC, substitute its value as the default compiler in the Distutils LDSHARED configuration variable for OS X. (Note, the python.org 32-bit-only Pythons use gcc-4.0 and the 10.4u SDK, neither of which are available in Xcode 4. This change does not attempt to override settings to support their use with Xcode 4.)
Diffstat (limited to 'Lib/distutils')
-rw-r--r--Lib/distutils/sysconfig.py33
1 files changed, 32 insertions, 1 deletions
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
index ac06313..16902ca 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
@@ -146,6 +146,7 @@ def get_python_lib(plat_specific=0, standard_lib=0, prefix=None):
"I don't know where Python installs its library "
"on platform '%s'" % os.name)
+_USE_CLANG = None
def customize_compiler(compiler):
"""Do any platform-specific customization of a CCompiler instance.
@@ -158,8 +159,38 @@ def customize_compiler(compiler):
get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
'CCSHARED', 'LDSHARED', 'SO', 'AR', 'ARFLAGS')
+ newcc = None
if 'CC' in os.environ:
- cc = os.environ['CC']
+ newcc = os.environ['CC']
+ elif sys.platform == 'darwin' and cc == 'gcc-4.2':
+ # Issue #13590:
+ # Since Apple removed gcc-4.2 in Xcode 4.2, we can no
+ # longer assume it is available for extension module builds.
+ # If Python was built with gcc-4.2, check first to see if
+ # it is available on this system; if not, try to use clang
+ # instead unless the caller explicitly set CC.
+ global _USE_CLANG
+ if _USE_CLANG is None:
+ from distutils import log
+ from subprocess import Popen, PIPE
+ p = Popen("! type gcc-4.2 && type clang && exit 2",
+ shell=True, stdout=PIPE, stderr=PIPE)
+ p.wait()
+ if p.returncode == 2:
+ _USE_CLANG = True
+ log.warn("gcc-4.2 not found, using clang instead")
+ else:
+ _USE_CLANG = False
+ if _USE_CLANG:
+ newcc = 'clang'
+ if newcc:
+ # On OS X, if CC is overridden, use that as the default
+ # command for LDSHARED as well
+ if (sys.platform == 'darwin'
+ and 'LDSHARED' not in os.environ
+ and ldshared.startswith(cc)):
+ ldshared = newcc + ldshared[len(cc):]
+ cc = newcc
if 'CXX' in os.environ:
cxx = os.environ['CXX']
if 'LDSHARED' in os.environ: