diff options
author | Eric St. John <ericstj@microsoft.com> | 2017-01-12 02:41:26 +0300 |
---|---|---|
committer | Eric St. John <ericstj@microsoft.com> | 2017-01-12 04:38:20 +0300 |
commit | 47b56ae8eb591e0fff8160fa32b9e1712694cf55 (patch) | |
tree | e3c8e2b7d49fe8220e2d373179a20785ba0634ab /buildvertical.targets | |
parent | 4024e79ae5479e6eeb23eecdae4d2ee09481974f (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.targets | 134 |
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 |