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