Skip to content

Commit b300aac

Browse files
committed
Pass location of Python source headers as scheme['headers']
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'.
1 parent 100d335 commit b300aac

File tree

2 files changed

+21
-8
lines changed

2 files changed

+21
-8
lines changed

Lib/distutils/command/install.py

Lines changed: 13 additions & 6 deletions
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:

Lib/sysconfig.py

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,8 +184,14 @@ def is_python_build(check_home=False):
184184

185185
if _PYTHON_BUILD:
186186
for scheme in ('posix_prefix', 'posix_home'):
187-
_INSTALL_SCHEMES[scheme]['include'] = '{srcdir}/Include'
188-
_INSTALL_SCHEMES[scheme]['platinclude'] = '{projectbase}/.'
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}/.'
189195

190196

191197
def _subst_vars(s, local_vars):

0 commit comments

Comments
 (0)