1<?xml version="1.0" encoding="utf-8"?>
2<Project DefaultTargets="Build" ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" TreatAsLocalProperty="Py_IntDir">
3  <Import Project="python.props" Condition="$(__Python_Props_Imported) != 'true'" />
4  <PropertyGroup Label="Globals">
5    <__PyProject_Props_Imported>true</__PyProject_Props_Imported>
6    <_ProjectFileVersion>10.0.30319.1</_ProjectFileVersion>
7    <VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
8    <OutDir>$(BuildPath)</OutDir>
9    <OutDir Condition="!HasTrailingSlash($(OutDir))">$(OutDir)\</OutDir>
10    <Py_IntDir Condition="'$(Py_IntDir)' == ''">$(MSBuildThisFileDirectory)obj\</Py_IntDir>
11    <IntDir>$(Py_IntDir)\$(MajorVersionNumber)$(MinorVersionNumber)$(ArchName)_$(Configuration)\$(ProjectName)\</IntDir>
12    <IntDir>$(IntDir.Replace(`\\`, `\`))</IntDir>
13    <TargetName Condition="'$(TargetName)' == ''">$(ProjectName)</TargetName>
14    <TargetName>$(TargetName)$(PyDebugExt)</TargetName>
15    <GenerateManifest>false</GenerateManifest>
16    <EmbedManifest>false</EmbedManifest>
17    <SupportPGO Condition="'$(SupportPGO)' == ''">true</SupportPGO>
18    <SupportSigning Condition="'$(SupportSigning)' == ''">true</SupportSigning>
19    <SupportSigning Condition="'$(Configuration)' == 'Debug'">false</SupportSigning>
20    <SupportSigning Condition="'$(ConfigurationType)' == 'StaticLibrary'">false</SupportSigning>
21  </PropertyGroup>
22
23  <PropertyGroup>
24    <_DebugPreprocessorDefinition>NDEBUG;</_DebugPreprocessorDefinition>
25    <_DebugPreprocessorDefinition Condition="$(Configuration) == 'Debug'">_DEBUG;</_DebugPreprocessorDefinition>
26    <_PlatformPreprocessorDefinition>_WIN32;</_PlatformPreprocessorDefinition>
27    <_PlatformPreprocessorDefinition Condition="$(Platform) == 'x64'">_WIN64;_M_X64;</_PlatformPreprocessorDefinition>
28    <_PydPreprocessorDefinition Condition="$(TargetExt) == '.pyd'">Py_BUILD_CORE_MODULE;</_PydPreprocessorDefinition>
29    <_Py3NamePreprocessorDefinition>PY3_DLLNAME=L"$(Py3DllName)";</_Py3NamePreprocessorDefinition>
30  </PropertyGroup>
31  <ItemDefinitionGroup>
32    <ClCompile>
33      <AdditionalIncludeDirectories>$(PySourcePath)Include;$(PySourcePath)Include\internal;$(PySourcePath)PC;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
34      <PreprocessorDefinitions>WIN32;$(_Py3NamePreprocessorDefinition);$(_PlatformPreprocessorDefinition)$(_DebugPreprocessorDefinition)$(_PydPreprocessorDefinition)%(PreprocessorDefinitions)</PreprocessorDefinitions>
35
36      <Optimization>MaxSpeed</Optimization>
37      <IntrinsicFunctions>true</IntrinsicFunctions>
38      <StringPooling>true</StringPooling>
39      <ExceptionHandling></ExceptionHandling>
40      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>
41      <FunctionLevelLinking>true</FunctionLevelLinking>
42      <WarningLevel>Level3</WarningLevel>
43      <DebugInformationFormat>ProgramDatabase</DebugInformationFormat>
44      <CompileAs>Default</CompileAs>
45      <SuppressStartupBanner>true</SuppressStartupBanner>
46      <WholeProgramOptimization>true</WholeProgramOptimization>
47      <EnableEnhancedInstructionSet Condition="'$(Platform)'=='Win32'">NoExtensions</EnableEnhancedInstructionSet>
48      <InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">OnlyExplicitInline</InlineFunctionExpansion>
49      <InlineFunctionExpansion Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">OnlyExplicitInline</InlineFunctionExpansion>
50    </ClCompile>
51    <ClCompile Condition="$(Configuration) == 'Debug'">
52      <Optimization>Disabled</Optimization>
53      <WholeProgramOptimization>false</WholeProgramOptimization>
54      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
55    </ClCompile>
56    <ClCompile Condition="$(ICCBuild) == 'true'">
57      <FloatingPointModel>Strict</FloatingPointModel>
58    </ClCompile>
59    <Link>
60      <AdditionalLibraryDirectories>$(OutDir);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
61      <GenerateDebugInformation>true</GenerateDebugInformation>
62      <ProgramDatabaseFile>$(OutDir)$(TargetName).pdb</ProgramDatabaseFile>
63      <SubSystem>Windows</SubSystem>
64      <RandomizedBaseAddress>true</RandomizedBaseAddress>
65      <DataExecutionPrevention>true</DataExecutionPrevention>
66      <SuppressStartupBanner>true</SuppressStartupBanner>
67      <IgnoreSpecificDefaultLibraries>LIBC;%(IgnoreSpecificDefaultLibraries)</IgnoreSpecificDefaultLibraries>
68      <TargetMachine>MachineX86</TargetMachine>
69      <TargetMachine Condition="'$(Platform)' == 'x64'">MachineX64</TargetMachine>
70      <TargetMachine Condition="'$(Platform)'=='ARM'">MachineARM</TargetMachine>
71      <TargetMachine Condition="'$(Platform)'=='ARM64'">MachineARM64</TargetMachine>
72      <ProfileGuidedDatabase Condition="$(SupportPGO)">$(OutDir)$(TargetName).pgd</ProfileGuidedDatabase>
73      <LinkTimeCodeGeneration Condition="$(Configuration) == 'Release'">UseLinkTimeCodeGeneration</LinkTimeCodeGeneration>
74      <LinkTimeCodeGeneration Condition="$(SupportPGO) and $(Configuration) == 'PGInstrument'">PGInstrument</LinkTimeCodeGeneration>
75      <LinkTimeCodeGeneration Condition="$(SupportPGO) and $(Configuration) == 'PGUpdate'">PGUpdate</LinkTimeCodeGeneration>
76      <AdditionalDependencies>advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;%(AdditionalDependencies)</AdditionalDependencies>
77    </Link>
78    <Lib>
79      <LinkTimeCodeGeneration Condition="$(Configuration) == 'Release'">true</LinkTimeCodeGeneration>
80      <LinkTimeCodeGeneration Condition="$(SupportPGO) and $(Configuration) == 'PGInstrument'">true</LinkTimeCodeGeneration>
81      <LinkTimeCodeGeneration Condition="$(SupportPGO) and $(Configuration) == 'PGUpdate'">true</LinkTimeCodeGeneration>
82    </Lib>
83    <ResourceCompile>
84      <AdditionalIncludeDirectories>$(PySourcePath)PC;$(PySourcePath)Include;$(IntDir);%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
85      <PreprocessorDefinitions>$(_DebugPreprocessorDefinition)%(PreprocessorDefinitions)</PreprocessorDefinitions>
86      <Culture>0x0409</Culture>
87    </ResourceCompile>
88    <Midl>
89      <PreprocessorDefinitions>$(_DebugPreprocessorDefinition)%(PreprocessorDefinitions)</PreprocessorDefinitions>
90      <MkTypLibCompatible>true</MkTypLibCompatible>
91      <SuppressStartupBanner>true</SuppressStartupBanner>
92      <TargetEnvironment>Win32</TargetEnvironment>
93      <TargetEnvironment Condition="'$(Platform)' == 'x64'">X64</TargetEnvironment>
94      <OutputDirectory>$(IntDir)</OutputDirectory>
95      <InterfaceIdentifierFileName>$(MSBuildProjectName)_i.c</InterfaceIdentifierFileName>
96      <ProxyFileName>$(MSBuildProjectName)_p.c</ProxyFileName>
97    </Midl>
98  </ItemDefinitionGroup>
99
100  <Target Name="GeneratePythonNtRcH"
101          BeforeTargets="ClCompile"
102          Inputs="$(PySourcePath)Include\patchlevel.h"
103          Outputs="$(IntDir)pythonnt_rc.h">
104    <WriteLinesToFile File="$(IntDir)pythonnt_rc.h" Overwrite="true" Encoding="ascii"
105                      Lines='/* This file created by pyproject.props /t:GeneratePythonNtRcH */
106#define FIELD3 $(Field3Value)
107#define MS_DLL_ID "$(SysWinVer)"
108#define PYTHON_DLL_NAME "$(TargetName)$(TargetExt)"
109' />
110    <ItemGroup>
111        <FileWrites Include="$(IntDir)pythonnt_rc.h" />
112    </ItemGroup>
113  </Target>
114
115  <UsingTask TaskName="KillPython" TaskFactory="CodeTaskFactory" AssemblyFile="$(MSBuildToolsPath)\Microsoft.Build.Tasks.v4.0.dll">
116    <ParameterGroup>
117      <FileName Required="true" />
118    </ParameterGroup>
119    <Task>
120      <Using Namespace="System.Diagnostics"/>
121      <Using Namespace="System.IO"/>
122      <Using Namespace="System.Runtime.InteropServices"/>
123      <Using Namespace="System.Text"/>
124      <Code Type="Method" Language="cs">
125<![CDATA[
126[DllImport("kernel32.dll", SetLastError=true, CharSet=CharSet.Unicode)]
127public static extern bool QueryFullProcessImageName([In]IntPtr hProcess, [In]int dwFlags,
128                                                    [Out]StringBuilder lpExeName, ref int lpdwSize);
129public override bool Execute() {
130    string fullPath = Path.GetFullPath(FileName);
131    Log.LogMessage("Looking for " + fullPath, MessageImportance.Normal);
132    foreach (Process p in Process.GetProcesses()) {
133        try {
134            int pathLength = 32768;
135            StringBuilder pathBuilder = new StringBuilder(pathLength);
136            if (QueryFullProcessImageName(p.Handle, 0, pathBuilder, ref pathLength)) {
137                string exeName = Path.GetFullPath(pathBuilder.ToString());
138                Log.LogMessage("Found running process: " + exeName, MessageImportance.Low);
139                if (fullPath.Equals(exeName, StringComparison.OrdinalIgnoreCase)) {
140                    Log.LogMessage("Terminating " + exeName, MessageImportance.High);
141                    p.Kill();
142                }
143            }
144        } catch {
145        }
146    }
147    return true;
148}
149]]>
150      </Code>
151    </Task>
152  </UsingTask>
153
154  <Target Name="KillPython" BeforeTargets="PrepareForBuild" Condition="'$(KillPython)' == 'true'">
155    <Message Text="Killing any running python$(PyDebugExt)$(PyTestExt).exe instances..." Importance="high" />
156    <KillPython FileName="$(OutDir)python$(PyDebugExt)$(PyTestExt).exe" />
157  </Target>
158
159  <!--
160  A default target to handle msbuild pcbuild.proj /t:CleanAll.
161
162  Some externals projects don't respond to /t:Clean, so we invoke
163  CleanAll on them when we really want to clean up.
164  -->
165  <Target Name="CleanAll" DependsOnTargets="Clean">
166    <MSBuild Projects="@(ProjectReference->'%(FullPath)')"
167             Properties="Configuration=$(Configuration);Platform=$(Platform)"
168             BuildInParallel="true"
169             StopOnFirstFailure="false"
170             Condition="Exists(%(FullPath))"
171             Targets="CleanAll" />
172  </Target>
173
174  <Target Name="CopyPGCFiles" BeforeTargets="PrepareForBuild" Condition="$(Configuration) == 'PGUpdate'">
175    <ItemGroup>
176      <_PGCFiles Include="$(OutDir)instrumented\$(TargetName)!*.pgc" />
177      <_PGDFile Include="$(OutDir)instrumented\$(TargetName).pgd" />
178      <_CopyFiles Include="@(_PGCFiles);@(_PGDFile)" Condition="Exists(%(FullPath))" />
179    </ItemGroup>
180    <Delete Files="@(_CopyFiles->'$(OutDir)%(Filename)%(Extension)')" />
181    <Error Text="PGO run did not succeed (no $(TargetName)!*.pgc files) and there is no data to merge"
182           Condition="$(RequirePGCFiles) == 'true' and @(_PGCFiles) == ''" />
183    <Copy SourceFiles="@(_CopyFiles)"
184          DestinationFolder="$(OutDir)"
185          UseHardLinksIfPossible="true"
186          OverwriteReadOnlyFiles="true" />
187  </Target>
188
189  <PropertyGroup>
190    <SdkBinPath Condition="'$(SdkBinPath)' == '' or !Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10)\bin\$(DefaultWindowsSDKVersion)\x86</SdkBinPath>
191    <SdkBinPath Condition="!Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot10)\bin\x86</SdkBinPath>
192    <SdkBinPath Condition="!Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot81)\bin\x86</SdkBinPath>
193    <SdkBinPath Condition="!Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows Kits\Installed Roots@KitsRoot)\bin\x86</SdkBinPath>
194    <SdkBinPath Condition="!Exists($(SdkBinPath))">$(registry:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Microsoft SDKs\Windows\v7.1A@InstallationFolder)\Bin\</SdkBinPath>
195    <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificate)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /n "$(SigningCertificate)" /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d "Python $(PythonVersion)"</_SignCommand>
196    <_SignCommand Condition="Exists($(SdkBinPath)) and '$(SigningCertificateSha1)' != '' and $(SupportSigning)">"$(SdkBinPath)\signtool.exe" sign /a /sha1 "$(SigningCertificateSha1)" /fd sha256 /tr http://timestamp.digicert.com/ /td sha256 /d "Python $(PythonVersion)"</_SignCommand>
197    <_MakeCatCommand Condition="Exists($(SdkBinPath))">"$(SdkBinPath)\makecat.exe"</_MakeCatCommand>
198  </PropertyGroup>
199
200  <Target Name="_SignBuild" AfterTargets="AfterBuild" Condition="'$(_SignCommand)' != '' and $(SupportSigning)">
201    <Error Text="Unable to locate signtool.exe. Set /p:SignToolPath and rebuild" Condition="'$(_SignCommand)' == ''" />
202    <Exec Command='$(_SignCommand) "$(TargetPath)" || $(_SignCommand) "$(TargetPath)" || $(_SignCommand) "$(TargetPath)"' ContinueOnError="false" />
203  </Target>
204
205
206  <Target Name="FindVCRedistDir">
207    <!-- Hard coded path for VS 2015 -->
208    <PropertyGroup Condition="$(PlatformToolset) == 'v140'">
209      <VCRedistDir>$(VCInstallDir)\redist\</VCRedistDir>
210    </PropertyGroup>
211
212    <!-- Search for version number in some broken Build Tools installs -->
213    <ItemGroup Condition="$(VCRedistDir) == '' and $(VCToolsRedistVersion) == ''">
214      <_RedistFiles Include="$(VCInstallDir)\Redist\MSVC\*\*.*" />
215    </ItemGroup>
216    <PropertyGroup Condition="$(VCRedistDir) == '' and $(VCToolsRedistVersion) == ''">
217      <_RedistDir>%(_RedistFiles.Directory)</_RedistDir>
218      <VCToolsRedistVersion>$([System.IO.Path]::GetFileName($(_RedistDir.Trim(`\`))))</VCToolsRedistVersion>
219    </PropertyGroup>
220
221    <!-- Use correct path for VS 2017 and later -->
222    <PropertyGroup Condition="$(VCRedistDir) == ''">
223      <VCRedistDir>$(VCInstallDir)\Redist\MSVC\$(VCToolsRedistVersion)\</VCRedistDir>
224    </PropertyGroup>
225
226    <PropertyGroup>
227      <VCRedistDir Condition="$(Platform) == 'Win32'">$(VCRedistDir)x86\</VCRedistDir>
228      <VCRedistDir Condition="$(Platform) != 'Win32'">$(VCRedistDir)$(Platform)\</VCRedistDir>
229    </PropertyGroup>
230
231    <Message Text="VC Redist Directory: $(VCRedistDir)" />
232    <Message Text="VC Redist Version: $(VCToolsRedistVersion)" />
233  </Target>
234
235  <Target Name="FindVCRuntime" Returns="VCRuntimeDLL" DependsOnTargets="FindVCRedistDir">
236    <ItemGroup Condition="$(VCInstallDir) != ''">
237      <VCRuntimeDLL Include="$(VCRedistDir)\Microsoft.VC*.CRT\vcruntime*.dll" />
238    </ItemGroup>
239
240    <Warning Text="vcruntime*.dll not found under $(VCRedistDir)." Condition="@(VCRuntimeDLL) == ''" />
241    <Message Text="VC Runtime DLL(s):%0A- @(VCRuntimeDLL,'%0A- ')" />
242  </Target>
243</Project>
244