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