summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNed Deily <nad@acm.org>2014-07-06 16:11:44 -0700
committerNed Deily <nad@acm.org>2014-07-06 16:11:44 -0700
commit8cc0102202171d1c9a907d33d99b68f16b0c9bc9 (patch)
tree6d1478d0a8100b631cdfba93c67c72e3dd748ff3
parent349f1c2ef3ccd86025b8962bf4dfd917005345c9 (diff)
downloadcpython-8cc0102202171d1c9a907d33d99b68f16b0c9bc9.tar.gz
Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler
due to possible uninitialized _config_vars. Original patch by Alex Gaynor.
-rw-r--r--Lib/distutils/sysconfig.py3
-rw-r--r--Lib/distutils/tests/test_sysconfig.py21
-rw-r--r--Misc/NEWS3
3 files changed, 26 insertions, 1 deletions
diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py
index 4aa93346d5..de7da1d413 100644
--- a/Lib/distutils/sysconfig.py
+++ b/Lib/distutils/sysconfig.py
@@ -165,7 +165,8 @@ def customize_compiler(compiler):
# version and build tools may not support the same set
# of CPU architectures for universal builds.
global _config_vars
- if not _config_vars.get('CUSTOMIZED_OSX_COMPILER', ''):
+ # Use get_config_var() to ensure _config_vars is initialized.
+ if not get_config_var('CUSTOMIZED_OSX_COMPILER'):
import _osx_support
_osx_support.customize_compiler(_config_vars)
_config_vars['CUSTOMIZED_OSX_COMPILER'] = 'True'
diff --git a/Lib/distutils/tests/test_sysconfig.py b/Lib/distutils/tests/test_sysconfig.py
index ea8d7b5dd6..eb4d27c39e 100644
--- a/Lib/distutils/tests/test_sysconfig.py
+++ b/Lib/distutils/tests/test_sysconfig.py
@@ -3,6 +3,9 @@ import os
import test
import unittest
import shutil
+import subprocess
+import sys
+import textwrap
from distutils import sysconfig
from distutils.tests import support
@@ -99,6 +102,24 @@ class SysconfigTestCase(support.EnvironGuard,
self.assertEqual(global_sysconfig.get_config_var('LDSHARED'), sysconfig.get_config_var('LDSHARED'))
self.assertEqual(global_sysconfig.get_config_var('CC'), sysconfig.get_config_var('CC'))
+ def test_customize_compiler_before_get_config_vars(self):
+ # Issue #21923: test that a Distribution compiler
+ # instance can be called without an explicit call to
+ # get_config_vars().
+ with open(TESTFN, 'w') as f:
+ f.writelines(textwrap.dedent('''\
+ from distutils.core import Distribution
+ config = Distribution().get_command_obj('config')
+ # try_compile may pass or it may fail if no compiler
+ # is found but it should not raise an exception.
+ rc = config.try_compile('int x;')
+ '''))
+ p = subprocess.Popen([str(sys.executable), TESTFN],
+ stdout=subprocess.PIPE,
+ stderr=subprocess.STDOUT,
+ universal_newlines=True)
+ outs, errs = p.communicate()
+ self.assertEqual(0, p.returncode, "Subprocess failed: " + outs)
def test_suite():
diff --git a/Misc/NEWS b/Misc/NEWS
index 4384562db7..97bea23f88 100644
--- a/Misc/NEWS
+++ b/Misc/NEWS
@@ -22,6 +22,9 @@ Library
- Issue #19870: BaseCookie now parses 'secure' and 'httponly' flags.
Backport of issue #16611.
+- Issue #21923: Prevent AttributeError in distutils.sysconfig.customize_compiler
+ due to possible uninitialized _config_vars.
+
What's New in Python 2.7.8?
===========================