Skip to content

bpo-35299: Fixes sysconfig and distutils during PGO profiling #11744

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Feb 5, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
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
5 changes: 3 additions & 2 deletions Lib/distutils/command/build_ext.py
Original file line number Diff line number Diff line change
Expand Up @@ -161,9 +161,10 @@ def finalize_options(self):

# Put the Python "system" include dir at the end, so that
# 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:
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('link_objects')
Expand Down
25 changes: 19 additions & 6 deletions Lib/distutils/sysconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,7 @@
project_base = os.path.abspath(os.environ["_PYTHON_PROJECT_BASE"])
else:
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
# building an extension with an un-installed Python, so we use
Expand All @@ -41,16 +39,26 @@ def _is_python_source_dir(d):
if os.path.isfile(os.path.join(d, "Modules", fn)):
return True
return False

_sys_home = getattr(sys, '_home', None)
if (_sys_home and os.name == 'nt' and
_sys_home.lower().endswith(('\\pcbuild\\win32', '\\pcbuild\\amd64'))):
_sys_home = os.path.dirname(os.path.dirname(_sys_home))

if os.name == 'nt':
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():
if _sys_home:
return _is_python_source_dir(_sys_home)
return _is_python_source_dir(project_base)

python_build = _python_build()


# 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
# an in-source build.
Expand Down Expand Up @@ -99,6 +107,11 @@ def get_python_inc(plat_specific=0, prefix=None):
python_dir = 'python' + get_python_version() + build_flags
return os.path.join(prefix, "include", python_dir)
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")
else:
raise DistutilsPlatformError(
Expand Down
6 changes: 4 additions & 2 deletions Lib/distutils/tests/test_build_ext.py
Original file line number Diff line number Diff line change
Expand Up @@ -177,10 +177,12 @@ def test_finalize_options(self):
cmd.finalize_options()

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)
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
# if it's a string
Expand Down
13 changes: 10 additions & 3 deletions Lib/sysconfig.py
Original file line number Diff line number Diff line change
Expand Up @@ -125,9 +125,16 @@ def _is_python_source_dir(d):
return False

_sys_home = getattr(sys, '_home', None)
if (_sys_home and os.name == 'nt' and
_sys_home.lower().endswith(('\\pcbuild\\win32', '\\pcbuild\\amd64'))):
_sys_home = os.path.dirname(os.path.dirname(_sys_home))

if os.name == 'nt':
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):
if check_home and _sys_home:
return _is_python_source_dir(_sys_home)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
Fix sysconfig detection of the source directory and distutils handling of
pyconfig.h during PGO profiling
3 changes: 2 additions & 1 deletion Tools/msi/dev/dev.wixproj
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,8 @@
<EmbeddedResource Include="*.wxl" />
</ItemGroup>
<ItemGroup>
<InstallFiles Include="$(PySourcePath)include\**\*.h">
<InstallFiles Include="$(PySourcePath)include\**\*.h"
Exclude="$(PySourcePath)include\pyconfig.h">
<SourceBase>$(PySourcePath)</SourceBase>
<Source>!(bindpath.src)</Source>
<TargetBase>$(PySourcePath)</TargetBase>
Expand Down