Fix unset ZapRelocationType for fixup (#18589)
[platform/upstream/coreclr.git] / Tools / versioning.targets
1 <Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2
3   <UsingTask TaskName="GenerateCurrentVersion" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll" />
4
5   <!-- Setup the default file version information -->
6   <PropertyGroup>
7     <MajorVersion Condition="'$(MajorVersion)' == ''">1</MajorVersion>
8     <MinorVersion Condition="'$(MinorVersion)' == ''">0</MinorVersion>
9
10     <!-- These should be set by importing the targets below but initializing to 0 for consistency -->
11     <BuildNumberMajor Condition="'$(BuildNumberMajor)' == ''">0</BuildNumberMajor>
12     <BuildNumberMinor Condition="'$(BuildNumberMinor)' == ''">0</BuildNumberMinor>
13   </PropertyGroup>
14
15   <!-- Import a build target that includes the build numbers -->
16   <Import Project="$(BuildNumberTarget)" Condition="Exists('$(BuildNumberTarget)')" />
17
18   <!-- #################################### -->
19   <!-- Generate Assembly Info -->
20   <!-- #################################### -->
21   <PropertyGroup>
22     <AssemblyVersion Condition="'$(AssemblyVersion)'==''">1.0.0.0</AssemblyVersion>
23     <CLSCompliant Condition="'$(CLSCompliant)'==''">false</CLSCompliant>
24     <AssemblyFileVersion Condition="'$(AssemblyFileVersion)'==''">$(MajorVersion).$(MinorVersion).$(BuildNumberMajor).$(BuildNumberMinor)</AssemblyFileVersion>
25   </PropertyGroup>
26
27   <Import Project="$(MSBuildThisFileDirectory)versioning.props" Condition="'$(BuildToolsVersioningPropsHasBeenImported)' != 'true'" />
28
29   <PropertyGroup>
30     <GenerateAssemblyInfo Condition="'$(GenerateAssemblyInfo)'==''">true</GenerateAssemblyInfo>
31   </PropertyGroup>
32
33   <PropertyGroup Condition="'$(GenerateAssemblyInfo)'=='true'">
34     <AssemblyInfoFile Condition="'$(MSBuildProjectExtension)' == '.csproj'">$(IntermediateOutputPath)_AssemblyInfo.cs</AssemblyInfoFile>
35     <AssemblyInfoFile Condition="'$(MSBuildProjectExtension)' == '.vbproj'">$(IntermediateOutputPath)_AssemblyInfo.vb</AssemblyInfoFile>
36     <AssemblyInfoPartialFile Condition="'$(MSBuildProjectExtension)' == '.csproj'">$(MSBuildThisFileDirectory)AssemblyInfoPartial.cs</AssemblyInfoPartialFile>
37     <AssemblyInfoPartialFile Condition="'$(MSBuildProjectExtension)' == '.vbproj'">$(MSBuildThisFileDirectory)AssemblyInfoPartial.vb</AssemblyInfoPartialFile>
38     <AssemblyInfoPartialFileLink Condition="'$(MSBuildProjectExtension)' == '.csproj'">Properties/_AssemblyInfo.cs</AssemblyInfoPartialFileLink>
39     <AssemblyInfoPartialFileLink Condition="'$(MSBuildProjectExtension)' == '.vbproj'">My Project/_AssemblyInfo.vb</AssemblyInfoPartialFileLink>
40     <CoreCompileDependsOn>$(CoreCompileDependsOn);GenerateAssemblyInfo</CoreCompileDependsOn>
41   </PropertyGroup>
42
43   <Target Name="DecideIfWeNeedToIncludeDllSafeSearchPathAttribute" 
44     Condition="'$(IsDotNetFrameworkProductAssembly)' == 'true' AND '$(IsTestProject)' != 'true'"
45     BeforeTargets="GenerateAssemblyInfo">
46     
47     <!-- We want to apply the IncludeDllSafeSearchPathAttribute on all DotNet assemblies (non test) that have a reference to System.Runtime.InteropServices -->
48     <PropertyGroup Condition="'$(IncludeDllSafeSearchPathAttribute)'==''">
49       <IncludeDllSafeSearchPathAttribute>false</IncludeDllSafeSearchPathAttribute> <!-- We don't need to include it by default. -->
50       <IncludeDllSafeSearchPathAttribute Condition="'%(ProjectReference.Filename)'=='System.Runtime.InteropServices'">true</IncludeDllSafeSearchPathAttribute>
51       <IncludeDllSafeSearchPathAttribute Condition="'%(Reference.Identity)'=='System.Runtime.InteropServices'">true</IncludeDllSafeSearchPathAttribute>
52     </PropertyGroup>
53   </Target>
54
55   <Target Name="GenerateAssemblyInfo"
56       Inputs="$(MSBuildProjectFile)"
57       Outputs="$(AssemblyInfoFile)"
58       Condition="'$(GenerateAssemblyInfo)'=='true'"
59       DependsOnTargets="CreateVersionFileDuringBuild">
60
61     <Error Condition="!Exists('$(IntermediateOutputPath)')" Text="GenerateAssemblyInfo failed because IntermediateOutputPath isn't set to a valid directory" />
62
63     <ItemGroup Condition="'$(MSBuildProjectExtension)' == '.csproj'">
64       <AssemblyInfoUsings Include="using System%3B" />
65       <AssemblyInfoUsings Include="using System.Reflection%3B" />
66       <AssemblyInfoLines Include="[assembly:AssemblyTitle(&quot;$(AssemblyTitle)&quot;)]" />
67       <AssemblyInfoLines Include="[assembly:AssemblyDescription(&quot;$(Description)&quot;)]" />
68       <AssemblyInfoLines Include="[assembly:AssemblyDefaultAlias(&quot;$(AssemblyName)&quot;)]" />
69       <AssemblyInfoLines Include="[assembly:AssemblyCompany(&quot;$(Company)&quot;)]" />
70       <AssemblyInfoLines Include="[assembly:AssemblyProduct(&quot;$(Product)&quot;)]" />
71       <AssemblyInfoLines Include="[assembly:AssemblyCopyright(&quot;$(Copyright)&quot;)]" />
72       <AssemblyInfoLines Include="[assembly:AssemblyVersion(&quot;$(AssemblyVersion)&quot;)]" />
73       <AssemblyInfoLines Include="[assembly:AssemblyFileVersion(&quot;$(FileVersion)&quot;)]" />
74       <AssemblyInfoLines Include="[assembly:AssemblyInformationalVersion(@&quot;$(InformationalVersion)&quot;)]" />
75       <AssemblyInfoLines Condition="'$(CLSCompliant)'=='true'" Include="[assembly:CLSCompliant(true)]" />
76       <AssemblyInfoLines Condition="'$(AssemblyComVisible)'!=''" Include="[assembly:System.Runtime.InteropServices.ComVisible($(AssemblyComVisible))]" />
77       <AssemblyInfoLines Condition="'$(SkipFrameworkAssemblyMetadata)' != 'true'"
78         Include="[assembly:System.Reflection.AssemblyMetadata(&quot;%(AssemblyMetadata.Identity)&quot;, &quot;%(AssemblyMetadata.Value)&quot;)]" />
79
80       <AssemblyInfoLines Condition="'$(IncludeDllSafeSearchPathAttribute)'=='true'" 
81         Include="[assembly: System.Runtime.InteropServices.DefaultDllImportSearchPathsAttribute(System.Runtime.InteropServices.DllImportSearchPath.AssemblyDirectory | System.Runtime.InteropServices.DllImportSearchPath.System32)]" />
82     </ItemGroup>
83
84     <ItemGroup Condition="'$(MSBuildProjectExtension)' == '.vbproj'">
85       <AssemblyInfoUsings Include="Imports System" />
86       <AssemblyInfoUsings Include="Imports System.Reflection" />
87       <AssemblyInfoLines Include="&lt;Assembly:AssemblyTitle(&quot;$(AssemblyTitle)&quot;)&gt;" />
88       <AssemblyInfoLines Include="&lt;Assembly:AssemblyDescription(&quot;$(Description)&quot;)&gt;" />
89       <AssemblyInfoLines Include="&lt;Assembly:AssemblyDefaultAlias(&quot;$(AssemblyName)&quot;)&gt;" />
90       <AssemblyInfoLines Include="&lt;Assembly:AssemblyCompany(&quot;$(Company)&quot;)&gt;" />
91       <AssemblyInfoLines Include="&lt;Assembly:AssemblyProduct(&quot;$(Product)k&quot;)&gt;" />
92       <AssemblyInfoLines Include="&lt;Assembly:AssemblyCopyright(&quot;$(Copyright)&quot;)&gt;" />
93       <AssemblyInfoLines Include="&lt;Assembly:AssemblyVersion(&quot;$(AssemblyVersion)&quot;)&gt;" />
94       <AssemblyInfoLines Include="&lt;Assembly:AssemblyFileVersion(&quot;$(FileVersion)&quot;)&gt;" />
95       <AssemblyInfoLines Include="&lt;Assembly:AssemblyInformationalVersion(&quot;$(InformationalVersion)&quot;)&gt;" />
96       <AssemblyInfoLines Condition="'$(CLSCompliant)'=='true'" Include="&lt;Assembly:CLSCompliant(True)&gt;" />
97       <AssemblyInfoLines Condition="'$(AssemblyComVisible)'!=''" Include="&lt;Assembly:System.Runtime.InteropServices.ComVisible($(AssemblyComVisible))&gt;" />
98       <AssemblyInfoLines Condition="'$(SkipFrameworkAssemblyMetadata)' != 'true'"
99           Include="&lt;assembly:System.Reflection.AssemblyMetadata(&quot;%(AssemblyMetadata.Identity)&quot;, &quot;%(AssemblyMetadata.Value)&quot;)&gt;" />
100
101       <AssemblyInfoLines Condition="'$(IncludeDllSafeSearchPathAttribute)'=='true'" 
102         Include="&lt;Assembly:System.Runtime.InteropServices.DefaultDllImportSearchPathsAttribute(System.Runtime.InteropServices.DllImportSearchPath.AssemblyDirectory | System.Runtime.InteropServices.DllImportSearchPath.System32)&gt;" />
103     </ItemGroup>
104
105     <ItemGroup Condition="'$(MSBuildProjectExtension)' == '.csproj' And '$(GenerateThisAssemblyClass)' == 'true'">
106       <AssemblyInfoLines Include="internal static class ThisAssembly" />
107       <AssemblyInfoLines Include="{" />
108       <AssemblyInfoLines Include="%20%20%20%20internal const string Title = &quot;$(AssemblyName)&quot;%3B" />
109       <AssemblyInfoLines Include="%20%20%20%20internal const string Copyright = &quot;\u00A9 Microsoft Corporation.  All rights reserved.&quot;%3B" />
110       <AssemblyInfoLines Include="%20%20%20%20internal const string Version = &quot;$(AssemblyVersion)&quot;%3B" />
111       <AssemblyInfoLines Include="%20%20%20%20internal const string InformationalVersion = &quot;$(AssemblyFileVersion)&quot;%3B" />
112       <AssemblyInfoLines Include="}" />
113     </ItemGroup>
114
115     <WriteLinesToFile
116       File="$(AssemblyInfoFile)"
117       Lines="@(AssemblyInfoUsings);@(AssemblyInfoLines);@(AssemblyInfoSource)"
118       Overwrite="true" />
119
120     <ItemGroup>
121       <Compile Include="$(AssemblyInfoFile)" />
122       <FileWrites Include="$(AssemblyInfoFile)" />
123     </ItemGroup>
124
125   </Target>
126
127   <ItemGroup Condition="'$(GenerateAssemblyInfo)'=='true' AND '$(StringResourcesPath)' != '' AND '$(ExcludeAssemblyInfoPartialFile)' != 'true'">
128     <Compile Include="$(AssemblyInfoPartialFile)">
129       <Visible>true</Visible>
130       <Link>$(AssemblyInfoPartialFileLink)</Link>
131     </Compile>
132   </ItemGroup>
133
134   <PropertyGroup>
135     <GenerateNativeVersionInfo Condition="'$(GenerateNativeVersionInfo)'==''">false</GenerateNativeVersionInfo>
136   </PropertyGroup>
137
138   <PropertyGroup Condition="'$(GenerateNativeVersionInfo)'=='true'">
139     <NativeVersionFileDir>$(BaseIntermediateOutputPath)</NativeVersionFileDir>
140     <NativeVersionHeaderFile>$(NativeVersionFileDir)_version.h</NativeVersionHeaderFile>
141     <GenerateVersionHeader>true</GenerateVersionHeader>
142   </PropertyGroup>
143
144   <Target Name="GenerateVersionHeader"
145       Inputs="$(MSBuildProjectFile)"
146       Outputs="$(NativeVersionHeaderFile)"
147       DependsOnTargets="CreateVersionFileDuringBuild"
148       Condition="'$(NativeVersionHeaderFile)'!='' and '$(GenerateVersionHeader)'=='true' and !Exists($(NativeVersionHeaderFile))">
149
150     <ItemGroup>
151       <!-- Defining versioning variables -->
152       <NativeVersionLines Include="#ifndef VER_COMPANYNAME_STR" />
153       <NativeVersionLines Include="#define VER_COMPANYNAME_STR         &quot;Microsoft Corporation&quot;" />
154       <NativeVersionLines Include="#endif" />
155       <NativeVersionLines Include="#ifndef VER_FILEDESCRIPTION_STR" />
156       <NativeVersionLines Include="#define VER_FILEDESCRIPTION_STR     &quot;$(AssemblyName)&quot;" />
157       <NativeVersionLines Include="#endif" />
158       <NativeVersionLines Include="#ifndef VER_INTERNALNAME_STR" />
159       <NativeVersionLines Include="#define VER_INTERNALNAME_STR        VER_FILEDESCRIPTION_STR" />
160       <NativeVersionLines Include="#endif" />
161       <NativeVersionLines Include="#ifndef VER_ORIGINALFILENAME_STR" />
162       <NativeVersionLines Include="#define VER_ORIGINALFILENAME_STR    VER_FILEDESCRIPTION_STR" />
163       <NativeVersionLines Include="#endif" />
164       <NativeVersionLines Include="#ifndef VER_PRODUCTNAME_STR" />
165       <NativeVersionLines Include="#define VER_PRODUCTNAME_STR         &quot;Microsoft\xae .NET Framework&quot;" />
166       <NativeVersionLines Include="#endif" />
167       <NativeVersionLines Include="#undef VER_PRODUCTVERSION" />
168       <NativeVersionLines Include="#define VER_PRODUCTVERSION          $(MajorVersion),$(MinorVersion),$(BuildNumberMajor),$(BuildNumberMinor)" />
169       <NativeVersionLines Include="#undef VER_PRODUCTVERSION_STR" />
170       <NativeVersionLines Include="#define VER_PRODUCTVERSION_STR      &quot;$(MajorVersion).$(MinorVersion).$(BuildNumberMajor).$(BuildNumberMinor)$(BuiltByString)&quot;" />
171       <NativeVersionLines Include="#undef VER_FILEVERSION" />
172       <NativeVersionLines Include="#define VER_FILEVERSION             $(MajorVersion),$(MinorVersion),$(BuildNumberMajor),$(BuildNumberMinor)" />
173       <NativeVersionLines Include="#undef VER_FILEVERSION_STR" />
174       <NativeVersionLines Include="#define VER_FILEVERSION_STR         &quot;$(MajorVersion).$(MinorVersion).$(BuildNumberMajor).$(BuildNumberMinor)$(BuiltByString)&quot;" />
175       <NativeVersionLines Include="#ifndef VER_LEGALCOPYRIGHT_STR" />
176       <NativeVersionLines Include="#define VER_LEGALCOPYRIGHT_STR      &quot;\xa9 Microsoft Corporation.  All rights reserved.&quot;" />
177       <NativeVersionLines Include="#endif" />
178       <NativeVersionLines Include="#ifndef VER_DEBUG" />
179       <NativeVersionLines Condition="'$(Configuration)'=='Debug'" Include="#define VER_DEBUG                   VS_FF_DEBUG" />
180       <NativeVersionLines Condition="'$(Configuration)'!='Debug'" Include="#define VER_DEBUG                   0" />
181       <NativeVersionLines Include="#endif" />
182     </ItemGroup>
183
184     <MakeDir Condition="!Exists('$(NativeVersionFileDir)')" Directories="$(NativeVersionFileDir)" />
185
186     <WriteLinesToFile
187       File="$(NativeVersionHeaderFile)"
188       Lines="@(NativeVersionLines)"
189       Overwrite="true" />
190
191     <ItemGroup>
192       <FileWrites Include="$(NativeVersionHeaderFile)" />
193     </ItemGroup>
194   </Target>
195
196   <PropertyGroup Condition="'$(GenerateVersionSourceFile)'=='true'">
197     <NativeVersionSourceDir>$(BaseIntermediateOutputPath)</NativeVersionSourceDir>
198     <NativeVersionSourceFile>$(NativeVersionSourceDir)version.c</NativeVersionSourceFile>
199   </PropertyGroup>
200
201   <!-- Non Windows versioning requires to generate a source file and include it on the compilation. -->
202   <Target Name="GenerateVersionSourceFile"
203       Inputs="$(MSBuildProjectFile)"
204       Outputs="$(NativeVersionSourceFile)"
205       DependsOnTargets="CreateVersionFileDuringBuild"
206       Condition="'$(NativeVersionSourceFile)'!='' and '$(GenerateVersionSourceFile)'=='true'">
207
208     <ItemGroup>
209       <SourceFileLines />
210       <SourceFileLines Include="static char sccsid%5B%5D %5F%5Fattribute%5F%5F%28%28used%29%29 %3D %22%40%28%23%29Version $(MajorVersion).$(MinorVersion).$(BuildNumberMajor).$(BuildNumberMinor)$(BuiltByString)%22%3B" />
211       <!-- Since this is a source file, compiler will complain if there is no new line at end of file, so adding one bellow. -->
212       <SourceFileLines Include=" " />
213     </ItemGroup>
214
215     <MakeDir Condition="!Exists('$(NativeVersionSourceDir)')" Directories="$(NativeVersionSourceDir)" />
216
217     <WriteLinesToFile
218       File="$(NativeVersionSourceFile)"
219       Lines="@(SourceFileLines)"
220       Overwrite="true" />
221
222     <ItemGroup>
223       <FileWrites Include="$(NativeVersionSourceFile)" />
224     </ItemGroup>
225   </Target>
226
227   <PropertyGroup>
228     <GetNuGetPackageVersionsDependsOn>$(GetNuGetPackageVersionsDependsOn);CreateVersionInfoFile</GetNuGetPackageVersionsDependsOn>
229   </PropertyGroup>
230
231   <PropertyGroup>
232     <SyncInfoDirectory Condition="'$(SyncInfoDirectory)' == ''">$(ObjDir)</SyncInfoDirectory>
233     <SyncInfoFile Condition="'$(SyncInfoFile)' == ''">$(SyncInfoDirectory)version.txt</SyncInfoFile>
234   </PropertyGroup>
235
236   <Target Name="CreateVersionInfoFile"
237           DependsOnTargets="CreateVersionFileDuringBuild"
238           BeforeTargets="BuildAllProjects"
239           Inputs="$(LatestCommit)"
240           Outputs="$(SyncInfoFile)">
241     <MakeDir Condition="!Exists('$(SyncInfoDirectory)')"
242              Directories="$(SyncInfoDirectory)" />
243     <WriteLinesToFile
244       Condition="'$(LatestCommit)' != ''"
245       File="$(SyncInfoFile)"
246       Lines="$(LatestCommit)"
247       Overwrite="true" />
248   </Target>
249
250   <!--
251     Target: CreateOrUpdateCurrentVersionFile
252
253     Generates the version data and saves it to $(BuildVersionFile) if it hasn't been imported
254
255     Outputs:
256       $(LatestCommit)
257       $(BuiltByString)
258       $(BuildNumberMajor)
259       $(BuildNumberMinor)
260       $(AssemblyFileVersion)
261   -->
262   <Target Name="CreateOrUpdateCurrentVersionFile"
263       BeforeTargets="ResolveProjectReferences"
264       Condition="'$(SkipVersionGeneration)' != 'true' AND '$(VersionPropsImported)' != 'true'">
265
266     <!-- ############################### -->
267     <Exec Command="git describe --all HEAD 2>&amp;1" StandardOutputImportance="Low" IgnoreExitCode="true" IgnoreStandardErrorWarningFormat="true" ConsoleToMSBuild="true" Condition="'$(RawGitBranchName)' == ''">
268       <Output TaskParameter="ConsoleOutput" PropertyName="RawGitBranchName" />
269     </Exec>
270
271     <!-- ############################### -->
272     <PropertyGroup Condition="'$(LatestCommit)' != ''">
273       <LatestCommitExitCode>0</LatestCommitExitCode>
274     </PropertyGroup>
275
276     <!-- Get the latest commit hash -->
277     <Exec Command="git rev-parse HEAD 2>&amp;1" StandardOutputImportance="Low" IgnoreExitCode="true" IgnoreStandardErrorWarningFormat="true" ConsoleToMSBuild="true" Condition="'$(LatestCommit)' == ''">
278       <Output TaskParameter="ConsoleOutput" PropertyName="LatestCommit" />
279       <Output TaskParameter="ExitCode" PropertyName="LatestCommitExitCode" />
280     </Exec>
281
282     <!-- We shouldn't fail the build if we can't retreive the commit hash, so in this case just set it to N/A -->
283     <PropertyGroup Condition="'$(LatestCommitExitCode)'!='0'">
284       <LatestCommit>N/A</LatestCommit>
285     </PropertyGroup>
286
287     <!-- If things match expected patterns, create $(GitBranchName) from $(RawGitBranchName) -->
288     <Message Text="GIT Branch Name as seen by git describe: '$(RawGitBranchName)'" /> 
289     <PropertyGroup Condition="$(RawGitBranchName.StartsWith('heads/'))">
290       <GitBranchName>$(RawGitBranchName.SubString(6))</GitBranchName>
291     </PropertyGroup>
292     <PropertyGroup Condition="$(RawGitBranchName.StartsWith('remotes/origin/'))">
293       <GitBranchName>$(RawGitBranchName.SubString(15))</GitBranchName>
294     </PropertyGroup>
295     <Message Text="GIT Branch Name: '$(GitBranchName)'" /> 
296
297     <!-- The GitHubOwnerName is the name of the entity that 'owns' a particular github repository (e.g the 'dotnet in https://github/dotnet/coreclr) -->
298     <!-- we assume by default that these build tools are used by the 'dotnet' group.  This can be overridden. -->
299     <PropertyGroup Condition="'$(GitHubOwnerName)' == ''">
300       <GitHubOwnerName>dotnet</GitHubOwnerName>
301     </PropertyGroup>
302
303     <!-- The GitHubRepositoryUrl is formed out of the simple GitHubRepositoryName (e.g. coreclr or corefx) -->
304     <PropertyGroup Condition="'$(GitHubOwnerName)' != '' AND '$(GitHubRepositoryName)' != '' AND '$(GitHubRepositoryUrl)' == ''">
305       <GitHubRepositoryUrl>https://github.com/$(GitHubOwnerName)/$(GitHubRepositoryName)</GitHubRepositoryUrl>
306     </PropertyGroup>
307
308     <!-- ******* SourceLink Support, activated by setting $(UseSourceLink) ********* -->
309
310     <!-- Generate the SourceLink file that will be passed to the C# compiler (using ProjectDir and GitHubRepositoryUrl as data) -->
311     <MakeDir Directories="$(BaseIntermediateOutputPath)" />
312     <WriteLinesToFile 
313       Condition="'$(UseSourceLink)' == 'true' AND '$(GitHubRepositoryUrl)' != '' AND '$(LatestCommit)' != 'N/A' AND !Exists('$(SourceLinkFilePath)')"
314       ContinueOnError="WarnAndContinue"
315       File="$(SourceLinkFilePath)" 
316       Overwrite="true" 
317       Lines='{"documents": { "$(ProjectDir.Replace("\", "\\"))*" : "$(GitHubRepositoryUrl.Replace("github.com", "raw.githubusercontent.com"))/$(LatestCommit)/*" }}' />
318
319     <PropertyGroup>
320       <LatestCommitExitCode/>
321     </PropertyGroup>
322
323     <!-- ############################### -->
324     <!-- Get the latest commit date -->
325     <ItemGroup>
326       <VersionTargetsFile Include="$(MSBuildThisFileFullPath)" />
327     </ItemGroup>
328     <!-- Windows Exec command requires DOS escaping for the percent sign since it secretly runs the process in a shell instead of calling createprocess. -->
329     <PropertyGroup>
330       <LatestDateCommand Condition="'$(RunningOnUnix)'!='true'">git show -s --format=^%25%25cd --date=short HEAD</LatestDateCommand>
331       <LatestDateCommand Condition="'$(RunningOnUnix)'=='true'">git show -s --format=%25cd --date=short HEAD</LatestDateCommand>
332     </PropertyGroup>
333
334     <PropertyGroup Condition="'$(VersionSeedDate)' != ''">
335       <LatestDateCommandExitCode>0</LatestDateCommandExitCode>
336     </PropertyGroup>
337
338     <Exec Command="$(LatestDateCommand)" StandardOutputImportance="Low" IgnoreExitCode="true" IgnoreStandardErrorWarningFormat="true" ConsoleToMSBuild="true" Condition="'$(VersionSeedDate)' == ''">
339       <Output TaskParameter="ConsoleOutput" PropertyName="VersionSeedDate" />
340       <Output TaskParameter="ExitCode" PropertyName="LatestDateCommandExitCode" />
341     </Exec>
342     <PropertyGroup Condition="'$(LatestDateCommandExitCode)'!='0'">
343       <VersionSeedDate>%(VersionTargetsFile.ModifiedTime)</VersionSeedDate>
344       <VersionSeedSourceComment>VersionSeedDate was produced by getting the timestamp of versioning.targets.</VersionSeedSourceComment>
345     </PropertyGroup>
346     <PropertyGroup Condition="'$(LatestDateCommandExitCode)'=='0'">
347       <VersionSeedSourceComment>VersionSeedDate was produced by taking the timestamp of the last git commit.</VersionSeedSourceComment>
348     </PropertyGroup>
349     <ItemGroup>
350       <VersionTargetsFile Remove="@(VersionTargetsFile)" />
351     </ItemGroup>
352     <PropertyGroup>
353       <LatestDateCommand/>
354       <LatestDateCommandExitCode/>
355     </PropertyGroup>
356
357     <!-- ############################### -->
358     <!-- Get Username -->
359     <PropertyGroup>
360       <VersionUserName Condition="'$(VersionUserName)' == ''">$(USERNAME)</VersionUserName>
361     </PropertyGroup>
362
363     <Exec Command="whoami" Condition="'$(VersionUserName)' == ''" StandardOutputImportance="Low" IgnoreExitCode="true" IgnoreStandardErrorWarningFormat="true" ConsoleToMSBuild="true">
364       <Output TaskParameter="ConsoleOutput" PropertyName="VersionUserName" />
365     </Exec>
366
367     <!-- ############################### -->
368     <!-- Get Hostname -->
369     <PropertyGroup>
370       <VersionHostName Condition="'$(VersionHostName)' == ''">$(COMPUTERNAME)</VersionHostName>
371     </PropertyGroup>
372
373     <Exec Command="hostname" Condition="'$(RunningOnUnix)'=='true' AND '$(VersionHostName)'==''" StandardOutputImportance="Low" IgnoreExitCode="true" IgnoreStandardErrorWarningFormat="true" ConsoleToMSBuild="true">
374       <Output TaskParameter="ConsoleOutput" PropertyName="VersionHostName" />
375     </Exec>
376
377     <!-- Set BuiltByString (which is added to the end of the informational version) -->
378     <!-- This string has additional information as well (like the GIT commit URL) -->
379     <!-- and has the general form @Name1: Value1 @Name2: Value2  ... which makes it easy to parse -->
380     <PropertyGroup Condition="'$(BuiltByString)' == ''">
381       <!-- Set the @BuiltBy key-value pair -->
382       <BuiltByString Condition="'$(VersionUserName)' != '' AND '$(VersionHostName)' != ''">$(BuiltByString) %40BuiltBy: $(VersionUserName)-$(VersionHostName)</BuiltByString>
383       <!-- Set the @Branch key-value pair -->
384       <BuiltByString Condition="'$(GitBranchName)' != ''">$(BuiltByString) %40Branch: $(GitBranchName)</BuiltByString>
385       <!-- Set the @SrcCode key-value pair -->
386       <BuiltByString Condition="'$(GitHubRepositoryUrl)' != '' AND '$(LatestCommit)' != 'N/A'">$(BuiltByString) %40SrcCode: $(GitHubRepositoryUrl)/tree/$(LatestCommit)</BuiltByString>
387       <!-- If that does not work, try setting the @Commit key-value pair -->
388       <BuiltByString Condition="'$(GitHubRepositoryUrl)' == '' AND '$(LatestCommit)' != 'N/A'">$(BuiltByString) %40Commit: $(LatestCommit)</BuiltByString>
389       <VersionUserName/>
390       <VersionHostName/>
391     </PropertyGroup>
392
393     <!-- Setting default parameters in case that they are not set before. -->
394     <PropertyGroup>
395       <!-- Padding should be equal or greater to 5. Using 5 to align with internal build system. -->
396       <VersionPadding Condition="'$(VersionPadding)'==''">5</VersionPadding>
397       <!-- Using the following default comparison date will produce versions that align with our internal build system. -->
398       <VersionComparisonDate Condition="'$(VersionComparisonDate)'==''">1996-04-01</VersionComparisonDate>
399     </PropertyGroup>
400
401     <GenerateCurrentVersion SeedDate="$(VersionSeedDate)" OfficialBuildId="$(OfficialBuildId)" ComparisonDate="$(VersionComparisonDate)" Padding="$(VersionPadding)">
402       <Output PropertyName="BuildNumberMajor" TaskParameter="GeneratedVersion" />
403       <Output PropertyName="BuildNumberMinor" TaskParameter="GeneratedRevision" />
404     </GenerateCurrentVersion>
405     <PropertyGroup>
406       <VersionPadding/>
407       <VersionComparisonDate/>
408     </PropertyGroup>
409
410     <PropertyGroup>
411       <VersionFileContent>
412         <![CDATA[<?xml version="1.0" encoding="utf-8"?>
413 <!-- This is a generated file. $(VersionSourceComment) Seed Date is $(VersionSeedDate). -->
414 <Project ToolsVersion="14.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
415   <PropertyGroup>
416     <VersionPropsImported>true</VersionPropsImported>
417     <BuildNumberMajor Condition="'%24(BuildNumberMajor)' == ''">$(BuildNumberMajor)</BuildNumberMajor>
418     <BuildNumberMinor Condition="'%24(BuildNumberMinor)' == ''">$(BuildNumberMinor)</BuildNumberMinor>
419     <LatestCommit Condition="'%24(LatestCommit)' == ''">$(LatestCommit)</LatestCommit>
420     <BuiltByString Condition="'%24(BuiltByString)' == ''">$(BuiltByString)</BuiltByString>
421   </PropertyGroup>
422 </Project>
423 ]]>
424       </VersionFileContent>
425     </PropertyGroup>
426
427     <!-- Since by default the file will get dropped at the obj dir, make sure that the dir is created already or else WriteLinesToFile will error. -->
428     <MakeDir Directories="$(BuildVersionFilePath)" />
429
430     <WriteLinesToFile
431       ContinueOnError="WarnAndContinue"
432       Condition="!Exists('$(BuildVersionFile)')"
433       File="$(BuildVersionFile)"
434       Lines="$(VersionFileContent)"
435       Overwrite="true" />
436
437     <!-- Delete old BuildVersion.props files -->
438     <ItemGroup>
439       <OldBuildVersionFiles Include="$(BuildVersionFilePath)BuildVersions-*.props" Exclude="$(BuildVersionFile)" />
440     </ItemGroup>
441     <Delete Files="@(OldBuildVersionFiles)" TreatErrorsAsWarnings="true"/>
442     <ItemGroup>
443       <OldBuildVersionFiles Remove="@(OldBuildVersionFiles)"/>
444     </ItemGroup>
445
446     <PropertyGroup>
447       <!-- Redefine AssemblyFileVersion because we just computed it. -->
448       <AssemblyFileVersion>$(MajorVersion).$(MinorVersion).$(BuildNumberMajor).$(BuildNumberMinor)</AssemblyFileVersion>
449     </PropertyGroup>
450   </Target>
451
452   <!-- This target will only be executed if BuildVersion.props doesn't exist yet -->
453   <Target Name="CreateVersionFileDuringBuild" Condition="'$(SkipVersionGeneration)'!='true' AND '$(ShouldCreateVersionFileDuringBuild)'=='true'" DependsOnTargets="CreateOrUpdateCurrentVersionFile">
454     <PropertyGroup Condition="'$(SkipVersionGeneration)'!='true'">
455       <VersionSuffix Condition="'$(PreReleaseLabel)' != ''">-$(PreReleaseLabel)</VersionSuffix>
456       <VersionSuffix Condition="'$(IncludeBuildNumberInPackageVersion)' == 'true'">$(VersionSuffix)-$(BuildNumberMajor)-$(BuildNumberMinor)</VersionSuffix>
457     </PropertyGroup>
458   </Target>
459
460   <Target Name="NativeResourceCompile" DependsOnTargets="$(BeforeResourceCompileTargets)" Inputs="$(MsBuildThisFileDirectory)NativeVersion.rc" Outputs="$(Win32Resource)">
461     <Error Condition="!Exists('$(RCPATH)')" Text="NativeResourceCompile failed because RCPath is set to an non-existing rc.exe path." />
462
463     <Exec Command='"$(RCPath)" /i $(BaseIntermediateOutputPath) /i $(IntermediateOutputPath) /i $(WindowsSDKPath)\inc /i $(VCSDKPath)\Include /D _UNICODE /D UNICODE /l"0x0409" /r /fo "$(Win32Resource)" "$(MsBuildThisFileDirectory)NativeVersion.rc"' />
464   </Target>
465 </Project>