Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/mono/corefx.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric St. John <ericstj@microsoft.com>2017-01-12 02:41:26 +0300
committerEric St. John <ericstj@microsoft.com>2017-01-12 04:38:20 +0300
commit47b56ae8eb591e0fff8160fa32b9e1712694cf55 (patch)
treee3c8e2b7d49fe8220e2d373179a20785ba0634ab /buildvertical.targets
parent4024e79ae5479e6eeb23eecdae4d2ee09481974f (diff)
Refactor build traversal
Change contract of cross-project target to return configuration rather than trying to construct a project item. This preserves the metadata of the original Project/ProjectReference. When the MSBuild task creates the TargetOutputs it will copy all the original metadata from the Project items and create the OriginalItemSpec metadata. From this we can simply transform back to a Project/ProjectReference and prepend Configuration to the AdditionalProperties. This fixes a case where projects were setting AdditionalProperties and we were squashing it. This exposed an issue in traversal where we were still setting TestTFM (previously this was squashed, only with other AdditionalProperties). To make it clearer how this worked I made the targets only return a property so that we don't accidentally squash any metadata set on the project. I've also cleaned up the targets to make things a bit more consistent and added comments.
Diffstat (limited to 'buildvertical.targets')
-rw-r--r--buildvertical.targets134
1 files changed, 55 insertions, 79 deletions
diff --git a/buildvertical.targets b/buildvertical.targets
index f778ae367f..eeadbcf580 100644
--- a/buildvertical.targets
+++ b/buildvertical.targets
@@ -5,106 +5,82 @@
<ImportedBuildVerticalTargets>true</ImportedBuildVerticalTargets>
</PropertyGroup>
- <!-- Required for FindBestConfiguration task -->
- <Import Project="$(MSBuildThisFileDirectory)src/Tools/GenerateProps/properties.props" />
+ <!-- Import configuration data model -->
+ <Import Project="$(MSBuildThisFileDirectory)src/Tools/GenerateProps/properties.props" />
- <Target Name="AnnotateProjects"
- BeforeTargets="BuildAllProjects"
- Condition="!$(MSBuildProjectFullPath.EndsWith('.proj'))">
- <!-- Clear ProjectWithConfiguration to prevent circular dependency -->
- <ItemGroup><ProjectWithConfiguration Remove="@(ProjectWithConfiguration)" /></ItemGroup>
- <MSBuild Targets="AnnotateProjectsWithConfiguration"
- Projects="@(Project)">
- <Output TaskParameter="TargetOutputs"
- ItemName="ProjectWithConfiguration" />
- </MSBuild>
- <ItemGroup>
- <Project Remove="@(Project)" />
- <Project Include="@(ProjectWithConfiguration)" />
- </ItemGroup>
- </Target>
+ <!-- Runs during traversal to select which projects and configurations of those projects to build -->
+ <Target Name="AnnotateAndFilterProjects"
+ BeforeTargets="BuildAllProjects;TestAllProjects"
+ Condition="!$(MSBuildProjectFullPath.EndsWith('.proj'))">
- <Target Name="AnnotateProjectsWithConfiguration"
- Returns="@(ProjectWithConfiguration)">
- <ItemGroup>
- <ProjectWithConfiguration Include="$(MSBuildProjectFullPath)">
- <AdditionalProperties Condition="'$(_BestConfiguration)' != ''">Configuration=$(_BestConfiguration);%(ProjectWithConfiguration.AdditionalProperties)</AdditionalProperties>
- <UndefineProperties Condition="'$(_BestConfiguration)' == ''">Configuration;%(ProjectWithConfiguration.UndefineProperties)</UndefineProperties>
- </ProjectWithConfiguration>
- <ProjectWithConfiguration Remove="@(OmitProject)" />
- </ItemGroup>
- </Target>
-
- <!-- The initial shaking target for trimming down applicable projects for specified vertical -->
- <Target Name="DetermineProjectsConfiguration"
- Returns="@(OmitProject)"
- BeforeTargets="AnnotateProjectsWithConfiguration">
- <!-- Clear the _Configuration item -->
- <ItemGroup><_Configuration Remove="@(_Configuration)" /></ItemGroup>
- <FindBestConfiguration Properties="@(Property)"
- PropertyValues="@(PropertyValue)"
- BuildConfigurations="$(BuildConfigurations)"
- BuildConfiguration="$(BuildConfiguration)"
- Condition="'$(BuildConfigurations)' != ''"
- ContinueOnError="true">
- <Output TaskParameter="BestConfiguration" ItemName="_Configuration" />
- </FindBestConfiguration>
+ <!-- find the best configuration for each project, projects that shouldn't build for this configuration
+ return an empty item. -->
+ <MSBuild Targets="FindBestConfiguration"
+ Projects="@(Project)">
+ <Output TaskParameter="TargetOutputs"
+ ItemName="_ProjectBestConfigurations" />
+ </MSBuild>
<ItemGroup>
- <_Configuration Condition="'$(BuildConfigurations)' == ''" Include="$(BuildConfiguration)" />
+ <!-- transform back to project -->
+ <ProjectWithConfiguration Include="@(_ProjectBestConfigurations->'%(OriginalItemSpec)')">
+ <AdditionalProperties>Configuration=%(Identity);%(_ProjectBestConfigurations.AdditionalProperties)</AdditionalProperties>
+ </ProjectWithConfiguration>
</ItemGroup>
- <PropertyGroup>
- <_BestConfiguration>%(_Configuration.Identity)</_BestConfiguration>
- </PropertyGroup>
-
<ItemGroup>
- <OmitProject Include="$(MSBuildProjectFullPath)" Condition="'$(BuildConfigurations)' != '' and '$(_BestConfiguration)' == ''" />
+ <Project Remove="@(Project)" />
+ <Project Include="@(ProjectWithConfiguration)" />
</ItemGroup>
</Target>
+ <!-- Runs in a leaf project (eg: csproj) to determine best configuration if one exists for purposes of filtering -->
<Target Name="FindBestConfiguration"
- Returns="@(_Configuration)">
- <!-- Clear the _Configuration item -->
- <ItemGroup><_Configuration Remove="@(_Configuration)" /></ItemGroup>
- <FindBestConfiguration Properties="@(Property)"
+ Returns="$(_BestConfiguration)">
+
+ <!-- if BuildConfigurations is defined, find the best one -->
+ <FindBestConfiguration Condition="'$(BuildConfigurations)' != ''"
+ Properties="@(Property)"
PropertyValues="@(PropertyValue)"
BuildConfigurations="$(BuildConfigurations)"
- BuildConfiguration="$(BuildConfiguration)"
- Condition="'$(BuildConfigurations)' != ''"
- ContinueOnError="true">
- <Output TaskParameter="BestConfiguration" ItemName="_Configuration" />
- </FindBestConfiguration>
-
- <ItemGroup>
- <_Configuration Condition="'$(BuildConfigurations)' == ''" Include="$(BuildConfiguration)" />
- </ItemGroup>
+ BuildConfiguration="$(BuildConfiguration)">
+ <Output TaskParameter="BestConfiguration" PropertyName="_BestConfiguration" />
+ </FindBestConfiguration>
+
+ <!-- if BuildConfigurations is not defined, use BuildConfiguration -->
+ <PropertyGroup>
+ <_BestConfiguration Condition="'$(BuildConfigurations)' == ''">$(BuildConfiguration)</_BestConfiguration>
+ </PropertyGroup>
+ </Target>
+
+ <!-- Runs in a leaf project (eg: csproj) to determine best configuration if one exists for purposes of project references -->
+ <Target Name="FindBestConfigurationForProjectReference"
+ DependsOnTargets="FindBestConfiguration"
+ Returns="$(_BestConfiguration)">
+ <Error Condition="'$(_BestConfiguration)' == ''" Text="Could not find a configuration for $(BuildConfiguration) from $(BuildConfigurations)" />
</Target>
+ <!-- Runs in a leaf project (csproj) to determine best configuration for ProjectReferences -->
<Target Name="AnnotateProjectReference"
- Inputs="%(ProjectReference.Identity)"
- Outputs="fake"
BeforeTargets="BeforeResolveReferences">
- <PropertyGroup>
- <_ProjectReferenceToAnnotate>%(ProjectReference.Identity)</_ProjectReferenceToAnnotate>
- </PropertyGroup>
- <ItemGroup><_Configuration Remove="@(_Configuration)" /></ItemGroup>
- <MSBuild Targets="FindBestConfiguration"
- Projects="$(_ProjectReferenceToAnnotate)">
- <Output TaskParameter="TargetOutputs" ItemName="_Configuration" />
+ <!-- find the best configuration for each project, projects that do not have an
+ applicable configuration will fail the build. -->
+ <MSBuild Targets="FindBestConfigurationForProjectReference"
+ Projects="@(ProjectReference)">
+ <Output TaskParameter="TargetOutputs" ItemName="_ProjectReferenceBestConfigurations" />
</MSBuild>
- <PropertyGroup>
- <_BestConfiguration>%(_Configuration.Identity)</_BestConfiguration>
- <_AdditionalProperties />
- <_AdditionalProperties Condition="'$(_BestConfiguration)' != ''">Configuration=$(_BestConfiguration)</_AdditionalProperties>
- </PropertyGroup>
<ItemGroup>
- <ProjectReference>
- <AdditionalProperties Condition="'$(_AdditionalProperties)' != ''">$(_AdditionalProperties);%(ProjectReference.AdditionalProperties)</AdditionalProperties>
- <UndefineProperties Condition="'$(_AdditionalProperties)' == ''">Configuration;%(ProjectReference.Configuration)</UndefineProperties>
- </ProjectReference>
+ <!-- transform back to ProjectReference -->
+ <ProjectReferenceWithConfiguration Include="@(_ProjectReferenceBestConfigurations->'%(OriginalItemSpec)')">
+ <AdditionalProperties>Configuration=%(Identity);%(_ProjectReferenceBestConfigurations.AdditionalProperties)</AdditionalProperties>
+ </ProjectReferenceWithConfiguration>
+ </ItemGroup>
+
+ <ItemGroup>
+ <ProjectReference Remove="@(ProjectReference)" />
+ <ProjectReference Include="@(ProjectReferenceWithConfiguration)" />
</ItemGroup>
</Target>
</Project> \ No newline at end of file