bpo-35299: Fixed sysconfig and distutils during PGO profiling (GH-11744)

This commit is contained in:
Steve Dower 2019-02-04 17:15:13 -08:00 committed by GitHub
parent 69091cb497
commit 85e102a2b0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 40 additions and 14 deletions

View File

@ -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')

View File

@ -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(

View File

@ -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

View File

@ -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)

View File

@ -0,0 +1,2 @@
Fix sysconfig detection of the source directory and distutils handling of
pyconfig.h during PGO profiling

View File

@ -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>