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