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