]> git.ipfire.org Git - thirdparty/Python/cpython.git/commitdiff
bpo-35299: Fixed sysconfig and distutils during PGO profiling (GH-11744)
authorSteve Dower <steve.dower@microsoft.com>
Tue, 5 Feb 2019 01:15:13 +0000 (17:15 -0800)
committerGitHub <noreply@github.com>
Tue, 5 Feb 2019 01:15:13 +0000 (17:15 -0800)
Lib/distutils/command/build_ext.py
Lib/distutils/sysconfig.py
Lib/distutils/tests/test_build_ext.py
Lib/sysconfig.py
Misc/NEWS.d/next/Windows/2019-02-02-14-47-12.bpo-35299.1rgEzd.rst [new file with mode: 0644]
Tools/msi/dev/dev.wixproj

index 158465d2338c201a4778b8030b5477b9ccba7d08..0428466b00c902f8a0f2e5d655f1cb0352b932b4 100644 (file)
@@ -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')
index b433fc86ffccd788975db4d4eb0800861bad8a2b..40af493cdfb5f27e06175e4c2e57bc3e25c36e9f 100644 (file)
@@ -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
@@ -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.
@@ -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(
index a72218274ca90eb9baccc67a78427ad7347adf8e..88847f9e9aa7b1a83cbaef1686930cb8deb9c156 100644 (file)
@@ -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
index e0f9c18531b674483faacc58078f597daf8bb08a..cc8c7962b1bca2edfd83db2064c16e9883566c40 100644 (file)
@@ -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 (file)
index 0000000..19fba61
--- /dev/null
@@ -0,0 +1,2 @@
+Fix sysconfig detection of the source directory and distutils handling of
+pyconfig.h during PGO profiling
index bc3a19ce33ca38c875ac2ef4228fd985ab060323..4a56cec35722cf016b51da13d59a5c1cad43dd3e 100644 (file)
@@ -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>