Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
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'.
  • Loading branch information
encukou committed May 24, 2021
commit b300aacdfe597e5c13c0de9685f4c2a387d2d99f
19 changes: 13 additions & 6 deletions Lib/distutils/command/install.py
Original file line number Diff line number Diff line change
Expand Up @@ -37,12 +37,19 @@

# Copy from sysconfig._INSTALL_SCHEMES
for key in SCHEME_KEYS:
sys_key = key
if key == "headers":
sys_key = "include"
INSTALL_SCHEMES["unix_prefix"][key] = sysconfig._INSTALL_SCHEMES["posix_prefix"][sys_key]
INSTALL_SCHEMES["unix_home"][key] = sysconfig._INSTALL_SCHEMES["posix_home"][sys_key]
INSTALL_SCHEMES["nt"][key] = sysconfig._INSTALL_SCHEMES["nt"][sys_key]
for distutils_scheme_name, sys_scheme_name in (
("unix_prefix", "posix_prefix"), ("unix_home", "posix_home"),
("nt", "nt")):
sys_key = key
sys_scheme = sysconfig._INSTALL_SCHEMES[sys_scheme_name]
if key == "headers" and key not in sys_scheme:
# On POSIX-y platofrms, Python will:
# - Build from .h files in 'headers' (only there when
# building CPython)
# - Install .h files to 'include'
# When 'headers' is missing, fall back to 'include'
sys_key = 'include'
INSTALL_SCHEMES[distutils_scheme_name][key] = sys_scheme[sys_key]

# Transformation to different template format
for main_key in INSTALL_SCHEMES:
Expand Down
10 changes: 8 additions & 2 deletions Lib/sysconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -184,8 +184,14 @@ def is_python_build(check_home=False):

if _PYTHON_BUILD:
for scheme in ('posix_prefix', 'posix_home'):
_INSTALL_SCHEMES[scheme]['include'] = '{srcdir}/Include'
_INSTALL_SCHEMES[scheme]['platinclude'] = '{projectbase}/.'
# On POSIX-y platofrms, Python will:
# - Build from .h files in 'headers' (which is only added to the
# scheme when building CPython)
# - Install .h files to 'include'
scheme = _INSTALL_SCHEMES[scheme]
scheme['headers'] = scheme['include']
scheme['include'] = '{srcdir}/Include'
scheme['platinclude'] = '{projectbase}/.'


def _subst_vars(s, local_vars):
Expand Down