Kaydet (Commit) fcbe1df4 authored tarafından Steve Dower's avatar Steve Dower

Issue #25027: Reverts partial-static build options and adds vcruntime140.dll to…

Issue #25027: Reverts partial-static build options and adds vcruntime140.dll to Windows installation.
üst 0130e299
...@@ -14,6 +14,8 @@ for older versions in distutils.msvc9compiler and distutils.msvccompiler. ...@@ -14,6 +14,8 @@ for older versions in distutils.msvc9compiler and distutils.msvccompiler.
# ported to VS 2015 by Steve Dower # ported to VS 2015 by Steve Dower
import os import os
import shutil
import stat
import subprocess import subprocess
from distutils.errors import DistutilsExecError, DistutilsPlatformError, \ from distutils.errors import DistutilsExecError, DistutilsPlatformError, \
...@@ -25,7 +27,7 @@ from distutils.util import get_platform ...@@ -25,7 +27,7 @@ from distutils.util import get_platform
import winreg import winreg
from itertools import count from itertools import count
def _find_vcvarsall(): def _find_vcvarsall(plat_spec):
with winreg.OpenKeyEx( with winreg.OpenKeyEx(
winreg.HKEY_LOCAL_MACHINE, winreg.HKEY_LOCAL_MACHINE,
r"Software\Microsoft\VisualStudio\SxS\VC7", r"Software\Microsoft\VisualStudio\SxS\VC7",
...@@ -33,7 +35,7 @@ def _find_vcvarsall(): ...@@ -33,7 +35,7 @@ def _find_vcvarsall():
) as key: ) as key:
if not key: if not key:
log.debug("Visual C++ is not registered") log.debug("Visual C++ is not registered")
return None return None, None
best_version = 0 best_version = 0
best_dir = None best_dir = None
...@@ -51,14 +53,23 @@ def _find_vcvarsall(): ...@@ -51,14 +53,23 @@ def _find_vcvarsall():
best_version, best_dir = version, vc_dir best_version, best_dir = version, vc_dir
if not best_version: if not best_version:
log.debug("No suitable Visual C++ version found") log.debug("No suitable Visual C++ version found")
return None return None, None
vcvarsall = os.path.join(best_dir, "vcvarsall.bat") vcvarsall = os.path.join(best_dir, "vcvarsall.bat")
if not os.path.isfile(vcvarsall): if not os.path.isfile(vcvarsall):
log.debug("%s cannot be found", vcvarsall) log.debug("%s cannot be found", vcvarsall)
return None return None, None
return vcvarsall vcruntime = None
vcruntime_spec = _VCVARS_PLAT_TO_VCRUNTIME_REDIST.get(plat_spec)
if vcruntime_spec:
vcruntime = os.path.join(best_dir,
vcruntime_spec.format(best_version))
if not os.path.isfile(vcruntime):
log.debug("%s cannot be found", vcruntime)
vcruntime = None
return vcvarsall, vcruntime
def _get_vc_env(plat_spec): def _get_vc_env(plat_spec):
if os.getenv("DISTUTILS_USE_SDK"): if os.getenv("DISTUTILS_USE_SDK"):
...@@ -67,7 +78,7 @@ def _get_vc_env(plat_spec): ...@@ -67,7 +78,7 @@ def _get_vc_env(plat_spec):
for key, value in os.environ.items() for key, value in os.environ.items()
} }
vcvarsall = _find_vcvarsall() vcvarsall, vcruntime = _find_vcvarsall(plat_spec)
if not vcvarsall: if not vcvarsall:
raise DistutilsPlatformError("Unable to find vcvarsall.bat") raise DistutilsPlatformError("Unable to find vcvarsall.bat")
...@@ -83,12 +94,16 @@ def _get_vc_env(plat_spec): ...@@ -83,12 +94,16 @@ def _get_vc_env(plat_spec):
raise DistutilsPlatformError("Error executing {}" raise DistutilsPlatformError("Error executing {}"
.format(exc.cmd)) .format(exc.cmd))
return { env = {
key.lower(): value key.lower(): value
for key, _, value in for key, _, value in
(line.partition('=') for line in out.splitlines()) (line.partition('=') for line in out.splitlines())
if key and value if key and value
} }
if vcruntime:
env['py_vcruntime_redist'] = vcruntime
return env
def _find_exe(exe, paths=None): def _find_exe(exe, paths=None):
"""Return path to an MSVC executable program. """Return path to an MSVC executable program.
...@@ -115,6 +130,20 @@ PLAT_TO_VCVARS = { ...@@ -115,6 +130,20 @@ PLAT_TO_VCVARS = {
'win-amd64' : 'amd64', 'win-amd64' : 'amd64',
} }
# A map keyed by get_platform() return values to the file under
# the VC install directory containing the vcruntime redistributable.
_VCVARS_PLAT_TO_VCRUNTIME_REDIST = {
'x86' : 'redist\\x86\\Microsoft.VC{0}0.CRT\\vcruntime{0}0.dll',
'amd64' : 'redist\\x64\\Microsoft.VC{0}0.CRT\\vcruntime{0}0.dll',
'x86_amd64' : 'redist\\x64\\Microsoft.VC{0}0.CRT\\vcruntime{0}0.dll',
}
# A set containing the DLLs that are guaranteed to be available for
# all micro versions of this Python version. Known extension
# dependencies that are not in this set will be copied to the output
# path.
_BUNDLED_DLLS = frozenset(['vcruntime140.dll'])
class MSVCCompiler(CCompiler) : class MSVCCompiler(CCompiler) :
"""Concrete class that implements an interface to Microsoft Visual C++, """Concrete class that implements an interface to Microsoft Visual C++,
as defined by the CCompiler abstract class.""" as defined by the CCompiler abstract class."""
...@@ -189,6 +218,7 @@ class MSVCCompiler(CCompiler) : ...@@ -189,6 +218,7 @@ class MSVCCompiler(CCompiler) :
self.rc = _find_exe("rc.exe", paths) # resource compiler self.rc = _find_exe("rc.exe", paths) # resource compiler
self.mc = _find_exe("mc.exe", paths) # message compiler self.mc = _find_exe("mc.exe", paths) # message compiler
self.mt = _find_exe("mt.exe", paths) # message compiler self.mt = _find_exe("mt.exe", paths) # message compiler
self._vcruntime_redist = vc_env.get('py_vcruntime_redist', '')
for dir in vc_env.get('include', '').split(os.pathsep): for dir in vc_env.get('include', '').split(os.pathsep):
if dir: if dir:
...@@ -199,20 +229,26 @@ class MSVCCompiler(CCompiler) : ...@@ -199,20 +229,26 @@ class MSVCCompiler(CCompiler) :
self.add_library_dir(dir) self.add_library_dir(dir)
self.preprocess_options = None self.preprocess_options = None
# Use /MT[d] to build statically, then switch from libucrt[d].lib to ucrt[d].lib # If vcruntime_redist is available, link against it dynamically. Otherwise,
# use /MT[d] to build statically, then switch from libucrt[d].lib to ucrt[d].lib
# later to dynamically link to ucrtbase but not vcruntime. # later to dynamically link to ucrtbase but not vcruntime.
self.compile_options = [ self.compile_options = [
'/nologo', '/Ox', '/MT', '/W3', '/GL', '/DNDEBUG' '/nologo', '/Ox', '/W3', '/GL', '/DNDEBUG'
] ]
self.compile_options.append('/MD' if self._vcruntime_redist else '/MT')
self.compile_options_debug = [ self.compile_options_debug = [
'/nologo', '/Od', '/MTd', '/Zi', '/W3', '/D_DEBUG' '/nologo', '/Od', '/MDd', '/Zi', '/W3', '/D_DEBUG'
] ]
ldflags = [ ldflags = [
'/nologo', '/INCREMENTAL:NO', '/LTCG', '/nodefaultlib:libucrt.lib', 'ucrt.lib', '/nologo', '/INCREMENTAL:NO', '/LTCG'
] ]
if not self._vcruntime_redist:
ldflags.extend(('/nodefaultlib:libucrt.lib', 'ucrt.lib'))
ldflags_debug = [ ldflags_debug = [
'/nologo', '/INCREMENTAL:NO', '/LTCG', '/DEBUG:FULL', '/nodefaultlib:libucrtd.lib', 'ucrtd.lib', '/nologo', '/INCREMENTAL:NO', '/LTCG', '/DEBUG:FULL'
] ]
self.ldflags_exe = [*ldflags, '/MANIFEST:EMBED,ID=1'] self.ldflags_exe = [*ldflags, '/MANIFEST:EMBED,ID=1']
...@@ -446,15 +482,29 @@ class MSVCCompiler(CCompiler) : ...@@ -446,15 +482,29 @@ class MSVCCompiler(CCompiler) :
if extra_postargs: if extra_postargs:
ld_args.extend(extra_postargs) ld_args.extend(extra_postargs)
self.mkpath(os.path.dirname(output_filename)) output_dir = os.path.dirname(os.path.abspath(output_filename))
self.mkpath(output_dir)
try: try:
log.debug('Executing "%s" %s', self.linker, ' '.join(ld_args)) log.debug('Executing "%s" %s', self.linker, ' '.join(ld_args))
self.spawn([self.linker] + ld_args) self.spawn([self.linker] + ld_args)
self._copy_vcruntime(output_dir)
except DistutilsExecError as msg: except DistutilsExecError as msg:
raise LinkError(msg) raise LinkError(msg)
else: else:
log.debug("skipping %s (up-to-date)", output_filename) log.debug("skipping %s (up-to-date)", output_filename)
def _copy_vcruntime(self, output_dir):
vcruntime = self._vcruntime_redist
if not vcruntime or not os.path.isfile(vcruntime):
return
if os.path.basename(vcruntime).lower() in _BUNDLED_DLLS:
return
log.debug('Copying "%s"', vcruntime)
vcruntime = shutil.copy(vcruntime, output_dir)
os.chmod(vcruntime, stat.S_IWRITE)
def spawn(self, cmd): def spawn(self, cmd):
old_path = os.getenv('path') old_path = os.getenv('path')
try: try:
......
...@@ -3,6 +3,8 @@ import sys ...@@ -3,6 +3,8 @@ import sys
import unittest import unittest
import os import os
import distutils._msvccompiler as _msvccompiler
from distutils.errors import DistutilsPlatformError from distutils.errors import DistutilsPlatformError
from distutils.tests import support from distutils.tests import support
from test.support import run_unittest from test.support import run_unittest
...@@ -19,19 +21,65 @@ class msvccompilerTestCase(support.TempdirManager, ...@@ -19,19 +21,65 @@ class msvccompilerTestCase(support.TempdirManager,
# makes sure query_vcvarsall raises # makes sure query_vcvarsall raises
# a DistutilsPlatformError if the compiler # a DistutilsPlatformError if the compiler
# is not found # is not found
from distutils._msvccompiler import _get_vc_env def _find_vcvarsall(plat_spec):
def _find_vcvarsall(): return None, None
return None
import distutils._msvccompiler as _msvccompiler
old_find_vcvarsall = _msvccompiler._find_vcvarsall old_find_vcvarsall = _msvccompiler._find_vcvarsall
_msvccompiler._find_vcvarsall = _find_vcvarsall _msvccompiler._find_vcvarsall = _find_vcvarsall
try: try:
self.assertRaises(DistutilsPlatformError, _get_vc_env, self.assertRaises(DistutilsPlatformError,
_msvccompiler._get_vc_env,
'wont find this version') 'wont find this version')
finally: finally:
_msvccompiler._find_vcvarsall = old_find_vcvarsall _msvccompiler._find_vcvarsall = old_find_vcvarsall
def test_compiler_options(self):
# suppress path to vcruntime from _find_vcvarsall to
# check that /MT is added to compile options
old_find_vcvarsall = _msvccompiler._find_vcvarsall
def _find_vcvarsall(plat_spec):
return old_find_vcvarsall(plat_spec)[0], None
_msvccompiler._find_vcvarsall = _find_vcvarsall
try:
compiler = _msvccompiler.MSVCCompiler()
compiler.initialize()
self.assertIn('/MT', compiler.compile_options)
self.assertNotIn('/MD', compiler.compile_options)
finally:
_msvccompiler._find_vcvarsall = old_find_vcvarsall
def test_vcruntime_copy(self):
# force path to a known file - it doesn't matter
# what we copy as long as its name is not in
# _msvccompiler._BUNDLED_DLLS
old_find_vcvarsall = _msvccompiler._find_vcvarsall
def _find_vcvarsall(plat_spec):
return old_find_vcvarsall(plat_spec)[0], __file__
_msvccompiler._find_vcvarsall = _find_vcvarsall
try:
tempdir = self.mkdtemp()
compiler = _msvccompiler.MSVCCompiler()
compiler.initialize()
compiler._copy_vcruntime(tempdir)
self.assertTrue(os.path.isfile(os.path.join(
tempdir, os.path.basename(__file__))))
finally:
_msvccompiler._find_vcvarsall = old_find_vcvarsall
def test_vcruntime_skip_copy(self):
tempdir = self.mkdtemp()
compiler = _msvccompiler.MSVCCompiler()
compiler.initialize()
dll = compiler._vcruntime_redist
self.assertTrue(os.path.isfile(dll))
compiler._copy_vcruntime(tempdir)
self.assertFalse(os.path.isfile(os.path.join(
tempdir, os.path.basename(dll))))
def test_suite(): def test_suite():
return unittest.makeSuite(msvccompilerTestCase) return unittest.makeSuite(msvccompilerTestCase)
......
...@@ -12,6 +12,13 @@ Library ...@@ -12,6 +12,13 @@ Library
- Issue #25029: Fixes MemoryError in test_strptime - Issue #25029: Fixes MemoryError in test_strptime
Build
-----
- Issue #25027: Reverts partial-static build options and adds
vcruntime140.dll to Windows installation.
What's New in Python 3.5.0 release candidate 3? What's New in Python 3.5.0 release candidate 3?
=============================================== ===============================================
......
...@@ -36,7 +36,7 @@ ...@@ -36,7 +36,7 @@
<IntrinsicFunctions>true</IntrinsicFunctions> <IntrinsicFunctions>true</IntrinsicFunctions>
<StringPooling>true</StringPooling> <StringPooling>true</StringPooling>
<ExceptionHandling></ExceptionHandling> <ExceptionHandling></ExceptionHandling>
<RuntimeLibrary>MultiThreaded</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
<FunctionLevelLinking>true</FunctionLevelLinking> <FunctionLevelLinking>true</FunctionLevelLinking>
<WarningLevel>Level3</WarningLevel> <WarningLevel>Level3</WarningLevel>
<DebugInformationFormat>ProgramDatabase</DebugInformationFormat> <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
...@@ -47,7 +47,7 @@ ...@@ -47,7 +47,7 @@
<ClCompile Condition="$(Configuration) == 'Debug'"> <ClCompile Condition="$(Configuration) == 'Debug'">
<Optimization>Disabled</Optimization> <Optimization>Disabled</Optimization>
<WholeProgramOptimization>false</WholeProgramOptimization> <WholeProgramOptimization>false</WholeProgramOptimization>
<RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary> <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
</ClCompile> </ClCompile>
<Link> <Link>
<AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
...@@ -57,9 +57,7 @@ ...@@ -57,9 +57,7 @@
<RandomizedBaseAddress>true</RandomizedBaseAddress> <RandomizedBaseAddress>true</RandomizedBaseAddress>
<DataExecutionPrevention>true</DataExecutionPrevention> <DataExecutionPrevention>true</DataExecutionPrevention>
<SuppressStartupBanner>true</SuppressStartupBanner> <SuppressStartupBanner>true</SuppressStartupBanner>
<AdditionalDependencies Condition="$(Configuration) == 'Debug'">ucrtd.lib;%(AdditionalDependencies)</AdditionalDependencies> <IgnoreSpecificDefaultLibraries>LIBC;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<AdditionalDependencies Condition="$(Configuration) != 'Debug'">ucrt.lib;%(AdditionalDependencies)</AdditionalDependencies>
<IgnoreSpecificDefaultLibraries>LIBC;libucrt.lib;libucrtd.lib;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
<TargetMachine>MachineX86</TargetMachine> <TargetMachine>MachineX86</TargetMachine>
<TargetMachine Condition="'$(Platform)' == 'x64'">MachineX64</TargetMachine> <TargetMachine Condition="'$(Platform)' == 'x64'">MachineX64</TargetMachine>
<ProfileGuidedDatabase Condition="$(SupportPGO)">$(OutDir)$(TargetName).pgd</ProfileGuidedDatabase> <ProfileGuidedDatabase Condition="$(SupportPGO)">$(OutDir)$(TargetName).pgd</ProfileGuidedDatabase>
......
...@@ -61,8 +61,8 @@ ...@@ -61,8 +61,8 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup> <PropertyGroup>
<TclOpts>ucrt</TclOpts> <TclOpts>msvcrt</TclOpts>
<TclOpts Condition="$(Configuration) == 'Debug'">symbols,ucrt</TclOpts> <TclOpts Condition="$(Configuration) == 'Debug'">symbols,msvcrt</TclOpts>
<TclDirs>INSTALLDIR="$(OutDir.TrimEnd(`\`))" INSTALL_DIR="$(OutDir.TrimEnd(`\`))"</TclDirs> <TclDirs>INSTALLDIR="$(OutDir.TrimEnd(`\`))" INSTALL_DIR="$(OutDir.TrimEnd(`\`))"</TclDirs>
<DebugFlags Condition="'$(Configuration)' == 'Debug'">DEBUGFLAGS="-wd4456 -wd4457 -wd4458 -wd4459 -wd4996"</DebugFlags> <DebugFlags Condition="'$(Configuration)' == 'Debug'">DEBUGFLAGS="-wd4456 -wd4457 -wd4458 -wd4459 -wd4996"</DebugFlags>
<NMakeBuildCommandLine>setlocal <NMakeBuildCommandLine>setlocal
......
...@@ -57,8 +57,8 @@ ...@@ -57,8 +57,8 @@
<PropertyGroup> <PropertyGroup>
<TixDirs>BUILDDIRTOP="$(BuildDirTop)" TCL_DIR="$(tclDir.TrimEnd(`\`))" TK_DIR="$(tkDir.TrimEnd(`\`))" INSTALL_DIR="$(OutDir.TrimEnd(`\`))"</TixDirs> <TixDirs>BUILDDIRTOP="$(BuildDirTop)" TCL_DIR="$(tclDir.TrimEnd(`\`))" TK_DIR="$(tkDir.TrimEnd(`\`))" INSTALL_DIR="$(OutDir.TrimEnd(`\`))"</TixDirs>
<DebugFlags Condition="'$(Configuration)' == 'Debug'">DEBUG=1 NODEBUG=0 UCRT=1 TCL_DBGX=g TK_DBGX=g</DebugFlags> <DebugFlags Condition="'$(Configuration)' == 'Debug'">DEBUG=1 NODEBUG=0 TCL_DBGX=g TK_DBGX=g</DebugFlags>
<DebugFlags Condition="'$(Configuration)' != 'Debug'">DEBUG=0 NODEBUG=1 UCRT=1</DebugFlags> <DebugFlags Condition="'$(Configuration)' != 'Debug'">DEBUG=0 NODEBUG=1</DebugFlags>
<NMakeBuildCommandLine>setlocal <NMakeBuildCommandLine>setlocal
@(ExpectedOutputs->'if not exist "%(FullPath)" goto build',' @(ExpectedOutputs->'if not exist "%(FullPath)" goto build','
') ')
......
...@@ -60,8 +60,8 @@ ...@@ -60,8 +60,8 @@
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
<PropertyGroup> <PropertyGroup>
<TkOpts>ucrt</TkOpts> <TkOpts>msvcrt</TkOpts>
<TkOpts Condition="$(Configuration) == 'Debug'">symbols,ucrt</TkOpts> <TkOpts Condition="$(Configuration) == 'Debug'">symbols,msvcrt</TkOpts>
<TkDirs>TCLDIR="$(tclDir.TrimEnd(`\`))" INSTALLDIR="$(OutDir.TrimEnd(`\`))"</TkDirs> <TkDirs>TCLDIR="$(tclDir.TrimEnd(`\`))" INSTALLDIR="$(OutDir.TrimEnd(`\`))"</TkDirs>
<DebugFlags Condition="'$(Configuration)' == 'Debug'">DEBUGFLAGS="-wd4456 -wd4457 -wd4458 -wd4459 -wd4996"</DebugFlags> <DebugFlags Condition="'$(Configuration)' == 'Debug'">DEBUGFLAGS="-wd4456 -wd4457 -wd4458 -wd4459 -wd4996"</DebugFlags>
<NMakeBuildCommandLine>setlocal <NMakeBuildCommandLine>setlocal
......
...@@ -20,15 +20,15 @@ if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX6 ...@@ -20,15 +20,15 @@ if not defined BUILDX86 if not defined BUILDX64 (set BUILDX86=1) && (set BUILDX6
call "%PCBUILD%env.bat" x86 call "%PCBUILD%env.bat" x86
if defined BUILDX86 ( if defined BUILDX86 (
call "%PCBUILD%build.bat" -d call "%PCBUILD%build.bat" -d -e
if errorlevel 1 goto :eof if errorlevel 1 goto :eof
call "%PCBUILD%build.bat" call "%PCBUILD%build.bat" -e
if errorlevel 1 goto :eof if errorlevel 1 goto :eof
) )
if defined BUILDX64 ( if defined BUILDX64 (
call "%PCBUILD%build.bat" -p x64 -d call "%PCBUILD%build.bat" -p x64 -d -e
if errorlevel 1 goto :eof if errorlevel 1 goto :eof
call "%PCBUILD%build.bat" -p x64 call "%PCBUILD%build.bat" -p x64 -e
if errorlevel 1 goto :eof if errorlevel 1 goto :eof
) )
......
...@@ -121,7 +121,7 @@ if not "%CERTNAME%" EQU "" ( ...@@ -121,7 +121,7 @@ if not "%CERTNAME%" EQU "" (
if not "%SKIPBUILD%" EQU "1" ( if not "%SKIPBUILD%" EQU "1" (
call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -d -t %TARGET% %CERTOPTS% call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -d -t %TARGET% %CERTOPTS%
if errorlevel 1 exit /B if errorlevel 1 exit /B
call "%PCBUILD%build.bat" -p %BUILD_PLAT% -t %TARGET% %CERTOPTS% call "%PCBUILD%build.bat" -e -p %BUILD_PLAT% -t %TARGET% %CERTOPTS%
if errorlevel 1 exit /B if errorlevel 1 exit /B
@rem build.bat turns echo back on, so we disable it again @rem build.bat turns echo back on, so we disable it again
@echo off @echo off
......
...@@ -29,6 +29,9 @@ ...@@ -29,6 +29,9 @@
<Component Id="pythonw.exe" Directory="InstallDirectory" Guid="$(var.PythonwExeComponentGuid)"> <Component Id="pythonw.exe" Directory="InstallDirectory" Guid="$(var.PythonwExeComponentGuid)">
<File Name="pythonw.exe" KeyPath="yes" /> <File Name="pythonw.exe" KeyPath="yes" />
</Component> </Component>
<Component Id="vcruntime140.dll" Directory="InstallDirectory" Guid="*">
<File Name="vcruntime140.dll" Source="!(bindpath.redist)vcruntime140.dll" KeyPath="yes" />
</Component>
</ComponentGroup> </ComponentGroup>
</Fragment> </Fragment>
......
...@@ -16,7 +16,8 @@ ...@@ -16,7 +16,8 @@
<TargetPath>$(OutputPath)\en-us\$(TargetName)$(TargetExt)</TargetPath> <TargetPath>$(OutputPath)\en-us\$(TargetName)$(TargetExt)</TargetPath>
<Arguments>"$(PythonExe)" "$(MSBuildThisFileDirectory)\make_zip.py"</Arguments> <Arguments>"$(PythonExe)" "$(MSBuildThisFileDirectory)\make_zip.py"</Arguments>
<Arguments>$(Arguments) -e -o "$(TargetPath)" -t "$(IntermediateOutputPath)\zip_$(ArchName)" -a $(ArchName)</Arguments> <Arguments>$(Arguments) -e -o "$(TargetPath)" -t "$(IntermediateOutputPath)\zip_$(ArchName)" -a $(ArchName)</Arguments>
<Environment>set DOC_FILENAME=python$(PythonVersion).chm</Environment> <Environment>set DOC_FILENAME=python$(PythonVersion).chm
set VCREDIST_PATH=$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140.CRT</Environment>
</PropertyGroup> </PropertyGroup>
<Target Name="_Build"> <Target Name="_Build">
......
...@@ -64,9 +64,6 @@ FULL_LAYOUT = [ ...@@ -64,9 +64,6 @@ FULL_LAYOUT = [
('Tools/', 'Tools', '**/*', include_in_tools), ('Tools/', 'Tools', '**/*', include_in_tools),
] ]
if os.getenv('DOC_FILENAME'):
FULL_LAYOUT.append(('Doc/', 'Doc/build/htmlhelp', os.getenv('DOC_FILENAME'), None))
EMBED_LAYOUT = [ EMBED_LAYOUT = [
('/', 'PCBuild/$arch', 'python*.exe', is_not_debug), ('/', 'PCBuild/$arch', 'python*.exe', is_not_debug),
('/', 'PCBuild/$arch', '*.pyd', is_not_debug), ('/', 'PCBuild/$arch', '*.pyd', is_not_debug),
...@@ -74,6 +71,12 @@ EMBED_LAYOUT = [ ...@@ -74,6 +71,12 @@ EMBED_LAYOUT = [
('python35.zip', 'Lib', '**/*', include_in_lib), ('python35.zip', 'Lib', '**/*', include_in_lib),
] ]
if os.getenv('DOC_FILENAME'):
FULL_LAYOUT.append(('Doc/', 'Doc/build/htmlhelp', os.getenv('DOC_FILENAME'), None))
if os.getenv('VCREDIST_PATH'):
FULL_LAYOUT.append(('/', os.getenv('VCREDIST_PATH'), 'vcruntime*.dll', None))
EMBED_LAYOUT.append(('/', os.getenv('VCREDIST_PATH'), 'vcruntime*.dll', None))
def copy_to_layout(target, rel_sources): def copy_to_layout(target, rel_sources):
count = 0 count = 0
......
...@@ -118,6 +118,9 @@ ...@@ -118,6 +118,9 @@
<LinkerBindInputPaths Include="$(CRTRedist)" Condition="'$(CRTRedist)' != ''"> <LinkerBindInputPaths Include="$(CRTRedist)" Condition="'$(CRTRedist)' != ''">
<BindName>redist</BindName> <BindName>redist</BindName>
</LinkerBindInputPaths> </LinkerBindInputPaths>
<LinkerBindInputPaths Include="$(VS140COMNTOOLS)\..\..\VC\redist\$(Platform)\Microsoft.VC140.CRT">
<BindName>redist</BindName>
</LinkerBindInputPaths>
</ItemGroup> </ItemGroup>
<Target Name="_ValidateMsiProps" BeforeTargets="PrepareForBuild"> <Target Name="_ValidateMsiProps" BeforeTargets="PrepareForBuild">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment