2 ***********************************************************************************************
\r
3 Microsoft.NET.CrossGen.targets
\r
5 WARNING: DO NOT MODIFY this file unless you are knowledgeable about MSBuild and have
\r
6 created a backup copy. Incorrect changes to this file will make it
\r
7 impossible to load or build your projects from the command-line or the IDE.
\r
9 Copyright (c) .NET Foundation. All rights reserved.
\r
10 ***********************************************************************************************
\r
12 <Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
\r
15 <MSBuildAllProjects>$(MSBuildAllProjects);$(MSBuildThisFileFullPath)</MSBuildAllProjects>
\r
19 ============================================================
\r
22 Sets up the common infrastructure for the optimization phase
\r
26 ============================================================
\r
29 <Target Name="PrepOptimizer"
\r
30 DependsOnTargets="_GenerateCrossgenProj;
\r
32 Condition="$(SkipOptimization) != 'true' ">
\r
33 <!-- Get the coreclr path -->
\r
35 <_CoreclrResolvedPath Include="@(CrossgenResolvedAssembliesToPublish)"
\r
36 Condition="'%(CrossgenResolvedAssembliesToPublish.Filename)'=='coreclr'" />
\r
37 <_CoreclrResolvedPath Include="@(CrossgenResolvedAssembliesToPublish)"
\r
38 Condition="'%(CrossgenResolvedAssembliesToPublish.Filename)'=='libcoreclr'" />
\r
39 <_JitResolvedPath Include="@(CrossgenResolvedAssembliesToPublish)"
\r
40 Condition="'%(CrossgenResolvedAssembliesToPublish.Filename)'=='clrjit'" />
\r
41 <_JitResolvedPath Include="@(CrossgenResolvedAssembliesToPublish)"
\r
42 Condition="'%(CrossgenResolvedAssembliesToPublish.Filename)'=='libclrjit'" />
\r
45 <NETSdkError Condition="'@(_CoreclrResolvedPath->Count())' > 1"
\r
46 ResourceName="MultipleFilesResolved"
\r
47 FormatArguments="coreclr" />
\r
49 <NETSdkError Condition="'@(_CoreclrResolvedPath)'== ''"
\r
50 ResourceName="UnableToFindResolvedPath"
\r
51 FormatArguments="coreclr" />
\r
53 <NETSdkError Condition="'@(_JitResolvedPath->Count())' > 1"
\r
54 ResourceName="MultipleFilesResolved"
\r
55 FormatArguments="jit" />
\r
57 <NETSdkError Condition="'@(_JitResolvedPath)'== ''"
\r
58 ResourceName="UnableToFindResolvedPath"
\r
59 FormatArguments="jit" />
\r
61 <!-- Get the crossgen and jit path-->
\r
63 <_CoreclrPath>@(_CoreclrResolvedPath)</_CoreclrPath>
\r
64 <JitPath>@(_JitResolvedPath)</JitPath>
\r
65 <_CoreclrDir>$([System.IO.Path]::GetDirectoryName($(_CoreclrPath)))</_CoreclrDir>
\r
66 <_CoreclrPkgDir>$([System.IO.Path]::Combine($(_CoreclrDir),"..\..\..\"))</_CoreclrPkgDir>
\r
67 <CrossgenDir>$([System.IO.Path]::Combine($(_CoreclrPkgDir),"tools"))</CrossgenDir>
\r
68 <!-- TODO override with rid specific tools path for x-arch -->
\r
69 <Crossgen>$([System.IO.Path]::Combine($(CrossgenDir),"crossgen"))</Crossgen>
\r
70 <Crossgen Condition="'$(OS)' == 'Windows_NT'">$([System.IO.Path]::Combine($(CrossgenDir),"crossgen.exe"))</Crossgen>
\r
73 <NETSdkError Condition="!Exists($(Crossgen))"
\r
74 ResourceName="UnableToFindResolvedPath"
\r
75 FormatArguments="$(Crossgen)" />
\r
78 <Crossgen> $([System.IO.Path]::GetFullPath($(Crossgen)))</Crossgen>
\r
83 ============================================================
\r
86 Start the optimization phase
\r
87 ============================================================
\r
90 <Target Name="_RunOptimizer"
\r
91 DependsOnTargets="_InitializeBasicProps;
\r
92 _ComputeResolvedFilesToCacheTypes;
\r
93 _SetupStageForCrossgen"
\r
94 Condition="$(SkipOptimization) != 'true' ">
\r
96 <AssembliestoCrossgen Include="$(MSBuildProjectFullPath)">
\r
98 CrossgenExe=$(Crossgen);
\r
99 CrossgenJit=$(JitPath);
\r
100 CrossgenInputAssembly=%(_ManagedResolvedFilesToOptimize.Fullpath);
\r
101 CrossgenOutputAssembly=$(_RuntimeOptimizedDir)$(DirectorySeparatorChar)%(FileName)%(Extension);
\r
102 CrossgenSubOutputPath=%(DestinationSubPath);
\r
103 _RuntimeOptimizedDir=$(_RuntimeOptimizedDir);
\r
104 PublishDir=$(CacheStagingDir);
\r
105 CrossgenPlatformAssembliesPath=$(_RuntimeRefDir)$(PathSeparator)$(_NetCoreRefDir);
\r
107 </AssembliestoCrossgen>
\r
110 <!-- CrossGen the assemblies -->
\r
111 <MSBuild Projects="@(AssembliestoCrossgen)"
\r
112 Targets="RunCrossGen"
\r
113 BuildInParallel="$(BuildInParallel)"
\r
114 Condition="'@(_ManagedResolvedFilesToOptimize)' != ''"/>
\r
119 ============================================================
\r
121 Target Encapsulating the crossgen command
\r
122 ============================================================
\r
125 <Target Name="RunCrossGen"
\r
126 DependsOnTargets="_InitializeBasicProps;">
\r
129 <CrossgenCommandline>$(CrossgenExe) -readytorun -in $(CrossgenInputAssembly) -out $(CrossgenOutputAssembly) -jitpath $(CrossgenJit) -platform_assemblies_paths $(CrossgenPlatformAssembliesPath)</CrossgenCommandline>
\r
132 <Message Text="CrossgenCommandline: $(CrossgenCommandline)"/>
\r
134 <!-- Workaround for https://github.com/NuGet/Home/issues/4424 -->
\r
135 <Exec Command="chmod 755 $(CrossgenExe)" Condition="'$(OS)' != 'Windows_NT'"/>
\r
137 <!--Optimization skip if the assembly is already present in the final output directory-->
\r
139 Command="$(CrossgenCommandline)"
\r
140 Condition="!Exists($([System.IO.Path]::Combine($(PublishDir),$(CrossgenSubOutputPath))))">
\r
141 <Output TaskParameter="ExitCode" PropertyName="ErrorCode"/>
\r
144 <Copy SourceFiles = "$(CrossgenOutputAssembly)"
\r
145 DestinationFiles="$(PublishDir)\$(CrossgenSubOutputPath)"
\r
146 OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
\r
147 Retries="$(CopyRetryCount)"
\r
148 RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
\r
149 Condition="!Exists($([System.IO.Path]::Combine($(PublishDir),$(CrossgenSubOutputPath))))">
\r
151 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
\r
155 <Target Name="_InitializeBasicProps">
\r
157 <PathSeparator>$([System.IO.Path]::PathSeparator)</PathSeparator>
\r
158 <DirectorySeparatorChar>$([System.IO.Path]::DirectorySeparatorChar)</DirectorySeparatorChar>
\r
163 ============================================================
\r
165 Generates props used by Crossgen
\r
166 ============================================================
\r
169 <Target Name="_GetCrossgenProps"
\r
170 Condition="$(SkipOptimization) != 'true' ">
\r
173 <_CrossProjFileDir>$([System.IO.Path]::Combine($(ComposeWorkingDir),"Optimize"))</_CrossProjFileDir>
\r
174 <_NetCoreRefDir>$([System.IO.Path]::Combine($(_CrossProjFileDir), "netcoreapp"))</_NetCoreRefDir> <!-- flat netcore app assemblies-->
\r
179 ============================================================
\r
180 _GenerateCrossgenProj
\r
181 Generates the project used to restore netcoreapp corresponding to RuntimeFrameworkVersion
\r
182 ============================================================
\r
184 <Target Name="_GenerateCrossgenProj"
\r
185 DependsOnTargets="_GetCrossgenProps;"
\r
186 Condition="$(SkipOptimization) != 'true' ">
\r
187 <!-- Create a Project to Restore Crossgen -->
\r
189 <CrossgenProjContent>
\r
191 <Project Sdk="Microsoft.NET.Sdk">
\r
193 <TargetFramework>$(_TFM)</TargetFramework>
\r
194 <RuntimeIdentifier>$(RuntimeIdentifier)</RuntimeIdentifier>
\r
195 <RuntimeFrameworkVersion>$(RuntimeFrameworkVersion)</RuntimeFrameworkVersion>
\r
200 </CrossgenProjContent>
\r
204 <_CrossProjFile>$([System.IO.Path]::Combine($(_CrossProjFileDir), "OptimizeCrossgen_$(RuntimeIdentifier)_$(_TFM).csproj"))</_CrossProjFile>
\r
205 <_CrossProjAssetsFile>$([System.IO.Path]::Combine($(_CrossProjFileDir), "obj", project.assets.json))</_CrossProjAssetsFile>
\r
208 <MakeDir Directories="$(_CrossProjFileDir)"/>
\r
211 File="$(_CrossProjFile)"
\r
212 Lines="$(CrossgenProjContent)"
\r
213 Overwrite="true" />
\r
217 ============================================================
\r
218 _SetupStageForCrossgen
\r
219 ============================================================
\r
222 <Target Name="_SetupStageForCrossgen"
\r
223 DependsOnTargets="_GetCrossgenProps;_FilterOutFXFromResolvedCandidates;_PopulateUnFilteredResolvedCandidates">
\r
225 <_RuntimeRefDir>$([System.IO.Path]::Combine($(CacheWorkerWorkingDir), "runtimeref"))</_RuntimeRefDir> <!-- flat app managed assemblies -->
\r
226 <_RuntimeOptimizedDir>$([System.IO.Path]::Combine($(CacheWorkerWorkingDir), "runtimopt"))</_RuntimeOptimizedDir> <!-- optimized app managed assemblies in nuget cache layout -->
\r
229 <MakeDir Directories="$(_RuntimeOptimizedDir)"/>
\r
231 <!-- Copy managed files to a flat temp directory for passing it as ref -->
\r
232 <Copy SourceFiles = "@(_ManagedResolvedFilesToOptimize)"
\r
233 DestinationFolder="$(_RuntimeRefDir)"
\r
234 OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
\r
235 Retries="$(CopyRetryCount)"
\r
236 RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
\r
237 UseHardlinksIfPossible="$(CreateHardLinksForPublishFilesIfPossible)"
\r
238 UseSymboliclinksIfPossible="$(CreateSymbolicLinksForPublishFilesIfPossible)">
\r
240 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
\r
246 ============================================================
\r
247 _FilterOutFXFromResolvedCandidates
\r
248 ============================================================
\r
251 <Target Name="_FilterOutFXFromResolvedCandidates"
\r
252 Condition="$(SkipRemovingSystemFiles) != 'true' ">
\r
255 <_ManagedResolvedFilesToOptimize Include="@(_ManagedResolvedFileToPublishCandidates)" Condition="!Exists('$(_NetCoreRefDir)$(DirectorySeparatorChar)%(FileName)%(Extension)')"/>
\r
260 ============================================================
\r
261 _PopulateUnFilteredResolvedCandidates
\r
262 ============================================================
\r
264 <Target Name="_PopulateUnFilteredResolvedCandidates"
\r
265 Condition="$(SkipRemovingSystemFiles) == 'true' ">
\r
268 <_ManagedResolvedFilesToOptimize Include="@(_ManagedResolvedFileToPublishCandidates)" />
\r
273 ============================================================
\r
275 Restores netcoreapp and publishes it to a temp directory
\r
276 ============================================================
\r
279 <Target Name="_RestoreCrossgen"
\r
280 Condition="$(SkipOptimization) != 'true' ">
\r
281 <MSBuild Projects="$(_CrossProjFile)"
\r
283 Properties="RestoreGraphProjectInput=$(_CrossProjFile);"/>
\r
285 <ResolvePublishAssemblies ProjectPath="$(_CrossProjFile)"
\r
286 AssetsFilePath="$(_CrossProjAssetsFile)"
\r
287 TargetFramework="$(_TFM)"
\r
288 RuntimeIdentifier="$(RuntimeIdentifier)"
\r
289 PlatformLibraryName="$(MicrosoftNETPlatformLibrary)"
\r
290 PrivateAssetsPackageReferences="@(PrivateAssetsPackageReference)"
\r
291 PreserveCacheLayout="false">
\r
293 <Output TaskParameter="AssembliesToPublish" ItemName="CrossgenResolvedAssembliesToPublish" />
\r
294 </ResolvePublishAssemblies>
\r
296 <!-- Copy managed files to a flat temp directory for passing it as ref for crossgen -->
\r
297 <Copy SourceFiles = "@(CrossgenResolvedAssembliesToPublish)"
\r
298 DestinationFolder="$(_NetCoreRefDir)"
\r
299 OverwriteReadOnlyFiles="$(OverwriteReadOnlyFiles)"
\r
300 Retries="$(CopyRetryCount)"
\r
301 RetryDelayMilliseconds="$(CopyRetryDelayMilliseconds)"
\r
302 UseHardlinksIfPossible="$(CreateHardLinksForPublishFilesIfPossible)"
\r
303 UseSymboliclinksIfPossible="$(CreateSymbolicLinksForPublishFilesIfPossible)">
\r
305 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
\r