GH-126920: fix Makefile overwriting sysconfig.get_config_vars

This commit is contained in:
Filipe Laíns 🇵🇸 2024-11-17 01:56:01 +00:00 committed by GitHub
parent acbd5c9c6c
commit 9d6366b60d
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 39 additions and 1 deletions

View File

@ -353,7 +353,8 @@ def _init_posix(vars):
else: else:
_temp = __import__(name, globals(), locals(), ['build_time_vars'], 0) _temp = __import__(name, globals(), locals(), ['build_time_vars'], 0)
build_time_vars = _temp.build_time_vars build_time_vars = _temp.build_time_vars
vars.update(build_time_vars) # GH-126920: Make sure we don't overwrite any of the keys already set
vars.update(build_time_vars | vars)
def _init_non_posix(vars): def _init_non_posix(vars):
"""Initialize the module as appropriate for NT""" """Initialize the module as appropriate for NT"""

View File

@ -656,6 +656,38 @@ class TestSysConfig(unittest.TestCase):
self.assertNotEqual(site_paths, no_site_paths) self.assertNotEqual(site_paths, no_site_paths)
@unittest.skipIf(sys.platform == 'wasi', 'venv is unsupported on WASI')
def test_makefile_overwrites_config_vars(self):
script = textwrap.dedent("""
import sys, sysconfig
data = {
'prefix': sys.prefix,
'exec_prefix': sys.exec_prefix,
'base_prefix': sys.base_prefix,
'base_exec_prefix': sys.base_exec_prefix,
'config_vars': sysconfig.get_config_vars(),
}
import json
print(json.dumps(data, indent=2))
""")
# We need to run the test inside a virtual environment so that
# sys.prefix/sys.exec_prefix have a different value from the
# prefix/exec_prefix Makefile variables.
with self.venv() as venv:
data = json.loads(venv.run('-c', script).stdout)
# We expect sysconfig.get_config_vars to correctly reflect sys.prefix/sys.exec_prefix
self.assertEqual(data['prefix'], data['config_vars']['prefix'])
self.assertEqual(data['exec_prefix'], data['config_vars']['exec_prefix'])
# As a sanity check, just make sure sys.prefix/sys.exec_prefix really
# are different from the Makefile values.
# sys.base_prefix/sys.base_exec_prefix should reflect the value of the
# prefix/exec_prefix Makefile variables, so we use them in the comparison.
self.assertNotEqual(data['prefix'], data['base_prefix'])
self.assertNotEqual(data['exec_prefix'], data['base_exec_prefix'])
class MakefileTests(unittest.TestCase): class MakefileTests(unittest.TestCase):

View File

@ -0,0 +1,5 @@
Fix the ``prefix`` and ``exec_prefix`` keys from
:py:func:`sysconfig.get_config_vars` incorrectly having the same value as
:py:const:`sys.base_prefix` and :py:const:`sys.base_exec_prefix`,
respectively, inside virtual environments. They now accurately reflect
:py:const:`sys.prefix` and :py:const:`sys.exec_prefix`.