* Makefile: Create dir for WebApplication.targets .
[mono.git] / mcs / tools / xbuild / xbuild / Microsoft.Common.targets
1 <Project DefaultTargets="Build" InitialTargets="_ValidateEssentialProperties" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
2
3         <PropertyGroup>
4                 <TargetExt Condition="'$(OutputType)' == 'Winexe'">.exe</TargetExt>
5                 <TargetExt Condition="'$(OutputType)' == 'Exe'">.exe</TargetExt>
6                 <TargetExt Condition="'$(OutputType)' == 'Library'">.dll</TargetExt>
7                 <TargetExt Condition="'$(OutputType)' == 'Netmodule'">.netmodule</TargetExt>
8         </PropertyGroup>
9
10         <PropertyGroup>
11                 <ProjectDir Condition="'$(ProjectDir)' == ''">$(MSBuildProjectDirectory)\</ProjectDir>
12         </PropertyGroup>
13
14         <PropertyGroup>
15                 <AssemblyName Condition="'$(AssemblyName)' == ''">$(RootNamespace)</AssemblyName>
16                 <OutputPath Condition="'$(OutputPath)' != '' and !HasTrailingSlash('$(OutputPath)')">$(OutputPath)\</OutputPath> 
17                 <OutputPath Condition=" '$(Platform)'=='' and '$(Configuration)'=='' and '$(OutputPath)'=='' ">bin\Debug\</OutputPath>
18                 <WarningLevel Condition="'$(WarningLevel)' == ''" >2</WarningLevel>
19         </PropertyGroup>
20
21         <PropertyGroup>
22                 <OutDir Condition="'$(OutDir)' == ''">$(OutputPath)</OutDir>
23                 <OutDir Condition="'$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)')">$(OutDir)\</OutDir>
24
25                 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
26                 <ConfigurationName Condition="'$(ConfigurationName)' == ''">$(Configuration)</ConfigurationName>
27
28                 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
29                 <PlatformName Condition="'$(PlatformName)' == ''">$(Platform)</PlatformName>
30         </PropertyGroup>
31
32         <PropertyGroup>
33                 <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)' == ''">obj\</BaseIntermediateOutputPath>
34                 <CleanFile Condition="'$(CleanFile)'==''">$(MSBuildProjectFile).FilesWrittenAbsolute.txt</CleanFile>
35         </PropertyGroup>
36
37         <PropertyGroup Condition="'$(IntermediateOutputPath)' == ''">
38                 <IntermediateOutputPath Condition=" '$(PlatformName)' == 'AnyCPU'">$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
39                 <IntermediateOutputPath Condition=" '$(PlatformName)' != 'AnyCPU'">$(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\</IntermediateOutputPath>
40         </PropertyGroup>
41
42         <ItemGroup>
43                 <IntermediateAssembly Include="$(IntermediateOutputPath)$(AssemblyName)$(TargetExt)" />
44
45                 <!-- creating this as a item to use FullPath on it, to build TargetPath -->
46                 <_OutDirItem Include="$(OutDir)"/>
47         </ItemGroup>
48
49         <PropertyGroup>
50                 <TargetPath>@(_OutDirItem->'%(FullPath)\$(AssemblyName)$(TargetExt)')</TargetPath>
51         </PropertyGroup>
52
53         <Target Name="_ValidateEssentialProperties">
54                 <!-- If OutDir is specified via the command line, then the earlier check
55                      to add a trailing slash won't have any affect, so error here. -->
56                 <Error
57                         Condition="'$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)')"
58                         Text="OutDir property must end with a slash."/>
59         </Target>
60
61         <Target Name="PrepareForBuild">
62                 <Message Importance="High" Text="Configuration: $(Configuration) Platform: $(Platform)"/>
63
64                 <MakeDir 
65                         Directories="$(OutDir);$(IntermediateOutputPath)"
66                 />
67
68                 <GetFrameworkPath>
69                         <Output TaskParameter="Path" PropertyName="TargetFrameworkPath"/>
70                 </GetFrameworkPath>
71         </Target>
72
73         <PropertyGroup>
74                 <AllowedReferenceAssemblyFileExtensions Condition=" '$(AllowedReferenceAssemblyFileExtensions)' == '' ">
75                         .exe;
76                         .dll
77                 </AllowedReferenceAssemblyFileExtensions>
78
79                 <AllowedReferenceRelatedFileExtensions Condition=" '$(AllowedReferenceRelatedFileExtensions)' == '' ">
80                         .mdb
81                 </AllowedReferenceRelatedFileExtensions>
82
83                 <AssemblySearchPaths Condition="'$(AssemblySearchPaths)' == ''">
84                         {CandidateAssemblyFiles};
85                         {HintPathFromItem};
86                         {TargetFrameworkDirectory};
87                         {PkgConfig};
88                         {GAC};
89                         {RawFileName};
90                         $(OutDir)
91                 </AssemblySearchPaths>
92
93                 <ResolveReferencesDependsOn>
94                         BeforeResolveReferences;
95                         ResolveProjectReferences;
96                         ResolveAssemblyReferences;
97                         AfterResolveReferences
98                 </ResolveReferencesDependsOn>
99         </PropertyGroup>
100
101         <Target Name="ResolveReferences" DependsOnTargets="$(ResolveReferencesDependsOn)"/>
102
103         <Target Name="BeforeResolveReferences" />
104         <Target Name="AfterResolveReferences" />
105
106         <Target Name="ResolveAssemblyReferences">
107                 <ResolveAssemblyReference
108                         Assemblies="@(Reference)"
109                         AssemblyFiles="@(ChildProjectReferences)"
110                         SearchPaths="$(AssemblySearchPaths)"
111                         CandidateAssemblyFiles="@(Content);@(None)"
112                         TargetFrameworkDirectories="$(TargetFrameworkPath)"
113                         AllowedAssemblyExtensions="$(AllowedReferenceAssemblyFileExtensions)"
114                         AllowedRelatedFileExtensions="$(AllowedReferenceRelatedFileExtensions)"
115                         FindDependencies="true"
116                         FindSatellites="true"
117                         FindRelatedFiles="true"
118                 >
119                         <Output TaskParameter="ResolvedFiles" ItemName="ResolvedFiles"/>
120                         <Output TaskParameter="ResolvedFiles" ItemName="ReferencePath"/>
121                         <Output TaskParameter="ResolvedDependencyFiles" ItemName="_ResolveAssemblyReferenceResolvedFiles"/>
122                         <Output TaskParameter="RelatedFiles" ItemName="_ReferenceRelatedPaths"/>
123                         <Output TaskParameter="SatelliteFiles" ItemName="ReferenceSatellitePaths"/>
124                         <Output TaskParameter="CopyLocalFiles" ItemName="ReferenceCopyLocalPaths"/>
125                 </ResolveAssemblyReference>
126         </Target>
127
128         <Target
129                 Name="AssignProjectConfigurations"
130                 Condition="'@(ProjectReference)' != ''">
131
132                 <!-- assign configs if building a solution file -->
133                 <AssignProjectConfiguration
134                         ProjectReferences = "@(ProjectReference)"
135                         SolutionConfigurationContents = "$(CurrentSolutionConfigurationContents)"
136                         Condition="'$(BuildingSolutionFile)' == 'true'">
137
138                         <Output TaskParameter = "AssignedProjects" ItemName = "ProjectReferenceWithConfiguration"/>
139                 </AssignProjectConfiguration>
140
141                 <!-- Else, just -->
142                 <CreateItem Include="@(ProjectReference)" Condition="'$(BuildingSolutionFile)' != 'true'">
143                         <Output TaskParameter="Include" ItemName="ProjectReferenceWithConfiguration"/>
144                 </CreateItem>
145
146         </Target>
147
148
149         <Target
150                 Name="ResolveProjectReferences"
151                 DependsOnTargets="AssignProjectConfigurations"
152         >
153                 <!-- If building from a .sln.proj or from IDE, then referenced projects have already
154                      been built, so just get the target paths -->
155                 <MSBuild
156                         Projects="@(ProjectReferenceWithConfiguration)"
157                         Targets="GetTargetPath"
158                         Properties="%(ProjectReferenceWithConfiguration.SetConfiguration); %(ProjectReferenceWithConfiguration.SetPlatform)"
159                         Condition="'@(ProjectReferenceWithConfiguration)' != '' and ('$(BuildingSolutionFile)' == 'true' or '$(BuildingInsideVisualStudio)' == 'true')">
160
161                         <Output TaskParameter="TargetOutputs" ItemName="ChildProjectReferences" />
162                 </MSBuild>
163
164                 <!-- Building a project directly, build the referenced the projects also -->
165                 <MSBuild
166                         Projects="@(ProjectReferenceWithConfiguration)"
167                         Properties="%(ProjectReferenceWithConfiguration.SetConfiguration); %(ProjectReferenceWithConfiguration.SetPlatform)"
168                         Condition="'@(ProjectReferenceWithConfiguration)' != '' and '$(BuildingSolutionFile)' != 'true' and '$(BuildingInsideVisualStudio)' != 'true' ">
169
170                         <Output TaskParameter="TargetOutputs" ItemName="ChildProjectReferences" />
171                 </MSBuild>
172         </Target>
173
174         <Target Name = "CopyFilesMarkedCopyLocal">
175                 <Copy
176                         SourceFiles="@(ReferenceCopyLocalPaths)"
177                         DestinationFiles="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')"
178                         SkipUnchangedFiles="true">
179                         <Output TaskParameter = "DestinationFiles" ItemName = "FileWrites"/>
180                 </Copy>
181         </Target>
182
183 <!--
184         Not needed at the moment
185         <Target Name="_ComputeNonExistentFileProperty" Condition='false'>
186                 <CreateProperty Value="__NonExistentSubDir__\__NonExistentFile__">
187                         <Output TaskParameter="Value" PropertyName="NonExistentFile"/>
188                 </CreateProperty>
189         </Target>
190 -->
191
192         <PropertyGroup>
193                 <BuildDependsOn>
194                         _ValidateEssentialProperties;
195                         BeforeBuild;
196                         CoreBuild;
197                         AfterBuild
198                 </BuildDependsOn>
199         </PropertyGroup>
200
201         <Target Name="BeforeBuild"/>
202         <Target Name="AfterBuild"/>
203
204         <Target Name="Build" DependsOnTargets="$(BuildDependsOn)" Outputs="$(TargetPath)"/>
205
206         <PropertyGroup>
207                 <CoreBuildDependsOn>
208                         PrepareForBuild;
209                         PreBuildEvent;
210                         ResolveReferences;
211                         CopyFilesMarkedCopyLocal;
212                         BuildResources;
213                         Compile;
214                         PrepareForRun;
215                         DeployOutputFiles;
216                         _RecordCleanFile;
217                         PostBuildEvent
218                 </CoreBuildDependsOn>
219         </PropertyGroup>
220
221         <Target
222                 Name="CoreBuild"
223                 DependsOnTargets="$(CoreBuildDependsOn)"
224                 Outputs="$(OutDir)$(AssemblyName)$(TargetExt)">
225
226                 <OnError ExecuteTargets="_TimestampAfterCompile;PostBuildEvent"
227                         Condition=" '$(RunPostBuildEvent)' == 'Always' or '$(RunPostBuildEvent)' == 'OnOutputUpdated'"/>
228         </Target>
229
230         <PropertyGroup>
231                 <CompileDependsOn>
232                         ResolveReferences;
233                         BeforeCompile;
234                         _TimestampBeforeCompile;
235                         CoreCompile;
236                         _TimestampAfterCompile;
237                         AfterCompile
238                 </CompileDependsOn>
239         </PropertyGroup>
240
241         <Target Name="BeforeCompile" />
242         <Target Name="AfterCompile" />
243
244         <Target Name="Compile" DependsOnTargets="$(CompileDependsOn)"/>
245
246         <PropertyGroup>
247                 <PrepareForRunDependsOn>
248                         DeployOutputFiles
249                 </PrepareForRunDependsOn>
250         </PropertyGroup>
251         <Target Name="PrepareForRun" DependsOnTargets="$(PrepareForRunDependsOn)"/>
252
253         <Target Name="BuildResources"
254                 DependsOnTargets="AssignTargetPaths;SplitResourcesByCulture;CreateManifestResourceNames;CopyNonResxEmbeddedResources;GenerateResources;GenerateSatelliteAssemblies">
255         </Target>
256
257         <Target Name="SplitResourcesByCulture" DependsOnTargets="AssignTargetPaths">
258                 <AssignCulture Files="@(EmbeddedResourceWithTargetPath)">
259                         <Output TaskParameter="AssignedFilesWithNoCulture" ItemName="ResourcesWithNoCulture"/>
260                         <Output TaskParameter="AssignedFilesWithCulture" ItemName="ResourcesWithCulture"/>
261                 </AssignCulture>
262
263                 <CreateItem Include="@(ResourcesWithNoCulture)" Condition="'%(Extension)' == '.resx'">
264                         <Output TaskParameter="Include" ItemName="ResxWithNoCulture"/>
265                 </CreateItem>
266
267                 <CreateItem Include="@(ResourcesWithNoCulture)" Condition="'%(Extension)' != '.resx'">
268                         <Output TaskParameter="Include" ItemName="NonResxWithNoCulture"/>
269                 </CreateItem>
270
271                 <CreateItem Include="@(ResourcesWithCulture)" Condition="'%(Extension)' == '.resx'">
272                         <Output TaskParameter="Include" ItemName="ResxWithCulture"/>
273                 </CreateItem>
274
275                 <CreateItem Include="@(ResourcesWithCulture)" Condition="'%(Extension)' != '.resx'">
276                         <Output TaskParameter="Include" ItemName="NonResxWithCulture"/>
277                 </CreateItem>
278         </Target>
279
280         <!-- Copy non-resx resources to their manifest resource names, this is what the compiler expects -->
281         <Target Name = "CopyNonResxEmbeddedResources"
282                 Condition = "'@(NonResxWithCulture)' != '' or '@(NonResxWithNoCulture)' != '' or '@(ManifestNonResxWithCulture)' != '' or '@(ManifestNonResxWithNoCulture)' != ''">
283
284                 <MakeDir Directories="$(IntermediateOutputPath)%(ManifestNonResxWithCulture.Culture)"/>
285                 <Copy SourceFiles = "@(NonResxWithCulture)"
286                         DestinationFiles = "@(ManifestNonResxWithCulture->'$(IntermediateOutputPath)%(Identity)')"
287                         SkipUnchangedFiles="true">
288                         <Output TaskParameter = "DestinationFiles" ItemName = "ManifestNonResxWithCultureOnDisk"/>
289                         <Output TaskParameter = "DestinationFiles" ItemName = "FileWrites"/>
290                 </Copy>
291
292                 <Copy SourceFiles = "@(NonResxWithNoCulture)"
293                         DestinationFiles = "@(ManifestNonResxWithNoCulture->'$(IntermediateOutputPath)%(Identity)')"
294                         SkipUnchangedFiles="true">
295                         <Output TaskParameter = "DestinationFiles" ItemName = "ManifestNonResxWithNoCultureOnDisk"/>
296                         <Output TaskParameter = "DestinationFiles" ItemName = "FileWrites"/>
297                 </Copy>
298         </Target>
299
300         <Target Name = "GenerateResources">
301                 <GenerateResource
302                         Sources = "@(ResxWithNoCulture)"
303                         UseSourcePath = "true"
304                         OutputResources = "@(ManifestResourceWithNoCultureName->'$(IntermediateOutputPath)%(Identity).resources')"
305                         Condition = "'@(ResxWithNoCulture)' != '' ">
306
307                         <Output TaskParameter = "OutputResources" ItemName = "ManifestResourceWithNoCulture"/>
308                         <Output TaskParameter = "FilesWritten" ItemName = "FileWrites"/>
309                 </GenerateResource>
310
311                 <GenerateResource
312                         Sources = "@(ResxWithCulture)"
313                         UseSourcePath = "true"
314                         OutputResources = "@(ManifestResourceWithCultureName->'$(IntermediateOutputPath)%(Identity).resources')"
315                         Condition = "'@(ResxWithCulture)' != '' ">
316
317                         <Output TaskParameter = "OutputResources" ItemName = "ManifestResourceWithCulture"/>
318                         <Output TaskParameter = "FilesWritten" ItemName = "FileWrites"/>
319                 </GenerateResource>
320         </Target>
321
322         <Target Name="GenerateSatelliteAssemblies"
323                 Inputs="@(ManifestResourceWithCulture);@(ManifestNonResxWithCultureOnDisk)"
324                 Outputs="$(IntermediateOutputPath)%(Culture)\$(AssemblyName).resources.dll" >
325                 <!-- @(NonResxWithCulture) - rename files to ManifestNon.. and then use for AL -->
326                 <MakeDir Directories = "$(IntermediateOutputPath)%(ManifestResourceWithCulture.Culture)" Condition = "'@(ManifestResourceWithCulture)' != ''" />
327                 <MakeDir Directories = "$(IntermediateOutputPath)%(ManifestNonResxWithCultureOnDisk.Culture)" Condition = "'@(ManifestNonResxWithCultureOnDisk)' != ''" />
328
329                 <AL
330                         Culture = "%(Culture)"
331                         EmbedResources = "@(ManifestResourceWithCulture);@(ManifestNonResxWithCultureOnDisk)"
332                         OutputAssembly = "$(IntermediateOutputPath)%(Culture)\$(AssemblyName).resources.dll" >
333                         <Output TaskParameter="OutputAssembly" ItemName="FileWrites"/>
334                 </AL>
335
336
337                 <CreateItem
338                         Include = "$(IntermediateOutputPath)%(Culture)\$(AssemblyName).resources.dll"
339                         AdditionalMetadata = "Culture=%(Culture)"
340                         Condition = "'@(ManifestResourceWithCulture)' != '' or '@(ManifestNonResxWithCultureOnDisk)' != ''">
341                         <Output TaskParameter = "Include" ItemName = "IntermediateSatelliteAssemblies" />
342                 </CreateItem>
343         </Target>
344
345         <!-- Assign target paths to files that will need to be copied along with the project -->
346         <Target Name = "AssignTargetPaths">
347                 <AssignTargetPath Files="@(None)" RootFolder="$(MSBuildProjectDirectory)">
348                         <Output TaskParameter="AssignedFiles" ItemName="NoneWithTargetPath"/>
349                 </AssignTargetPath>
350
351                 <AssignTargetPath Files="@(Content)" RootFolder="$(MSBuildProjectDirectory)">
352                         <Output TaskParameter="AssignedFiles" ItemName="ContentWithTargetPath"/>
353                 </AssignTargetPath>
354
355                 <AssignTargetPath Files="@(EmbeddedResource)" RootFolder="$(MSBuildProjectDirectory)">
356                         <Output TaskParameter="AssignedFiles" ItemName="EmbeddedResourceWithTargetPath"/>
357                 </AssignTargetPath>
358         </Target>
359
360         <Target Name="DeployOutputFiles"
361                 DependsOnTargets="BuildResources;CoreCompile;_CopyDeployFilesToOutputDirectory">
362
363                 <Copy 
364                         SourceFiles="$(IntermediateOutputPath)$(AssemblyName)$(TargetExt).mdb"
365                         Condition="Exists('$(IntermediateOutputPath)$(AssemblyName)$(TargetExt).mdb')"
366                         DestinationFolder="$(OutDir)"
367                         SkipUnchangedFiles="true" >
368                         <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
369                 </Copy>
370
371                 <Copy SourceFiles="@(IntermediateAssembly)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true">
372                         <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
373                 </Copy>
374
375                 <Copy
376                         SourceFiles = "@(IntermediateSatelliteAssemblies)"
377                         DestinationFiles = "@(IntermediateSatelliteAssemblies->'$(OutDir)\%(Culture)\$(AssemblyName).resources.dll')"
378                         Condition = "'@(IntermediateSatelliteAssemblies)' != ''"
379                         SkipUnchangedFiles="true">
380                         <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
381                 </Copy>
382         </Target>
383
384         <Target Name="_CopyDeployFilesToOutputDirectory"
385                 DependsOnTargets="GetCopyToOutputDirectoryItems;
386                         _CopyDeployFilesToOutputDirectoryToOutputDirectoryAlways;
387                         CopyDeployFilesToOutputDirectoryPreserveNewest"/>
388
389         <Target Name="CopyDeployFilesToOutputDirectoryPreserveNewest"
390                 Condition="'@(ItemsToCopyToOutputDirectoryPreserveNewest)' != ''"
391                 Inputs="@(ItemsToCopyToOutputDirectoryPreserveNewest)"
392                 Outputs="@(ItemsToCopyToOutputDirectoryPreserveNewest->'$(OutDir)%(TargetPath)')">
393
394                 <Copy SourceFiles="@(ItemsToCopyToOutputDirectoryPreserveNewest)"
395                         DestinationFiles="@(ItemsToCopyToOutputDirectoryPreserveNewest->'$(OutDir)%(TargetPath)')">
396                         <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
397                 </Copy>
398         </Target>
399
400         <!-- Copy if newer -->
401         <Target Name="_CopyDeployFilesToOutputDirectoryToOutputDirectoryAlways"
402                 Condition="'@(ItemsToCopyToOutputDirectoryAlways)' != ''">
403
404                 <Copy SourceFiles="@(ItemsToCopyToOutputDirectoryAlways)"
405                         DestinationFiles="@(ItemsToCopyToOutputDirectoryAlways->'$(OutDir)%(TargetPath)')">
406                         <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
407                 </Copy>
408         </Target>
409
410         <Target Name="GetTargetPath" Outputs="$(TargetPath)"/>
411
412         <Target Name="GetCopyToOutputDirectoryItems"
413                 Outputs="@(AllItemsFullPathWithTargetPath)"
414                 DependsOnTargets="AssignTargetPaths">
415
416                 <!-- FIXME: handle .vcproj -->
417                 <MSBuild
418                         Projects="@(ProjectReference)"
419                         Targets="GetCopyToOutputDirectoryItems"
420                         Condition="'@(ProjectReference)' != ''">
421
422                         <Output TaskParameter="TargetOutputs" ItemName="AllChildProjectItemsWithTargetPath"/>
423                 </MSBuild>
424
425                 <!-- Process items from child project. The outputs need to have full path
426                      as they'll be used from other projects -->
427
428                 <CreateItem
429                         Include="@(AllChildProjectItemsWithTargetPath->'%(FullPath)')"
430                         Condition="'%(AllChildProjectItemsWithTargetPath.CopyToOutputDirectory)' == 'Always' or '%(AllChildProjectItemsWithTargetPath.CopyToOutputDirectory)' == 'PreserveNewest'">
431
432                         <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
433                         <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryAlways"
434                                 Condition="'%(AllChildProjectItemsWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
435                         <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryPreserveNewest"
436                                 Condition="'%(AllChildProjectItemsWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
437
438                 </CreateItem>
439
440                 <!-- Process _this_ project's items -->
441
442                 <CreateItem
443                         Include="@(NoneWithTargetPath->'%(FullPath)')"
444                         Condition="'%(NoneWithTargetPath.CopyToOutputDirectory)' == 'Always' or '%(NoneWithTargetPath.CopyToOutputDirectory)' == 'PreserveNewest'">
445                         <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
446                         <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryAlways"
447                                 Condition="'%(NoneWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
448                         <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryPreserveNewest"
449                                 Condition="'%(NoneWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
450                 </CreateItem>
451
452                 <CreateItem
453                         Include="@(ContentWithTargetPath->'%(FullPath)')"
454                         Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)' == 'Always' or '%(ContentWithTargetPath.CopyToOutputDirectory)' == 'PreserveNewest'">
455                         <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
456                         <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryAlways"
457                                 Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
458                         <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryPreserveNewest"
459                                 Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
460                 </CreateItem>
461
462                 <CreateItem
463                         Include="@(EmbeddedResourceWithTargetPath->'%(FullPath)')"
464                         Condition="'%(EmbeddedResourceWithTargetPath.CopyToOutputDirectory)' == 'Always' or '%(EmbeddedResourceWithTargetPath.CopyToOutputDirectory)' == 'PreserveNewest'">
465                         <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
466                         <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryAlways"
467                                 Condition="'%(EmbeddedResourceWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
468                         <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryPreserveNewest"
469                                 Condition="'%(EmbeddedResourceWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
470                 </CreateItem>
471
472         </Target>
473
474         <!-- Pre/Post BuildEvents -->
475         <PropertyGroup>
476                 <PreBuildEventDependsOn />
477         </PropertyGroup>
478
479         <Target Name="PreBuildEvent"
480                 Condition="'$(PreBuildEvent)' != ''"
481                 DependsOnTargets="$(PreBuildEventDependsOn)">
482
483                 <Exec WorkingDirectory="$(OutDir)" Command="$(PreBuildEvent)" />
484         </Target>
485
486         <!-- PostBuildEvent depends on $(RunPostBuildEvent)
487
488                 Default: OnBuildSuccess
489                 OnBuildSuccess: Run after a successful build
490                 OnOutputUpdated: Run only if the output assembly got updates
491                 Always: Run always
492         -->
493         <PropertyGroup>
494                 <PostBuildEventDependsOn />
495         </PropertyGroup>
496
497         <!-- this gets invoked in two cases, from CoreBuildDependsOn, if the build completes
498              successfully, OR from OnError in CoreBuild, if the build failed and $(RunPostBuildEvent)
499              is 'Always' or 'OnOutputUpdated' -->
500         <Target Name="PostBuildEvent"
501                 Condition="'$(PostBuildEvent)' != '' and
502                         ('$(RunPostBuildEvent)' == 'Always' or '$(RunPostBuildEvent)' == 'OnBuildSuccess' or
503                           ('$(RunPostBuildEvent)' == 'OnOutputUpdated' and
504                             '$(_AssemblyModifiedTimeBeforeCompile)' != '$(_AssemblyModifiedTimeAfterCompile)')
505                         )"
506                 DependsOnTargets="$(PostBuildEventDependsOn)">
507
508                 <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" />
509         </Target>
510
511         <!-- Timestamp the output assemblies, required for PostBuildEvent -->
512         <Target Name="_TimestampBeforeCompile" Condition="'$(RunPostBuildEvent)' == 'OnOutputUpdated'">
513                 <CreateItem Include="%(IntermediateAssembly.ModifiedTime)">
514                         <Output TaskParameter="Include" PropertyName="_AssemblyModifiedTimeBeforeCompile" />
515                 </CreateItem>
516         </Target>
517         <Target Name="_TimestampAfterCompile" Condition="'$(RunPostBuildEvent)' == 'OnOutputUpdated'">
518                 <CreateItem Include="%(IntermediateAssembly.ModifiedTime)">
519                         <Output TaskParameter="Include" PropertyName="_AssemblyModifiedTimeAfterCompile" />
520                 </CreateItem>
521         </Target>
522
523         <!-- Rebuild -->
524         <PropertyGroup>
525                 <RebuildDependsOn>
526                         BeforeRebuild;
527                         Clean;
528                         $(MSBuildProjectDefaultTargets);
529                         AfterRebuild;
530                 </RebuildDependsOn>
531
532                 <RebuildDependsOn Condition="'$(MSBuildProjectDefaultTargets)' == 'Rebuild'">
533                         BeforeRebuild;
534                         Clean;
535                         Build;
536                         AfterRebuild;
537                 </RebuildDependsOn>
538         </PropertyGroup>
539
540         <Target Name="BeforeRebuild" />
541         <Target Name="AfterRebuild" />
542
543         <Target Name="Rebuild"
544                 DependsOnTargets="$(RebuildDependsOn)"
545                 Outputs="$(TargetPath)"/>
546
547         <!-- Clean -->
548         <Target Name="_RecordCleanFile"
549                 DependsOnTargets="_GetCompileOutputsForClean">
550                 <WriteLinesToFile
551                         File="$(BaseIntermediateOutputPath)$(CleanFile)"
552                         Lines="@(FileWrites->'%(FullPath)')"
553                         Overwrite="true"/>
554         </Target>
555
556         <PropertyGroup>
557                 <CleanDependsOn>
558                         BeforeClean;
559                         CleanReferencedProjects;
560                         CoreClean;
561                         AfterClean
562                 </CleanDependsOn>
563         </PropertyGroup>
564
565         <Target Name="_GetCompileOutputsForClean">
566                 <CreateItem Include="@(IntermediateAssembly)" Condition="Exists('@(IntermediateAssembly)')">
567                         <Output TaskParameter="Include" ItemName="FileWrites"/>
568                 </CreateItem>
569
570                 <CreateItem Include="$(IntermediateOutputPath)$(AssemblyName)$(TargetExt).mdb"
571                         Condition="Exists('$(IntermediateOutputPath)$(AssemblyName)$(TargetExt).mdb')">
572                         <Output TaskParameter="Include" ItemName="FileWrites"/>
573                 </CreateItem>
574         </Target>
575
576         <!-- Get the list of files written, for clean -->
577         <Target Name="_GetCleanFileWrites"
578                 DependsOnTargets="_GetCompileOutputsForClean">
579                 <ReadLinesFromFile File="$(BaseIntermediateOutputPath)$(CleanFile)">
580                         <Output TaskParameter="Lines" ItemName="FileWrites"/>
581                 </ReadLinesFromFile>
582         </Target>
583
584         <Target Name="CleanReferencedProjects"
585                 DependsOnTargets="AssignProjectConfigurations">
586
587                 <!-- If building from .sln.proj or from IDE, clean will get handled by them,
588                      else we are building a project directly, from the command line, so
589                      clean the referenced projects -->
590                 <MSBuild Projects="@(ProjectReferenceWithConfiguration)"
591                         Targets="Clean"
592                         Condition=" '$(BuildingSolutionFile)' != 'true' and '$(BuildingInsideVisualStudio)' != 'true' and '@(ProjectReferenceWithConfiguration)' != ''" />
593
594         </Target>
595
596         <Target Name="Clean" DependsOnTargets="$(CleanDependsOn)"/>
597
598         <!-- Override in project to run before/after clean tasks -->
599         <Target Name="BeforeClean" />
600         <Target Name="AfterClean" />
601
602         <Target Name="CoreClean" DependsOnTargets="_GetCleanFileWrites">
603                 <Delete Files="@(FileWrites)" TreatErrorsAsWarnings="true"/>
604         </Target>
605
606 </Project>