1 <Project DefaultTargets="Build" InitialTargets="_ValidateEssentialProperties" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
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>
11 <ProjectDir Condition="'$(ProjectDir)' == ''">$(MSBuildProjectDirectory)\</ProjectDir>
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>
22 <OutDir Condition="'$(OutDir)' == ''">$(OutputPath)</OutDir>
23 <OutDir Condition="'$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)')">$(OutDir)\</OutDir>
25 <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
26 <ConfigurationName Condition="'$(ConfigurationName)' == ''">$(Configuration)</ConfigurationName>
28 <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
29 <PlatformName Condition="'$(PlatformName)' == ''">$(Platform)</PlatformName>
33 <BaseIntermediateOutputPath Condition="'$(BaseIntermediateOutputPath)' == ''">obj\</BaseIntermediateOutputPath>
34 <CleanFile Condition="'$(CleanFile)'==''">$(MSBuildProjectFile).FilesWrittenAbsolute.txt</CleanFile>
37 <PropertyGroup Condition="'$(IntermediateOutputPath)' == ''">
38 <IntermediateOutputPath Condition=" '$(PlatformName)' == 'AnyCPU'">$(BaseIntermediateOutputPath)$(Configuration)\</IntermediateOutputPath>
39 <IntermediateOutputPath Condition=" '$(PlatformName)' != 'AnyCPU'">$(BaseIntermediateOutputPath)$(PlatformName)\$(Configuration)\</IntermediateOutputPath>
43 <IntermediateAssembly Include="$(IntermediateOutputPath)$(AssemblyName)$(TargetExt)" />
45 <!-- creating this as a item to use FullPath on it, to build TargetPath -->
46 <_OutDirItem Include="$(OutDir)"/>
50 <TargetName Condition="'$(TargetName)' == '' ">$(AssemblyName)</TargetName>
51 <TargetFileName Condition="'$(TargetFileName)' == '' ">$(TargetName)$(TargetExt)</TargetFileName>
52 <TargetPath>@(_OutDirItem->'%(FullPath)\$(TargetFileName)')</TargetPath>
55 <Target Name="_ValidateEssentialProperties">
56 <!-- If OutDir is specified via the command line, then the earlier check
57 to add a trailing slash won't have any affect, so error here. -->
59 Condition="'$(OutDir)' != '' and !HasTrailingSlash('$(OutDir)')"
60 Text="OutDir property must end with a slash."/>
63 <Target Name="PrepareForBuild">
64 <Message Importance="High" Text="Configuration: $(Configuration) Platform: $(Platform)"/>
66 <!-- Look for app.config, if $(AppConfig) is specified, then use that. Else look in
67 @(None) and @(Content) -->
68 <CreateItem Include="$(AppConfig)" Condition="'$(AppConfig)' != ''"
69 AdditionalMetadata="TargetPath=$(TargetFileName).config">
70 <Output TaskParameter="Include" ItemName="AppConfigWithTargetPath" />
73 <FindAppConfigFile PrimaryList="@(None)" SecondaryList="@(Content)" TargetPath="$(TargetFileName).config"
74 Condition="'$(AppConfig)' == ''">
75 <Output TaskParameter="AppConfigFile" ItemName="AppConfigWithTargetPath"/>
79 Directories="$(OutDir);$(IntermediateOutputPath)"
83 <Output TaskParameter="Path" PropertyName="TargetFrameworkPath"/>
88 <AllowedReferenceAssemblyFileExtensions Condition=" '$(AllowedReferenceAssemblyFileExtensions)' == '' ">
91 </AllowedReferenceAssemblyFileExtensions>
93 <AllowedReferenceRelatedFileExtensions Condition=" '$(AllowedReferenceRelatedFileExtensions)' == '' ">
95 </AllowedReferenceRelatedFileExtensions>
97 <AssemblySearchPaths Condition="'$(AssemblySearchPaths)' == ''">
98 {CandidateAssemblyFiles};
100 {TargetFrameworkDirectory};
105 </AssemblySearchPaths>
107 <ResolveReferencesDependsOn>
108 BeforeResolveReferences;
109 ResolveProjectReferences;
110 ResolveAssemblyReferences;
111 AfterResolveReferences
112 </ResolveReferencesDependsOn>
115 <Target Name="ResolveReferences" DependsOnTargets="$(ResolveReferencesDependsOn)"/>
117 <Target Name="BeforeResolveReferences" />
118 <Target Name="AfterResolveReferences" />
120 <Target Name="ResolveAssemblyReferences">
121 <ResolveAssemblyReference
122 Assemblies="@(Reference)"
123 AssemblyFiles="@(ChildProjectReferences)"
124 SearchPaths="$(AssemblySearchPaths)"
125 CandidateAssemblyFiles="@(Content);@(None)"
126 TargetFrameworkDirectories="$(TargetFrameworkPath)"
127 AllowedAssemblyExtensions="$(AllowedReferenceAssemblyFileExtensions)"
128 AllowedRelatedFileExtensions="$(AllowedReferenceRelatedFileExtensions)"
129 FindDependencies="true"
130 FindSatellites="true"
131 FindRelatedFiles="true"
133 <Output TaskParameter="ResolvedFiles" ItemName="ResolvedFiles"/>
134 <Output TaskParameter="ResolvedFiles" ItemName="ReferencePath"/>
135 <Output TaskParameter="ResolvedDependencyFiles" ItemName="_ResolveAssemblyReferenceResolvedFiles"/>
136 <Output TaskParameter="RelatedFiles" ItemName="_ReferenceRelatedPaths"/>
137 <Output TaskParameter="SatelliteFiles" ItemName="ReferenceSatellitePaths"/>
138 <Output TaskParameter="CopyLocalFiles" ItemName="ReferenceCopyLocalPaths"/>
139 </ResolveAssemblyReference>
143 Name="AssignProjectConfigurations"
144 Condition="'@(ProjectReference)' != ''">
146 <!-- assign configs if building a solution file -->
147 <AssignProjectConfiguration
148 ProjectReferences = "@(ProjectReference)"
149 SolutionConfigurationContents = "$(CurrentSolutionConfigurationContents)"
150 Condition="'$(BuildingSolutionFile)' == 'true'">
152 <Output TaskParameter = "AssignedProjects" ItemName = "ProjectReferenceWithConfiguration"/>
153 </AssignProjectConfiguration>
156 <CreateItem Include="@(ProjectReference)" Condition="'$(BuildingSolutionFile)' != 'true'">
157 <Output TaskParameter="Include" ItemName="ProjectReferenceWithConfiguration"/>
164 Name="ResolveProjectReferences"
165 DependsOnTargets="AssignProjectConfigurations"
167 <!-- If building from a .sln.proj or from IDE, then referenced projects have already
168 been built, so just get the target paths -->
170 Projects="@(ProjectReferenceWithConfiguration)"
171 Targets="GetTargetPath"
172 Properties="%(ProjectReferenceWithConfiguration.SetConfiguration); %(ProjectReferenceWithConfiguration.SetPlatform)"
173 Condition="'@(ProjectReferenceWithConfiguration)' != '' and ('$(BuildingSolutionFile)' == 'true' or '$(BuildingInsideVisualStudio)' == 'true')">
175 <Output TaskParameter="TargetOutputs" ItemName="ChildProjectReferences" />
178 <!-- Building a project directly, build the referenced the projects also -->
180 Projects="@(ProjectReferenceWithConfiguration)"
181 Properties="%(ProjectReferenceWithConfiguration.SetConfiguration); %(ProjectReferenceWithConfiguration.SetPlatform)"
182 Condition="'@(ProjectReferenceWithConfiguration)' != '' and '$(BuildingSolutionFile)' != 'true' and '$(BuildingInsideVisualStudio)' != 'true' ">
184 <Output TaskParameter="TargetOutputs" ItemName="ChildProjectReferences" />
188 <Target Name = "CopyFilesMarkedCopyLocal">
190 SourceFiles="@(ReferenceCopyLocalPaths)"
191 DestinationFiles="@(ReferenceCopyLocalPaths->'$(OutDir)%(DestinationSubDirectory)%(Filename)%(Extension)')"
192 SkipUnchangedFiles="true">
193 <Output TaskParameter = "DestinationFiles" ItemName = "FileWrites"/>
198 Not needed at the moment
199 <Target Name="_ComputeNonExistentFileProperty" Condition='false'>
200 <CreateProperty Value="__NonExistentSubDir__\__NonExistentFile__">
201 <Output TaskParameter="Value" PropertyName="NonExistentFile"/>
208 _ValidateEssentialProperties;
215 <Target Name="BeforeBuild"/>
216 <Target Name="AfterBuild"/>
218 <Target Name="Build" DependsOnTargets="$(BuildDependsOn)" Outputs="$(TargetPath)"/>
225 CopyFilesMarkedCopyLocal;
232 </CoreBuildDependsOn>
237 DependsOnTargets="$(CoreBuildDependsOn)"
238 Outputs="$(OutDir)$(AssemblyName)$(TargetExt)">
240 <OnError ExecuteTargets="_TimestampAfterCompile;PostBuildEvent"
241 Condition=" '$(RunPostBuildEvent)' == 'Always' or '$(RunPostBuildEvent)' == 'OnOutputUpdated'"/>
248 _TimestampBeforeCompile;
250 _TimestampAfterCompile;
255 <Target Name="BeforeCompile" />
256 <Target Name="AfterCompile" />
258 <Target Name="Compile" DependsOnTargets="$(CompileDependsOn)"/>
261 <PrepareForRunDependsOn>
263 </PrepareForRunDependsOn>
265 <Target Name="PrepareForRun" DependsOnTargets="$(PrepareForRunDependsOn)"/>
267 <Target Name="BuildResources"
268 DependsOnTargets="AssignTargetPaths;SplitResourcesByCulture;CreateManifestResourceNames;CopyNonResxEmbeddedResources;GenerateResources;GenerateSatelliteAssemblies">
271 <Target Name="SplitResourcesByCulture" DependsOnTargets="AssignTargetPaths">
272 <AssignCulture Files="@(EmbeddedResourceWithTargetPath)">
273 <Output TaskParameter="AssignedFilesWithNoCulture" ItemName="ResourcesWithNoCulture"/>
274 <Output TaskParameter="AssignedFilesWithCulture" ItemName="ResourcesWithCulture"/>
277 <CreateItem Include="@(ResourcesWithNoCulture)" Condition="'%(Extension)' == '.resx'">
278 <Output TaskParameter="Include" ItemName="ResxWithNoCulture"/>
281 <CreateItem Include="@(ResourcesWithNoCulture)" Condition="'%(Extension)' != '.resx'">
282 <Output TaskParameter="Include" ItemName="NonResxWithNoCulture"/>
285 <CreateItem Include="@(ResourcesWithCulture)" Condition="'%(Extension)' == '.resx'">
286 <Output TaskParameter="Include" ItemName="ResxWithCulture"/>
289 <CreateItem Include="@(ResourcesWithCulture)" Condition="'%(Extension)' != '.resx'">
290 <Output TaskParameter="Include" ItemName="NonResxWithCulture"/>
294 <!-- Copy non-resx resources to their manifest resource names, this is what the compiler expects -->
295 <Target Name = "CopyNonResxEmbeddedResources"
296 Condition = "'@(NonResxWithCulture)' != '' or '@(NonResxWithNoCulture)' != '' or '@(ManifestNonResxWithCulture)' != '' or '@(ManifestNonResxWithNoCulture)' != ''">
298 <MakeDir Directories="$(IntermediateOutputPath)%(ManifestNonResxWithCulture.Culture)"/>
299 <Copy SourceFiles = "@(NonResxWithCulture)"
300 DestinationFiles = "@(ManifestNonResxWithCulture->'$(IntermediateOutputPath)%(Identity)')"
301 SkipUnchangedFiles="true">
302 <Output TaskParameter = "DestinationFiles" ItemName = "ManifestNonResxWithCultureOnDisk"/>
303 <Output TaskParameter = "DestinationFiles" ItemName = "FileWrites"/>
306 <Copy SourceFiles = "@(NonResxWithNoCulture)"
307 DestinationFiles = "@(ManifestNonResxWithNoCulture->'$(IntermediateOutputPath)%(Identity)')"
308 SkipUnchangedFiles="true">
309 <Output TaskParameter = "DestinationFiles" ItemName = "ManifestNonResxWithNoCultureOnDisk"/>
310 <Output TaskParameter = "DestinationFiles" ItemName = "FileWrites"/>
314 <Target Name = "GenerateResources">
316 Sources = "@(ResxWithNoCulture)"
317 UseSourcePath = "true"
318 OutputResources = "@(ManifestResourceWithNoCultureName->'$(IntermediateOutputPath)%(Identity).resources')"
319 Condition = "'@(ResxWithNoCulture)' != '' ">
321 <Output TaskParameter = "OutputResources" ItemName = "ManifestResourceWithNoCulture"/>
322 <Output TaskParameter = "FilesWritten" ItemName = "FileWrites"/>
326 Sources = "@(ResxWithCulture)"
327 UseSourcePath = "true"
328 OutputResources = "@(ManifestResourceWithCultureName->'$(IntermediateOutputPath)%(Identity).resources')"
329 Condition = "'@(ResxWithCulture)' != '' ">
331 <Output TaskParameter = "OutputResources" ItemName = "ManifestResourceWithCulture"/>
332 <Output TaskParameter = "FilesWritten" ItemName = "FileWrites"/>
336 <Target Name="GenerateSatelliteAssemblies"
337 Inputs="@(ManifestResourceWithCulture);@(ManifestNonResxWithCultureOnDisk)"
338 Outputs="$(IntermediateOutputPath)%(Culture)\$(AssemblyName).resources.dll" >
339 <!-- @(NonResxWithCulture) - rename files to ManifestNon.. and then use for AL -->
340 <MakeDir Directories = "$(IntermediateOutputPath)%(ManifestResourceWithCulture.Culture)" Condition = "'@(ManifestResourceWithCulture)' != ''" />
341 <MakeDir Directories = "$(IntermediateOutputPath)%(ManifestNonResxWithCultureOnDisk.Culture)" Condition = "'@(ManifestNonResxWithCultureOnDisk)' != ''" />
344 Culture = "%(Culture)"
345 EmbedResources = "@(ManifestResourceWithCulture);@(ManifestNonResxWithCultureOnDisk)"
346 OutputAssembly = "$(IntermediateOutputPath)%(Culture)\$(AssemblyName).resources.dll" >
347 <Output TaskParameter="OutputAssembly" ItemName="FileWrites"/>
352 Include = "$(IntermediateOutputPath)%(Culture)\$(AssemblyName).resources.dll"
353 AdditionalMetadata = "Culture=%(Culture)"
354 Condition = "'@(ManifestResourceWithCulture)' != '' or '@(ManifestNonResxWithCultureOnDisk)' != ''">
355 <Output TaskParameter = "Include" ItemName = "IntermediateSatelliteAssemblies" />
359 <!-- Assign target paths to files that will need to be copied along with the project -->
360 <Target Name = "AssignTargetPaths">
361 <AssignTargetPath Files="@(None)" RootFolder="$(MSBuildProjectDirectory)">
362 <Output TaskParameter="AssignedFiles" ItemName="NoneWithTargetPath"/>
365 <AssignTargetPath Files="@(Content)" RootFolder="$(MSBuildProjectDirectory)">
366 <Output TaskParameter="AssignedFiles" ItemName="ContentWithTargetPath"/>
369 <AssignTargetPath Files="@(EmbeddedResource)" RootFolder="$(MSBuildProjectDirectory)">
370 <Output TaskParameter="AssignedFiles" ItemName="EmbeddedResourceWithTargetPath"/>
374 <Target Name="DeployOutputFiles"
375 DependsOnTargets="BuildResources;CoreCompile;_CopyDeployFilesToOutputDirectory;_CopyAppConfigFile">
378 SourceFiles="$(IntermediateOutputPath)$(AssemblyName)$(TargetExt).mdb"
379 Condition="Exists('$(IntermediateOutputPath)$(AssemblyName)$(TargetExt).mdb')"
380 DestinationFolder="$(OutDir)"
381 SkipUnchangedFiles="true" >
382 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
385 <Copy SourceFiles="@(IntermediateAssembly)" DestinationFolder="$(OutDir)" SkipUnchangedFiles="true">
386 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
390 SourceFiles = "@(IntermediateSatelliteAssemblies)"
391 DestinationFiles = "@(IntermediateSatelliteAssemblies->'$(OutDir)\%(Culture)\$(AssemblyName).resources.dll')"
392 Condition = "'@(IntermediateSatelliteAssemblies)' != ''"
393 SkipUnchangedFiles="true">
394 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
398 <Target Name="_CopyDeployFilesToOutputDirectory"
399 DependsOnTargets="GetCopyToOutputDirectoryItems;
400 _CopyDeployFilesToOutputDirectoryToOutputDirectoryAlways;
401 CopyDeployFilesToOutputDirectoryPreserveNewest"/>
403 <Target Name="CopyDeployFilesToOutputDirectoryPreserveNewest"
404 Condition="'@(ItemsToCopyToOutputDirectoryPreserveNewest)' != ''"
405 Inputs="@(ItemsToCopyToOutputDirectoryPreserveNewest)"
406 Outputs="@(ItemsToCopyToOutputDirectoryPreserveNewest->'$(OutDir)%(TargetPath)')">
408 <Copy SourceFiles="@(ItemsToCopyToOutputDirectoryPreserveNewest)"
409 DestinationFiles="@(ItemsToCopyToOutputDirectoryPreserveNewest->'$(OutDir)%(TargetPath)')">
410 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
414 <!-- Copy if newer -->
415 <Target Name="_CopyDeployFilesToOutputDirectoryToOutputDirectoryAlways"
416 Condition="'@(ItemsToCopyToOutputDirectoryAlways)' != ''">
418 <Copy SourceFiles="@(ItemsToCopyToOutputDirectoryAlways)"
419 DestinationFiles="@(ItemsToCopyToOutputDirectoryAlways->'$(OutDir)%(TargetPath)')">
420 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
425 <Target Name="_CopyAppConfigFile" Condition="'@(AppConfigWithTargetPath)' != ''"
426 Inputs="@(AppConfigWithTargetPath)"
427 Outputs="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')">
429 <Copy SourceFiles="@(AppConfigWithTargetPath)"
430 DestinationFiles="@(AppConfigWithTargetPath->'$(OutDir)%(TargetPath)')">
431 <Output TaskParameter="DestinationFiles" ItemName="FileWrites"/>
435 <Target Name="GetTargetPath" Outputs="$(TargetPath)"/>
437 <Target Name="GetCopyToOutputDirectoryItems"
438 Outputs="@(AllItemsFullPathWithTargetPath)"
439 DependsOnTargets="AssignTargetPaths">
441 <!-- FIXME: handle .vcproj -->
443 Projects="@(ProjectReference)"
444 Targets="GetCopyToOutputDirectoryItems"
445 Condition="'@(ProjectReference)' != ''">
447 <Output TaskParameter="TargetOutputs" ItemName="AllChildProjectItemsWithTargetPath"/>
450 <!-- Process items from child project. The outputs need to have full path
451 as they'll be used from other projects -->
454 Include="@(AllChildProjectItemsWithTargetPath->'%(FullPath)')"
455 Condition="'%(AllChildProjectItemsWithTargetPath.CopyToOutputDirectory)' == 'Always' or '%(AllChildProjectItemsWithTargetPath.CopyToOutputDirectory)' == 'PreserveNewest'">
457 <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
458 <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryAlways"
459 Condition="'%(AllChildProjectItemsWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
460 <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryPreserveNewest"
461 Condition="'%(AllChildProjectItemsWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
465 <!-- Process _this_ project's items -->
468 Include="@(NoneWithTargetPath->'%(FullPath)')"
469 Condition="'%(NoneWithTargetPath.CopyToOutputDirectory)' == 'Always' or '%(NoneWithTargetPath.CopyToOutputDirectory)' == 'PreserveNewest'">
470 <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
471 <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryAlways"
472 Condition="'%(NoneWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
473 <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryPreserveNewest"
474 Condition="'%(NoneWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
478 Include="@(ContentWithTargetPath->'%(FullPath)')"
479 Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)' == 'Always' or '%(ContentWithTargetPath.CopyToOutputDirectory)' == 'PreserveNewest'">
480 <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
481 <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryAlways"
482 Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
483 <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryPreserveNewest"
484 Condition="'%(ContentWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
488 Include="@(EmbeddedResourceWithTargetPath->'%(FullPath)')"
489 Condition="'%(EmbeddedResourceWithTargetPath.CopyToOutputDirectory)' == 'Always' or '%(EmbeddedResourceWithTargetPath.CopyToOutputDirectory)' == 'PreserveNewest'">
490 <Output TaskParameter="Include" ItemName="AllItemsFullPathWithTargetPath"/>
491 <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryAlways"
492 Condition="'%(EmbeddedResourceWithTargetPath.CopyToOutputDirectory)'=='Always'"/>
493 <Output TaskParameter="Include" ItemName="ItemsToCopyToOutputDirectoryPreserveNewest"
494 Condition="'%(EmbeddedResourceWithTargetPath.CopyToOutputDirectory)'=='PreserveNewest'"/>
499 <!-- Pre/Post BuildEvents -->
501 <PreBuildEventDependsOn />
504 <Target Name="PreBuildEvent"
505 Condition="'$(PreBuildEvent)' != ''"
506 DependsOnTargets="$(PreBuildEventDependsOn)">
508 <Exec WorkingDirectory="$(OutDir)" Command="$(PreBuildEvent)" />
511 <!-- PostBuildEvent depends on $(RunPostBuildEvent)
513 Default: OnBuildSuccess
514 OnBuildSuccess: Run after a successful build
515 OnOutputUpdated: Run only if the output assembly got updates
519 <PostBuildEventDependsOn />
522 <!-- this gets invoked in two cases, from CoreBuildDependsOn, if the build completes
523 successfully, OR from OnError in CoreBuild, if the build failed and $(RunPostBuildEvent)
524 is 'Always' or 'OnOutputUpdated' -->
525 <Target Name="PostBuildEvent"
526 Condition="'$(PostBuildEvent)' != '' and
527 ('$(RunPostBuildEvent)' == 'Always' or '$(RunPostBuildEvent)' == 'OnBuildSuccess' or
528 ('$(RunPostBuildEvent)' == 'OnOutputUpdated' and
529 '$(_AssemblyModifiedTimeBeforeCompile)' != '$(_AssemblyModifiedTimeAfterCompile)')
531 DependsOnTargets="$(PostBuildEventDependsOn)">
533 <Exec WorkingDirectory="$(OutDir)" Command="$(PostBuildEvent)" />
536 <!-- Timestamp the output assemblies, required for PostBuildEvent -->
537 <Target Name="_TimestampBeforeCompile" Condition="'$(RunPostBuildEvent)' == 'OnOutputUpdated'">
538 <CreateItem Include="%(IntermediateAssembly.ModifiedTime)">
539 <Output TaskParameter="Include" PropertyName="_AssemblyModifiedTimeBeforeCompile" />
542 <Target Name="_TimestampAfterCompile" Condition="'$(RunPostBuildEvent)' == 'OnOutputUpdated'">
543 <CreateItem Include="%(IntermediateAssembly.ModifiedTime)">
544 <Output TaskParameter="Include" PropertyName="_AssemblyModifiedTimeAfterCompile" />
553 $(MSBuildProjectDefaultTargets);
557 <RebuildDependsOn Condition="'$(MSBuildProjectDefaultTargets)' == 'Rebuild'">
565 <Target Name="BeforeRebuild" />
566 <Target Name="AfterRebuild" />
568 <Target Name="Rebuild"
569 DependsOnTargets="$(RebuildDependsOn)"
570 Outputs="$(TargetPath)"/>
573 <Target Name="_RecordCleanFile"
574 DependsOnTargets="_GetCompileOutputsForClean">
576 File="$(BaseIntermediateOutputPath)$(CleanFile)"
577 Lines="@(FileWrites->'%(FullPath)')"
584 CleanReferencedProjects;
590 <Target Name="_GetCompileOutputsForClean">
591 <CreateItem Include="@(IntermediateAssembly)" Condition="Exists('@(IntermediateAssembly)')">
592 <Output TaskParameter="Include" ItemName="FileWrites"/>
595 <CreateItem Include="$(IntermediateOutputPath)$(AssemblyName)$(TargetExt).mdb"
596 Condition="Exists('$(IntermediateOutputPath)$(AssemblyName)$(TargetExt).mdb')">
597 <Output TaskParameter="Include" ItemName="FileWrites"/>
601 <!-- Get the list of files written, for clean -->
602 <Target Name="_GetCleanFileWrites"
603 DependsOnTargets="_GetCompileOutputsForClean">
604 <ReadLinesFromFile File="$(BaseIntermediateOutputPath)$(CleanFile)">
605 <Output TaskParameter="Lines" ItemName="FileWrites"/>
609 <Target Name="CleanReferencedProjects"
610 DependsOnTargets="AssignProjectConfigurations">
612 <!-- If building from .sln.proj or from IDE, clean will get handled by them,
613 else we are building a project directly, from the command line, so
614 clean the referenced projects -->
615 <MSBuild Projects="@(ProjectReferenceWithConfiguration)"
617 Condition=" '$(BuildingSolutionFile)' != 'true' and '$(BuildingInsideVisualStudio)' != 'true' and '@(ProjectReferenceWithConfiguration)' != ''" />
621 <Target Name="Clean" DependsOnTargets="$(CleanDependsOn)"/>
623 <!-- Override in project to run before/after clean tasks -->
624 <Target Name="BeforeClean" />
625 <Target Name="AfterClean" />
627 <Target Name="CoreClean" DependsOnTargets="_GetCleanFileWrites">
628 <Delete Files="@(FileWrites)" TreatErrorsAsWarnings="true"/>