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