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