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