diff options
author | Steve Dower <steve.dower@microsoft.com> | 2017-09-06 22:55:25 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2017-09-06 22:55:25 (GMT) |
commit | fd645ec6f5696e841e6d49075f9fd81e54e74d91 (patch) | |
tree | 49f212a31351124313c9c06d13c553e8ec6ffbf8 | |
parent | 34c67614c170a79bbe168ed2f3df5556c34f162b (diff) | |
download | cpython-fd645ec6f5696e841e6d49075f9fd81e54e74d91.zip cpython-fd645ec6f5696e841e6d49075f9fd81e54e74d91.tar.gz cpython-fd645ec6f5696e841e6d49075f9fd81e54e74d91.tar.bz2 |
[3.6] bpo-31340: Change to building with MSVC v141 (included with Visual Studio 2017) (GH-3311) (#3386)
-rw-r--r-- | .github/appveyor.yml | 3 | ||||
-rw-r--r-- | Doc/make.bat | 38 | ||||
-rw-r--r-- | Lib/distutils/command/bdist_wininst.py | 22 | ||||
-rw-r--r-- | Misc/NEWS.d/next/Windows/2017-09-04-13-19-05.bpo-31340.MbkzLi.rst | 1 | ||||
-rw-r--r-- | PCbuild/build.bat | 2 | ||||
-rw-r--r-- | PCbuild/find_msbuild.bat | 15 | ||||
-rw-r--r-- | PCbuild/pyproject.props | 21 | ||||
-rw-r--r-- | PCbuild/python.props | 21 | ||||
-rw-r--r-- | PCbuild/python.vcxproj | 1 | ||||
-rw-r--r-- | PCbuild/pythoncore.vcxproj | 3 | ||||
-rw-r--r-- | Tools/msi/exe/exe.wixproj | 24 | ||||
-rw-r--r-- | Tools/msi/exe/exe_files.wxs | 2 |
12 files changed, 122 insertions, 31 deletions
diff --git a/.github/appveyor.yml b/.github/appveyor.yml index 0936469..96674ce 100644 --- a/.github/appveyor.yml +++ b/.github/appveyor.yml @@ -14,6 +14,9 @@ test_script: - cmd: PCbuild\rt.bat -q -uall -u-cpu -rwW --slowest --timeout=1200 -j0 environment: HOST_PYTHON: C:\Python36\python.exe +image: +- Visual Studio 2015 +- Visual Studio 2017 # Only trigger AppVeyor if actual code or its configuration changes only_commits: diff --git a/Doc/make.bat b/Doc/make.bat index b9e8a75..0472a3d 100644 --- a/Doc/make.bat +++ b/Doc/make.bat @@ -6,18 +6,29 @@ pushd %~dp0 set this=%~n0 call ..\PCBuild\find_python.bat %PYTHON% -if "%SPHINXBUILD%" EQU "" if "%PYTHON%" NEQ "" ( - set SPHINXBUILD=%PYTHON%\..\Scripts\sphinx-build.exe - rem Cannot use %SPHINXBUILD% in the same block where we set it - if not exist "%PYTHON%\..\Scripts\sphinx-build.exe" ( +if not defined SPHINXBUILD if defined PYTHON ( + %PYTHON% -c "import sphinx" > nul 2> nul + if errorlevel 1 ( echo Installing sphinx with %PYTHON% - "%PYTHON%" -m pip install sphinx + %PYTHON% -m pip install sphinx if errorlevel 1 exit /B ) + set SPHINXBUILD=%PYTHON% -c "import sphinx, sys; sys.argv[0] = 'sphinx-build'; sphinx.main()" ) -if "%PYTHON%" EQU "" set PYTHON=py -if "%SPHINXBUILD%" EQU "" set SPHINXBUILD=sphinx-build +if not defined BLURB if defined PYTHON ( + %PYTHON% -c "import blurb" > nul 2> nul + if errorlevel 1 ( + echo Installing blurb with %PYTHON% + %PYTHON% -m pip install blurb + if errorlevel 1 exit /B + ) + set BLURB=%PYTHON% -m blurb +) + +if not defined PYTHON set PYTHON=py +if not defined SPHINXBUILD set SPHINXBUILD=sphinx-build +if not defined BLURB set BLURB=blurb if "%1" NEQ "htmlhelp" goto :skiphhcsearch if exist "%HTMLHELP%" goto :skiphhcsearch @@ -96,6 +107,19 @@ echo.be passed by setting the SPHINXOPTS environment variable. goto end :build +if exist ..\Misc\NEWS ( + echo.Copying Misc\NEWS to build\NEWS + copy ..\Misc\NEWS build\NEWS > nul +) else if exist ..\Misc\NEWS.D ( + if defined BLURB ( + echo.Merging Misc/NEWS with %BLURB% + %BLURB% merge -f build\NEWS + ) else ( + echo.No Misc/NEWS file and Blurb is not available. + exit /B 1 + ) +) + if NOT "%PAPER%" == "" ( set SPHINXOPTS=-D latex_elements.papersize=%PAPER% %SPHINXOPTS% ) diff --git a/Lib/distutils/command/bdist_wininst.py b/Lib/distutils/command/bdist_wininst.py index d3e1d3a..6309c3e 100644 --- a/Lib/distutils/command/bdist_wininst.py +++ b/Lib/distutils/command/bdist_wininst.py @@ -318,26 +318,30 @@ class bdist_wininst(Command): # string compares seem wrong, but are what sysconfig.py itself uses if self.target_version and self.target_version < cur_version: if self.target_version < "2.4": - bv = 6.0 + bv = '6.0' elif self.target_version == "2.4": - bv = 7.1 + bv = '7.1' elif self.target_version == "2.5": - bv = 8.0 + bv = '8.0' elif self.target_version <= "3.2": - bv = 9.0 + bv = '9.0' elif self.target_version <= "3.4": - bv = 10.0 + bv = '10.0' else: - bv = 14.0 + bv = '14.0' else: # for current version - use authoritative check. try: from msvcrt import CRT_ASSEMBLY_VERSION except ImportError: # cross-building, so assume the latest version - bv = 14.0 + bv = '14.0' else: - bv = float('.'.join(CRT_ASSEMBLY_VERSION.split('.', 2)[:2])) + bv = '.'.join(CRT_ASSEMBLY_VERSION.split('.', 2)[:2]) + if bv == '14.11': + # v141 and v140 are binary compatible, + # so keep using the 14.0 stub. + bv = '14.0' # wininst-x.y.exe is in the same directory as this file @@ -353,7 +357,7 @@ class bdist_wininst(Command): else: sfix = '' - filename = os.path.join(directory, "wininst-%.1f%s.exe" % (bv, sfix)) + filename = os.path.join(directory, "wininst-%s%s.exe" % (bv, sfix)) f = open(filename, "rb") try: return f.read() diff --git a/Misc/NEWS.d/next/Windows/2017-09-04-13-19-05.bpo-31340.MbkzLi.rst b/Misc/NEWS.d/next/Windows/2017-09-04-13-19-05.bpo-31340.MbkzLi.rst new file mode 100644 index 0000000..065596f --- /dev/null +++ b/Misc/NEWS.d/next/Windows/2017-09-04-13-19-05.bpo-31340.MbkzLi.rst @@ -0,0 +1 @@ +Change to building with MSVC v141 (included with Visual Studio 2017) diff --git a/PCbuild/build.bat b/PCbuild/build.bat index 81e500d..2e6b0a9 100644 --- a/PCbuild/build.bat +++ b/PCbuild/build.bat @@ -104,7 +104,7 @@ if "%kill%"=="true" call :Kill if "%do_pgo%"=="true" ( set conf=PGInstrument - call :Build + call :Build %1 %2 %3 %4 %5 %6 %7 %8 %9 del /s "%dir%\*.pgc" del /s "%dir%\..\Lib\*.pyc" echo on diff --git a/PCbuild/find_msbuild.bat b/PCbuild/find_msbuild.bat index 1877906..2b7413f 100644 --- a/PCbuild/find_msbuild.bat +++ b/PCbuild/find_msbuild.bat @@ -29,20 +29,21 @@ @where msbuild > "%TEMP%\msbuild.loc" 2> nul && set /P MSBUILD= < "%TEMP%\msbuild.loc" & del "%TEMP%\msbuild.loc" @if exist "%MSBUILD%" set MSBUILD="%MSBUILD%" & (set _Py_MSBuild_Source=PATH) & goto :found -@rem VS 2017 sets exactly one install as the "main" install, so we may find MSBuild in there. -@reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v 15.0 /reg:32 >nul 2>nul -@if NOT ERRORLEVEL 1 @for /F "tokens=1,2*" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v 15.0 /reg:32') DO @( - @if "%%i"=="15.0" @if exist "%%k\MSBuild\15.0\Bin\msbuild.exe" @(set MSBUILD="%%k\MSBuild\15.0\Bin\msbuild.exe") -) -@if exist %MSBUILD% (set _Py_MSBuild_Source=Visual Studio 2017 registry) & goto :found - @rem VS 2015 and earlier register MSBuild separately, so we can find it. +@rem Prefer MSBuild 14.0 over MSBuild 15.0, since the latter may not be able to find a VC14 install. @reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0" /v MSBuildToolsPath /reg:32 >nul 2>nul @if NOT ERRORLEVEL 1 @for /F "tokens=1,2*" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\MSBuild\ToolsVersions\14.0" /v MSBuildToolsPath /reg:32') DO @( @if "%%i"=="MSBuildToolsPath" @if exist "%%k\msbuild.exe" @(set MSBUILD="%%k\msbuild.exe") ) @if exist %MSBUILD% (set _Py_MSBuild_Source=registry) & goto :found +@rem VS 2017 sets exactly one install as the "main" install, so we may find MSBuild in there. +@reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v 15.0 /reg:32 >nul 2>nul +@if NOT ERRORLEVEL 1 @for /F "tokens=1,2*" %%i in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\SxS\VS7" /v 15.0 /reg:32') DO @( + @if "%%i"=="15.0" @if exist "%%k\MSBuild\15.0\Bin\msbuild.exe" @(set MSBUILD="%%k\MSBuild\15.0\Bin\msbuild.exe") +) +@if exist %MSBUILD% (set _Py_MSBuild_Source=Visual Studio 2017 registry) & goto :found + @exit /b 1 diff --git a/PCbuild/pyproject.props b/PCbuild/pyproject.props index 7012170..3d46a0f 100644 --- a/PCbuild/pyproject.props +++ b/PCbuild/pyproject.props @@ -147,13 +147,28 @@ foreach (System.Diagnostics.Process p in System.Diagnostics.Process.GetProcesses Targets="CleanAll" /> </Target> + <Target Name="CopyPGCFiles" BeforeTargets="PrepareForBuild" Condition="$(Configuration) == 'PGUpdate'"> + <ItemGroup> + <_PGCFiles Include="$(OutDir)instrumented\$(TargetName)!*.pgc" /> + <_PGDFile Include="$(OutDir)instrumented\$(TargetName).pgd" /> + <_CopyFiles Include="@(_PGCFiles);@(_PGDFile)" Condition="Exists(%(FullPath))" /> + </ItemGroup> + <Delete Files="@(_CopyFiles->'$(OutDir)%(Filename)%(Extension)')" /> + <Error Text="PGO run did not succeed (no $(TargetName)!*.pgc files) and there is no data to merge" + Condition="$(RequirePGCFiles) == 'true' and @(_PGCFiles) == ''" /> + <Copy SourceFiles="@(_CopyFiles)" + DestinationFolder="$(OutDir)" + UseHardLinksIfPossible="true" + OverwriteReadOnlyFiles="true" /> + </Target> + <PropertyGroup> - <SdkBinPath Condition="'$(SdkBinPath)' == '' or !Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10)\bin\x86</SdkBinPath> + <SdkBinPath Condition="'$(SdkBinPath)' == '' or !Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10)\bin\$(DefaultWindowsSDKVersion)\x86</SdkBinPath> + <SdkBinPath Condition="!Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10)\bin\x86</SdkBinPath> <SdkBinPath Condition="!Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot81)\bin\x86</SdkBinPath> <SdkBinPath Condition="!Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot)\bin\x86</SdkBinPath> <SdkBinPath Condition="!Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A@InstallationFolder)\Bin\</SdkBinPath> - <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /q /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)"</_SignCommand> - <_MakeCatCommand Condition="Exists($(SdkBinPath))">"$(SdkBinPath)\makecat.exe"</_MakeCatCommand> + <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /q /a /n "$(SigningCertificate)" /fd sha256 /t http://timestamp.verisign.com/scripts/timestamp.dll /d "Python $(PythonVersion)"</_SignCommand> <_MakeCatCommand Condition="Exists($(SdkBinPath))">"$(SdkBinPath)\makecat.exe"</_MakeCatCommand> </PropertyGroup> <Target Name="_SignBuild" AfterTargets="AfterBuild" Condition="'$(SigningCertificate)' != '' and $(SupportSigning)"> diff --git a/PCbuild/python.props b/PCbuild/python.props index d6bfd08..c26f642 100644 --- a/PCbuild/python.props +++ b/PCbuild/python.props @@ -10,6 +10,7 @@ We set BasePlatformToolset for ICC's benefit, it's otherwise ignored. --> + <BasePlatformToolset Condition="'$(BasePlatformToolset)' == '' and ('$(MSBuildToolsVersion)' == '15.0' or '$(VisualStudioVersion)' == '15.0')">v141</BasePlatformToolset> <BasePlatformToolset Condition="'$(BasePlatformToolset)' == '' and '$(VCTargetsPath14)' != ''">v140</BasePlatformToolset> <BasePlatformToolset Condition="'$(BasePlatformToolset)' == '' and '$(VCTargetsPath12)' != ''">v120</BasePlatformToolset> <BasePlatformToolset Condition="'$(BasePlatformToolset)' == '' and '$(VCTargetsPath11)' != ''">v110</BasePlatformToolset> @@ -39,6 +40,7 @@ <BuildPath Condition="'$(ArchName)' == 'amd64'">$(BuildPath64)</BuildPath> <BuildPath Condition="'$(BuildPath)' == ''">$(PySourcePath)PCBuild\$(ArchName)\</BuildPath> <BuildPath Condition="!HasTrailingSlash($(BuildPath))">$(BuildPath)\</BuildPath> + <BuildPath Condition="$(Configuration) == 'PGInstrument'">$(BuildPath)instrumented\</BuildPath> <!-- Directories of external projects. tcltk is handled in tcltk.props --> <ExternalsDir>$([System.IO.Path]::GetFullPath(`$(PySourcePath)externals\`))</ExternalsDir> @@ -62,7 +64,24 @@ <!-- Full path of the resulting python.exe binary --> <PythonExe Condition="'$(PythonExe)' == ''">$(BuildPath)python$(PyDebugExt).exe</PythonExe> </PropertyGroup> - + + <PropertyGroup Condition="$(DefaultWindowsSDKVersion) == ''"> + <!-- + Attempt to select the latest installed WinSDK. If we don't find any, then we will + let the MSBuild targets determine which one it wants to use (typically the earliest + possible version). Since we limit WINVER to Windows 7 anyway, it doesn't really + matter which WinSDK version we use. + --> + <DefaultWindowsSDKVersion Condition="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) == '10.0.15063'">10.0.15063.0</DefaultWindowsSDKVersion> + <DefaultWindowsSDKVersion Condition="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) == '10.0.15063'">10.0.15063.0</DefaultWindowsSDKVersion> + <DefaultWindowsSDKVersion Condition="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) == '10.0.14393'">10.0.14393.0</DefaultWindowsSDKVersion> + <DefaultWindowsSDKVersion Condition="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) == '10.0.14393'">10.0.14393.0</DefaultWindowsSDKVersion> + <DefaultWindowsSDKVersion Condition="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) == '10.0.10586'">10.0.10586.0</DefaultWindowsSDKVersion> + <DefaultWindowsSDKVersion Condition="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) == '10.0.10586'">10.0.10586.0</DefaultWindowsSDKVersion> + <DefaultWindowsSDKVersion Condition="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) == '10.0.10240'">10.0.10240.0</DefaultWindowsSDKVersion> + <DefaultWindowsSDKVersion Condition="$(Registry:HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Microsoft SDKs\Windows\v10.0@ProductVersion) == '10.0.10240'">10.0.10240.0</DefaultWindowsSDKVersion> + </PropertyGroup> + <PropertyGroup Condition="'$(OverrideVersion)' == ''"> <!-- Read version information from Include\patchlevel.h. The following properties are set: diff --git a/PCbuild/python.vcxproj b/PCbuild/python.vcxproj index 2786ac2..ab9fb05 100644 --- a/PCbuild/python.vcxproj +++ b/PCbuild/python.vcxproj @@ -96,6 +96,7 @@ set PYTHONPATH=$(PySourcePath)Lib <PropertyGroup> <_PGOPath Condition="$(Configuration) == 'PGInstrument' and $(Platform) == 'Win32'">@set PATH=%PATH%%3B$(VCInstallDir)bin</_PGOPath> <_PGOPath Condition="$(Configuration) == 'PGInstrument' and $(Platform) == 'x64'">@set PATH=%PATH%%3B$(VCInstallDir)bin\amd64</_PGOPath> + <_PGOPath Condition="$(Configuration) == 'PGInstrument' and $(VC_PGO_RunTime_Dir) != ''">@set PATH=%PATH%%3B$(VC_PGO_RunTime_Dir)</_PGOPath> <_Content>@rem This script invokes the most recently built Python with all arguments @rem passed through to the interpreter. This file is generated by the @rem build process and any changes *will* be thrown away by the next diff --git a/PCbuild/pythoncore.vcxproj b/PCbuild/pythoncore.vcxproj index 6ea1848..6fd0440 100644 --- a/PCbuild/pythoncore.vcxproj +++ b/PCbuild/pythoncore.vcxproj @@ -49,6 +49,7 @@ </ImportGroup> <PropertyGroup> <KillPython>true</KillPython> + <RequirePGCFiles>true</RequirePGCFiles> </PropertyGroup> <ImportGroup Label="PropertySheets"> <Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" /> @@ -428,7 +429,7 @@ </ClCompile> </ItemGroup> </Target> - <Target Name="_WarnAboutToolset" BeforeTargets="PrepareForBuild" Condition="$(PlatformToolset) != 'v140'"> + <Target Name="_WarnAboutToolset" BeforeTargets="PrepareForBuild" Condition="$(PlatformToolset) != 'v140' and $(PlatformToolset) != 'v141'"> <Warning Text="Toolset $(PlatformToolset) is not used for official builds. Your build may have errors or incompatibilities." /> </Target> </Project> diff --git a/Tools/msi/exe/exe.wixproj b/Tools/msi/exe/exe.wixproj index 24df0f5..16ef6ac 100644 --- a/Tools/msi/exe/exe.wixproj +++ b/Tools/msi/exe/exe.wixproj @@ -39,6 +39,28 @@ Overwrite="true" Lines="@(_LicenseFiles->'%(Content)')" /> </Target> - + + <Target Name="_CopyMiscNews" AfterTargets="PrepareForBuild" Condition="Exists('$(PySourcePath)Misc\NEWS')"> + <Copy SourceFiles="$(PySourcePath)Misc\NEWS" DestinationFiles="$(BuildPath)NEWS.txt" /> + </Target> + + <Target Name="_MergeMiscNewsWithBlurb" AfterTargets="PrepareForBuild" Condition="$(Blurb) != '' and !Exists('$(PySourcePath)Misc\NEWS')"> + <Exec Command="$(Blurb) merge -f "$(BuildPath)NEWS.txt"" WorkingDirectory="$(PCBuild)" /> + </Target> + + <Target Name="_MergeMiscNewsWithPython" AfterTargets="PrepareForBuild" Condition="$(Blurb) == '' and !Exists('$(PySourcePath)Misc\NEWS')"> + <ItemGroup> + <HostPython Include="$(ExternalsDir)python*\tools\python.exe" /> + <HostPython Include="@(HostPython)" Condition="Exists(%(FullPath))" /> + <HostPython Include="py" Condition="@(HostPython) == ''" /> + </ItemGroup> + <PropertyGroup> + <HostPython>@(HostPython)</HostPython> + <HostPython Condition="$(HostPython.Contains(';'))">$(HostPython.Remove($(HostPython.IndexOf(';'))))</HostPython> + </PropertyGroup> + <Exec Command=""$(HostPython)" -m pip install -U blurb" WorkingDirectory="$(PCBuild)" /> + <Exec Command=""$(HostPython)" -m blurb merge -f "$(BuildPath)NEWS.txt"" WorkingDirectory="$(PCBuild)" /> + </Target> + <Import Project="..\msi.targets" /> </Project>
\ No newline at end of file diff --git a/Tools/msi/exe/exe_files.wxs b/Tools/msi/exe/exe_files.wxs index e675c21..394b4de 100644 --- a/Tools/msi/exe/exe_files.wxs +++ b/Tools/msi/exe/exe_files.wxs @@ -6,7 +6,7 @@ <File Name="LICENSE.txt" Source="LICENSE" KeyPath="yes" /> </Component> <Component Id="NEWS.txt" Directory="InstallDirectory" Guid="*"> - <File Name="NEWS.txt" Source="!(bindpath.src)Misc\NEWS" KeyPath="yes" /> + <File Name="NEWS.txt" KeyPath="yes" /> </Component> </ComponentGroup> </Fragment> |