Commit 8e4909b4 authored by Ned Deily's avatar Ned Deily

Issue #18080: When building a C extension module on OS X, if the compiler

is overriden with the CC environment variable, use the new compiler as
the default for linking if LDSHARED is not also overriden.  This restores
Distutils behavior introduced in 3.2.3 and inadvertently dropped in 3.3.0.
parent 7c5ce992
...@@ -195,9 +195,15 @@ def customize_compiler(compiler): ...@@ -195,9 +195,15 @@ def customize_compiler(compiler):
get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS', get_config_vars('CC', 'CXX', 'OPT', 'CFLAGS',
'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS') 'CCSHARED', 'LDSHARED', 'SHLIB_SUFFIX', 'AR', 'ARFLAGS')
newcc = None
if 'CC' in os.environ: if 'CC' in os.environ:
cc = os.environ['CC'] newcc = os.environ['CC']
if (sys.platform == 'darwin'
and 'LDSHARED' not in os.environ
and ldshared.startswith(cc)):
# On OS X, if CC is overridden, use that as the default
# command for LDSHARED as well
ldshared = newcc + ldshared[len(cc):]
cc = newcc
if 'CXX' in os.environ: if 'CXX' in os.environ:
cxx = os.environ['CXX'] cxx = os.environ['CXX']
if 'LDSHARED' in os.environ: if 'LDSHARED' in os.environ:
......
"""Tests for distutils.unixccompiler.""" """Tests for distutils.unixccompiler."""
import os
import sys import sys
import unittest import unittest
from test.support import run_unittest from test.support import EnvironmentVarGuard, run_unittest
from distutils import sysconfig from distutils import sysconfig
from distutils.unixccompiler import UnixCCompiler from distutils.unixccompiler import UnixCCompiler
...@@ -94,7 +95,6 @@ class UnixCCompilerTestCase(unittest.TestCase): ...@@ -94,7 +95,6 @@ class UnixCCompilerTestCase(unittest.TestCase):
sysconfig.get_config_var = gcv sysconfig.get_config_var = gcv
self.assertEqual(self.cc.rpath_foo(), '-Wl,--enable-new-dtags,-R/foo') self.assertEqual(self.cc.rpath_foo(), '-Wl,--enable-new-dtags,-R/foo')
# non-GCC GNULD # non-GCC GNULD
sys.platform = 'bar' sys.platform = 'bar'
def gcv(v): def gcv(v):
...@@ -115,6 +115,38 @@ class UnixCCompilerTestCase(unittest.TestCase): ...@@ -115,6 +115,38 @@ class UnixCCompilerTestCase(unittest.TestCase):
sysconfig.get_config_var = gcv sysconfig.get_config_var = gcv
self.assertEqual(self.cc.rpath_foo(), '-R/foo') self.assertEqual(self.cc.rpath_foo(), '-R/foo')
@unittest.skipUnless(sys.platform == 'darwin', 'test only relevant for OS X')
def test_osx_cc_overrides_ldshared(self):
# Issue #18080:
# ensure that setting CC env variable also changes default linker
def gcv(v):
if v == 'LDSHARED':
return 'gcc-4.2 -bundle -undefined dynamic_lookup '
return 'gcc-4.2'
sysconfig.get_config_var = gcv
with EnvironmentVarGuard() as env:
env['CC'] = 'my_cc'
del env['LDSHARED']
sysconfig.customize_compiler(self.cc)
self.assertEqual(self.cc.linker_so[0], 'my_cc')
@unittest.skipUnless(sys.platform == 'darwin', 'test only relevant for OS X')
def test_osx_explict_ldshared(self):
# Issue #18080:
# ensure that setting CC env variable does not change
# explicit LDSHARED setting for linker
def gcv(v):
if v == 'LDSHARED':
return 'gcc-4.2 -bundle -undefined dynamic_lookup '
return 'gcc-4.2'
sysconfig.get_config_var = gcv
with EnvironmentVarGuard() as env:
env['CC'] = 'my_cc'
env['LDSHARED'] = 'my_ld -bundle -dynamic'
sysconfig.customize_compiler(self.cc)
self.assertEqual(self.cc.linker_so[0], 'my_ld')
def test_suite(): def test_suite():
return unittest.makeSuite(UnixCCompilerTestCase) return unittest.makeSuite(UnixCCompilerTestCase)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment