From 4f6854a690e95ab5159687794652c639a020d6fd Mon Sep 17 00:00:00 2001 From: "Miss Islington (bot)" <31488909+miss-islington@users.noreply.github.com> Date: Mon, 4 Feb 2019 17:54:59 -0800 Subject: [PATCH] bpo-35299: Fixed sysconfig and distutils during PGO profiling (GH-11744) (cherry picked from commit 85e102a2b090dd693d0801ae2edb9660cfa0f281) Co-authored-by: Steve Dower --- Lib/distutils/command/build_ext.py | 5 ++-- Lib/distutils/sysconfig.py | 25 ++++++++++++++----- Lib/distutils/tests/test_build_ext.py | 6 +++-- Lib/sysconfig.py | 13 +++++++--- .../2019-02-02-14-47-12.bpo-35299.1rgEzd.rst | 2 ++ Tools/msi/dev/dev.wixproj | 3 ++- 6 files changed, 40 insertions(+), 14 deletions(-) create mode 100644 Misc/NEWS.d/next/Windows/2019-02-02-14-47-12.bpo-35299.1rgEzd.rst diff --git a/Lib/distutils/command/build_ext.py b/Lib/distutils/command/build_ext.py index 158465d2338c..0428466b00c9 100644 --- a/Lib/distutils/command/build_ext.py +++ b/Lib/distutils/command/build_ext.py @@ -161,9 +161,10 @@ class build_ext(Command): # 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') diff --git a/Lib/distutils/sysconfig.py b/Lib/distutils/sysconfig.py index e07a6c8b94ec..83160f8dcc59 100644 --- a/Lib/distutils/sysconfig.py +++ b/Lib/distutils/sysconfig.py @@ -29,9 +29,7 @@ if "_PYTHON_PROJECT_BASE" in os.environ: 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 @@ -43,16 +41,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. @@ -101,6 +109,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( diff --git a/Lib/distutils/tests/test_build_ext.py b/Lib/distutils/tests/test_build_ext.py index a72218274ca9..88847f9e9aa7 100644 --- a/Lib/distutils/tests/test_build_ext.py +++ b/Lib/distutils/tests/test_build_ext.py @@ -177,10 +177,12 @@ class BuildExtTestCase(TempdirManager, 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 diff --git a/Lib/sysconfig.py b/Lib/sysconfig.py index 9ee4d3185a71..d15cec8dbfc9 100644 --- a/Lib/sysconfig.py +++ b/Lib/sysconfig.py @@ -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) diff --git a/Misc/NEWS.d/next/Windows/2019-02-02-14-47-12.bpo-35299.1rgEzd.rst b/Misc/NEWS.d/next/Windows/2019-02-02-14-47-12.bpo-35299.1rgEzd.rst new file mode 100644 index 000000000000..19fba619b5ab --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2019-02-02-14-47-12.bpo-35299.1rgEzd.rst @@ -0,0 +1,2 @@ +Fix sysconfig detection of the source directory and distutils handling of +pyconfig.h during PGO profiling diff --git a/Tools/msi/dev/dev.wixproj b/Tools/msi/dev/dev.wixproj index bc3a19ce33ca..4a56cec35722 100644 --- a/Tools/msi/dev/dev.wixproj +++ b/Tools/msi/dev/dev.wixproj @@ -21,7 +21,8 @@ - + $(PySourcePath) !(bindpath.src) $(PySourcePath) -- 2.47.3