Skip to content

Commit 1c454eb

Browse files
bpo-41282: Fix broken make install (GH-26329)
A previous commit broke a check in sysconfig when building cpython itself. This caused builds of the standard library modules to search a wrong location (the installed location rather than the source directory) for header files with the net effect that a ``make install`` incorrectly caused all extension modules to be rebuilt again and with incorrect include file paths. When building Python, we need two distinct "include" directories: - source .h files - install target for .h files Note that this doesn't matter except when building Python from source. Historically: - source .h files were in the distutils scheme under 'include' - the install directory was in the distutils.command.install scheme under 'headers' GH-24549 merged these; sysconfig is now the single source of truth and distutils is derived from it. This commit introduces a "secret" scheme path, 'headers', which contains the install target. It is only present when building Python. The distutils code uses it if present, and falls back to 'include'. Co-authored-by: Ned Deily <[email protected]> (cherry picked from commit 563bd5a) Co-authored-by: Petr Viktorin <[email protected]>
1 parent d309bcc commit 1c454eb

File tree

3 files changed

+31
-6
lines changed

3 files changed

+31
-6
lines changed

Lib/distutils/command/install.py

+16-6
Original file line numberDiff line numberDiff line change
@@ -37,12 +37,19 @@
3737

3838
# Copy from sysconfig._INSTALL_SCHEMES
3939
for key in SCHEME_KEYS:
40-
sys_key = key
41-
if key == "headers":
42-
sys_key = "include"
43-
INSTALL_SCHEMES["unix_prefix"][key] = sysconfig._INSTALL_SCHEMES["posix_prefix"][sys_key]
44-
INSTALL_SCHEMES["unix_home"][key] = sysconfig._INSTALL_SCHEMES["posix_home"][sys_key]
45-
INSTALL_SCHEMES["nt"][key] = sysconfig._INSTALL_SCHEMES["nt"][sys_key]
40+
for distutils_scheme_name, sys_scheme_name in (
41+
("unix_prefix", "posix_prefix"), ("unix_home", "posix_home"),
42+
("nt", "nt")):
43+
sys_key = key
44+
sys_scheme = sysconfig._INSTALL_SCHEMES[sys_scheme_name]
45+
if key == "headers" and key not in sys_scheme:
46+
# On POSIX-y platofrms, Python will:
47+
# - Build from .h files in 'headers' (only there when
48+
# building CPython)
49+
# - Install .h files to 'include'
50+
# When 'headers' is missing, fall back to 'include'
51+
sys_key = 'include'
52+
INSTALL_SCHEMES[distutils_scheme_name][key] = sys_scheme[sys_key]
4653

4754
# Transformation to different template format
4855
for main_key in INSTALL_SCHEMES:
@@ -316,6 +323,9 @@ def finalize_options(self):
316323
self.config_vars['userbase'] = self.install_userbase
317324
self.config_vars['usersite'] = self.install_usersite
318325

326+
if sysconfig.is_python_build(True):
327+
self.config_vars['srcdir'] = sysconfig.get_config_var('srcdir')
328+
319329
self.expand_basedirs()
320330

321331
self.dump_dirs("post-expand_basedirs()")

Lib/sysconfig.py

+12
Original file line numberDiff line numberDiff line change
@@ -182,6 +182,18 @@ def is_python_build(check_home=False):
182182

183183
_PYTHON_BUILD = is_python_build(True)
184184

185+
if _PYTHON_BUILD:
186+
for scheme in ('posix_prefix', 'posix_home'):
187+
# On POSIX-y platofrms, Python will:
188+
# - Build from .h files in 'headers' (which is only added to the
189+
# scheme when building CPython)
190+
# - Install .h files to 'include'
191+
scheme = _INSTALL_SCHEMES[scheme]
192+
scheme['headers'] = scheme['include']
193+
scheme['include'] = '{srcdir}/Include'
194+
scheme['platinclude'] = '{projectbase}/.'
195+
196+
185197
def _subst_vars(s, local_vars):
186198
try:
187199
return s.format(**local_vars)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
Fix broken ``make install`` that caused standard library extension modules
2+
to be unnecessarily and incorrectly rebuilt during the install phase of
3+
cpython.

0 commit comments

Comments
 (0)