bpo-35299: Fixed sysconfig and distutils during PGO profiling (GH-11744)
This commit is contained in:
parent
69091cb497
commit
85e102a2b0
|
@ -161,9 +161,10 @@ class build_ext(Command):
|
||||||
|
|
||||||
# Put the Python "system" include dir at the end, so that
|
# Put the Python "system" include dir at the end, so that
|
||||||
# any local include dirs take precedence.
|
# any local include dirs take precedence.
|
||||||
self.include_dirs.append(py_include)
|
self.include_dirs.extend(py_include.split(os.path.pathsep))
|
||||||
if plat_py_include != py_include:
|
if plat_py_include != py_include:
|
||||||
self.include_dirs.append(plat_py_include)
|
self.include_dirs.extend(
|
||||||
|
plat_py_include.split(os.path.pathsep))
|
||||||
|
|
||||||
self.ensure_string_list('libraries')
|
self.ensure_string_list('libraries')
|
||||||
self.ensure_string_list('link_objects')
|
self.ensure_string_list('link_objects')
|
||||||
|
|
|
@ -29,9 +29,7 @@ if "_PYTHON_PROJECT_BASE" in os.environ:
|
||||||
project_base = os.path.abspath(os.environ["_PYTHON_PROJECT_BASE"])
|
project_base = os.path.abspath(os.environ["_PYTHON_PROJECT_BASE"])
|
||||||
else:
|
else:
|
||||||
project_base = os.path.dirname(os.path.abspath(sys.executable))
|
project_base = os.path.dirname(os.path.abspath(sys.executable))
|
||||||
if (os.name == 'nt' and
|
|
||||||
project_base.lower().endswith(('\\pcbuild\\win32', '\\pcbuild\\amd64'))):
|
|
||||||
project_base = os.path.dirname(os.path.dirname(project_base))
|
|
||||||
|
|
||||||
# python_build: (Boolean) if true, we're either building Python or
|
# python_build: (Boolean) if true, we're either building Python or
|
||||||
# building an extension with an un-installed Python, so we use
|
# building an extension with an un-installed Python, so we use
|
||||||
|
@ -41,16 +39,26 @@ def _is_python_source_dir(d):
|
||||||
if os.path.isfile(os.path.join(d, "Modules", fn)):
|
if os.path.isfile(os.path.join(d, "Modules", fn)):
|
||||||
return True
|
return True
|
||||||
return False
|
return False
|
||||||
|
|
||||||
_sys_home = getattr(sys, '_home', None)
|
_sys_home = getattr(sys, '_home', None)
|
||||||
if (_sys_home and os.name == 'nt' and
|
|
||||||
_sys_home.lower().endswith(('\\pcbuild\\win32', '\\pcbuild\\amd64'))):
|
if os.name == 'nt':
|
||||||
_sys_home = os.path.dirname(os.path.dirname(_sys_home))
|
def _fix_pcbuild(d):
|
||||||
|
if d and os.path.normcase(d).startswith(
|
||||||
|
os.path.normcase(os.path.join(PREFIX, "PCbuild"))):
|
||||||
|
return PREFIX
|
||||||
|
return d
|
||||||
|
project_base = _fix_pcbuild(project_base)
|
||||||
|
_sys_home = _fix_pcbuild(_sys_home)
|
||||||
|
|
||||||
def _python_build():
|
def _python_build():
|
||||||
if _sys_home:
|
if _sys_home:
|
||||||
return _is_python_source_dir(_sys_home)
|
return _is_python_source_dir(_sys_home)
|
||||||
return _is_python_source_dir(project_base)
|
return _is_python_source_dir(project_base)
|
||||||
|
|
||||||
python_build = _python_build()
|
python_build = _python_build()
|
||||||
|
|
||||||
|
|
||||||
# Calculate the build qualifier flags if they are defined. Adding the flags
|
# Calculate the build qualifier flags if they are defined. Adding the flags
|
||||||
# to the include and lib directories only makes sense for an installation, not
|
# to the include and lib directories only makes sense for an installation, not
|
||||||
# an in-source build.
|
# an in-source build.
|
||||||
|
@ -99,6 +107,11 @@ def get_python_inc(plat_specific=0, prefix=None):
|
||||||
python_dir = 'python' + get_python_version() + build_flags
|
python_dir = 'python' + get_python_version() + build_flags
|
||||||
return os.path.join(prefix, "include", python_dir)
|
return os.path.join(prefix, "include", python_dir)
|
||||||
elif os.name == "nt":
|
elif os.name == "nt":
|
||||||
|
if python_build:
|
||||||
|
# Include both the include and PC dir to ensure we can find
|
||||||
|
# pyconfig.h
|
||||||
|
return (os.path.join(prefix, "include") + os.path.pathsep +
|
||||||
|
os.path.join(prefix, "PC"))
|
||||||
return os.path.join(prefix, "include")
|
return os.path.join(prefix, "include")
|
||||||
else:
|
else:
|
||||||
raise DistutilsPlatformError(
|
raise DistutilsPlatformError(
|
||||||
|
|
|
@ -177,10 +177,12 @@ class BuildExtTestCase(TempdirManager,
|
||||||
cmd.finalize_options()
|
cmd.finalize_options()
|
||||||
|
|
||||||
py_include = sysconfig.get_python_inc()
|
py_include = sysconfig.get_python_inc()
|
||||||
self.assertIn(py_include, cmd.include_dirs)
|
for p in py_include.split(os.path.pathsep):
|
||||||
|
self.assertIn(p, cmd.include_dirs)
|
||||||
|
|
||||||
plat_py_include = sysconfig.get_python_inc(plat_specific=1)
|
plat_py_include = sysconfig.get_python_inc(plat_specific=1)
|
||||||
self.assertIn(plat_py_include, cmd.include_dirs)
|
for p in plat_py_include.split(os.path.pathsep):
|
||||||
|
self.assertIn(p, cmd.include_dirs)
|
||||||
|
|
||||||
# make sure cmd.libraries is turned into a list
|
# make sure cmd.libraries is turned into a list
|
||||||
# if it's a string
|
# if it's a string
|
||||||
|
|
|
@ -125,9 +125,16 @@ def _is_python_source_dir(d):
|
||||||
return False
|
return False
|
||||||
|
|
||||||
_sys_home = getattr(sys, '_home', None)
|
_sys_home = getattr(sys, '_home', None)
|
||||||
if (_sys_home and os.name == 'nt' and
|
|
||||||
_sys_home.lower().endswith(('\\pcbuild\\win32', '\\pcbuild\\amd64'))):
|
if os.name == 'nt':
|
||||||
_sys_home = os.path.dirname(os.path.dirname(_sys_home))
|
def _fix_pcbuild(d):
|
||||||
|
if d and os.path.normcase(d).startswith(
|
||||||
|
os.path.normcase(os.path.join(_PREFIX, "PCbuild"))):
|
||||||
|
return _PREFIX
|
||||||
|
return d
|
||||||
|
_PROJECT_BASE = _fix_pcbuild(_PROJECT_BASE)
|
||||||
|
_sys_home = _fix_pcbuild(_sys_home)
|
||||||
|
|
||||||
def is_python_build(check_home=False):
|
def is_python_build(check_home=False):
|
||||||
if check_home and _sys_home:
|
if check_home and _sys_home:
|
||||||
return _is_python_source_dir(_sys_home)
|
return _is_python_source_dir(_sys_home)
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
Fix sysconfig detection of the source directory and distutils handling of
|
||||||
|
pyconfig.h during PGO profiling
|
|
@ -21,7 +21,8 @@
|
||||||
<EmbeddedResource Include="*.wxl" />
|
<EmbeddedResource Include="*.wxl" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<InstallFiles Include="$(PySourcePath)include\**\*.h">
|
<InstallFiles Include="$(PySourcePath)include\**\*.h"
|
||||||
|
Exclude="$(PySourcePath)include\pyconfig.h">
|
||||||
<SourceBase>$(PySourcePath)</SourceBase>
|
<SourceBase>$(PySourcePath)</SourceBase>
|
||||||
<Source>!(bindpath.src)</Source>
|
<Source>!(bindpath.src)</Source>
|
||||||
<TargetBase>$(PySourcePath)</TargetBase>
|
<TargetBase>$(PySourcePath)</TargetBase>
|
||||||
|
|
Loading…
Reference in New Issue