summaryrefslogtreecommitdiff
path: root/Tools-Override/codeOptimization.targets
diff options
context:
space:
mode:
Diffstat (limited to 'Tools-Override/codeOptimization.targets')
-rw-r--r--Tools-Override/codeOptimization.targets118
1 files changed, 118 insertions, 0 deletions
diff --git a/Tools-Override/codeOptimization.targets b/Tools-Override/codeOptimization.targets
new file mode 100644
index 0000000000..4db340f15e
--- /dev/null
+++ b/Tools-Override/codeOptimization.targets
@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+ <UsingTask TaskName="ZipFileExtractToDirectory" AssemblyFile="$(BuildToolsTaskDir)Microsoft.DotNet.Build.Tasks.dll"/>
+
+ <PropertyGroup>
+ <OptimizationDataVersion Condition="'$(OptimizationDataVersion)'==''">2.0.0-rc-61101-16</OptimizationDataVersion>
+ <OptimizationDataPackageName Condition="'$(OptimizationDataPackageName)'==''">RoslynDependencies.OptimizationData</OptimizationDataPackageName>
+ <OptimizationDataDir Condition="'$(OptimizationDataDir)'==''">$(ToolsDir)OptimizationData/</OptimizationDataDir>
+ <RestoreDefaultOptimizationDataPackage Condition="'$(RestoreDefaultOptimizationDataPackage)'==''">true</RestoreDefaultOptimizationDataPackage>
+ <UsePartialNGENOptimization Condition="'$(UsePartialNGENOptimization)'==''">true</UsePartialNGENOptimization>
+ </PropertyGroup>
+
+ <!-- If IBC data hasn't been merged with the IL yet, preprocess it first -->
+ <Target Name="PreProcessIBCData"
+ BeforeTargets="OptimizeWithTrainingData"
+ DependsOnTargets="ResolveOptionalTools"
+ Condition="'$(OS)'=='Windows_NT' and '$(EnableProfileGuidedOptimization)'=='true' and Exists('$(OptimizationDataDir)$(AssemblyName).dll')">
+
+ <!-- Find IBCMerge as a resolved optional tool. -->
+ <PropertyGroup>
+ <IBCMergeToolPath Condition="'%(Filename)%(Extension)'=='ibcmerge.exe'">@(ResolvedOptionalToolReferences)</IBCMergeToolPath>
+ </PropertyGroup>
+
+ <!-- Enumerate the various files that need merging -->
+ <PropertyGroup>
+ <InputAssemblyFile>$(OptimizationDataDir)$(AssemblyName).dll</InputAssemblyFile>
+ <TargetOptimizationDataFile>$(OptimizationDataDir)$(AssemblyName).pgo</TargetOptimizationDataFile>
+ </PropertyGroup>
+ <ItemGroup>
+ <RawOptimizationDataFiles Include="$(OptimizationDataDir)$(AssemblyName)*.ibc" />
+ </ItemGroup>
+
+ <!-- Merge the optimization data into the source DLL -->
+ <Exec Command="$(IBCMergeToolPath) -q -f -delete -mo $(InputAssemblyFile) @(RawOptimizationDataFiles, ' ')" />
+
+ <!-- Verify that the optimization data has been merged -->
+ <Exec Command="$(IBCMergeToolPath) -mi $(InputAssemblyFile)" />
+
+ <!-- Save the module as *.pgo to match the convention expected in target OptimizeWithTrainingData -->
+ <Copy SourceFiles="$(InputAssemblyFile)" DestinationFiles="$(TargetOptimizationDataFile)" />
+ </Target>
+
+ <!-- We should only run this target on Windows and only if EnableProfileGuidedOptimization is set and we have training data -->
+ <Target Name="OptimizeWithTrainingData"
+ AfterTargets="AfterBuild"
+ BeforeTargets="CopyFilesToOutputDirectory"
+ DependsOnTargets="ResolveOptionalTools"
+ Condition="'$(OS)'=='Windows_NT' and '$(EnableProfileGuidedOptimization)'=='true' and Exists('$(OptimizationDataDir)$(AssemblyName).pgo')">
+
+ <!-- Find IBCMerge as a resolved optional tool. -->
+ <PropertyGroup>
+ <IBCMergeToolPath Condition="'%(Filename)%(Extension)'=='ibcmerge.exe'">@(ResolvedOptionalToolReferences)</IBCMergeToolPath>
+ </PropertyGroup>
+
+ <PropertyGroup>
+ <OptimizedAssemblyDir>$(IntermediateOutputPath)/OptimizedAssembly</OptimizedAssemblyDir>
+ <OptimizedAssemblyFile>$(OptimizedAssemblyDir)/$(AssemblyName).dll</OptimizedAssemblyFile>
+ </PropertyGroup>
+
+ <!-- Customize IBCMerge's arguments depending on input props -->
+ <PropertyGroup>
+ <IBCMergeArguments>-q -f -mo $(OptimizedAssemblyFile) -incremental $(OptimizationDataDir)$(AssemblyName).pgo</IBCMergeArguments>
+ <IBCMergeArguments Condition="$(UsePartialNGENOptimization)">$(IBCMergeArguments) -partialNGEN -minify</IBCMergeArguments>
+ </PropertyGroup>
+
+ <!-- Copy the compiled assembly into a folder for further processing -->
+ <MakeDir Directories="$(OptimizedAssemblyDir)" />
+ <Copy SourceFiles="@(IntermediateAssembly)" DestinationFolder="$(OptimizedAssemblyDir)" />
+
+ <!-- Apply optimization data to the compiled assembly -->
+ <Exec Command="$(IBCMergeToolPath) $(IBCMergeArguments)" />
+
+ <!-- Verify that the optimization data has been applied -->
+ <Exec Command="$(IBCMergeToolPath) -mi $(OptimizedAssemblyFile)" />
+
+ <!-- We need to make sure that the assembly that gets packaged is the one with the optimization data -->
+ <ItemGroup>
+ <IntermediateAssembly Remove="@(IntermediateAssembly)"/>
+ <IntermediateAssembly Include="$(OptimizedAssemblyDir)/$(AssemblyName).dll"/>
+ </ItemGroup>
+ </Target>
+
+ <!-- We need the OptimizationData package in order to be able to optimize the assembly -->
+ <Target Name="RestoreOptimizationDataPackage"
+ BeforeTargets="Sync"
+ Condition="'$(EnableProfileGuidedOptimization)'=='true' and '$(RestoreDefaultOptimizationDataPackage)'=='true' and !Exists('$(OptimizationDataDir)project.json')">
+
+ <!-- Dynamically create a project.json file used to restore the optimization data-->
+ <Message Text="Generating project.json for optimization data" Importance="low" />
+ <ItemGroup>
+ <_OptimizationDataJsonLine Include="{&quot;dependencies&quot;: {" />
+ <_OptimizationDataJsonLine Include="&quot;$(OptimizationDataPackageName)&quot; : &quot;$(OptimizationDataVersion)&quot; " />
+ <_OptimizationDataJsonLine Include="},&quot;frameworks&quot;: {&quot;netcoreapp1.0&quot;: {},&quot;net46&quot;: {}}}"/>
+ </ItemGroup>
+
+ <PropertyGroup>
+ <OptimizationDataProjectJson>$(OptimizationDataDir)project.json</OptimizationDataProjectJson>
+ <OptimizationDataNuGetFeed Condition="'$(OptimizationDataNuGetFeed)'==''">https:%2F%2Fdotnet.myget.org/F/roslyn/api/v3/index.json</OptimizationDataNuGetFeed>
+ </PropertyGroup>
+
+ <MakeDir Directories="$(OptimizationDataDir)" ContinueOnError="true" />
+ <WriteLinesToFile File="$(OptimizationDataProjectJson)" Lines="@(_OptimizationDataJsonLine)" Overwrite="true" />
+
+ <!-- Restore the OptimizationData package -->
+ <Exec Command="$(DnuRestoreCommand) $(OptimizationDataProjectJson) --source $(OptimizationDataNuGetFeed)"
+ StandardOutputImportance="Low"/>
+
+ <!-- Copy the restored files into a more accessible location -->
+ <ItemGroup>
+ <_OptimizationDataFiles Include="$(PackagesDir)/$(OptimizationDataPackageName)/$(OptimizationDataVersion)/content/OptimizationData/*.pgo" />
+ </ItemGroup>
+
+ <Copy SourceFiles="@(_OptimizationDataFiles)"
+ DestinationFiles="@(_OptimizationDataFiles->'$(OptimizationDataDir)%(Filename)%(Extension)')"
+ SkipUnchangedFiles="true"
+ ContinueOnError="true"/>
+ </Target>
+</Project> \ No newline at end of file