Skip to content

Commit 7064b07

Browse files
authored
Make ApiCompat.proj incrementally buildable
In #64000, I noticed that ApiCompat.proj never builds incrementally. Even though the RunApiCompat target has Inputs and Outputs, those aren't defined too late inside the target to have any effect. Moving them out and declare the generated response file as an output. Also simplifying some msbuild logic and renaming some properties as underscore prefixes in project files don't make sense if the property isn't reserved in any way.
1 parent 36cdb5f commit 7064b07

File tree

1 file changed

+31
-36
lines changed

1 file changed

+31
-36
lines changed

src/libraries/shims/ApiCompat.proj

Lines changed: 31 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
<Project Sdk="Microsoft.Build.NoTargets">
22

3+
<!-- Run API compat against the following 1:1 assemblies but don't include them in the list that is used to generate facades -->
34
<ItemGroup>
4-
<!-- Run API compat against the following 1:1 assemblies but don't include them in the list that is used to generate facades -->
55
<NetFxReference Include="System.DirectoryServices" />
66
<NetFxReference Include="System.DirectoryServices.AccountManagement" />
77
<NetFxReference Include="System.DirectoryServices.Protocols" />
@@ -14,95 +14,90 @@
1414
<PackageReference Include="Microsoft.DotNet.ApiCompat" Version="$(MicrosoftDotNetApiCompatVersion)" IsImplicitlyDefined="true" />
1515
</ItemGroup>
1616

17-
<!-- Evaluate these properties inside a Target to gain access to IntermediateOutputPath. -->
18-
<Target Name="SetApiCompatFiles">
17+
<Target Name="GetApiCompatInputsAndOutputs">
1918
<PropertyGroup>
2019
<ApiCompatResponseFile>$(IntermediateOutputPath)apicompat.rsp</ApiCompatResponseFile>
2120
<ApiCompatBaselineFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.netcoreapp.netfx461.txt</ApiCompatBaselineFile>
2221
<ApiCompatBaselineIgnoreFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.netcoreapp.netfx461.ignore.txt</ApiCompatBaselineIgnoreFile>
2322
<ApiCompatNSBaselineFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.netcoreapp.netstandard.txt</ApiCompatNSBaselineFile>
2423
<ApiCompatNSOnlyBaselineFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.netcoreapp.netstandardOnly.txt</ApiCompatNSOnlyBaselineFile>
24+
<PreviousNetCoreAppBaselineFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.PreviousNetCoreApp.txt</PreviousNetCoreAppBaselineFile>
2525
</PropertyGroup>
26+
27+
<ItemGroup>
28+
<NetCoreAppCurrentRefFile Include="$(NetCoreAppCurrentRefPath)*.dll" />
29+
</ItemGroup>
2630
</Target>
2731

28-
<!-- Run ApiCompat -->
2932
<Target Name="RunApiCompat"
30-
DependsOnTargets="SetApiCompatFiles"
33+
DependsOnTargets="GetApiCompatInputsAndOutputs"
3134
AfterTargets="Build"
32-
Inputs="$(ApiCompatResponseFile)"
33-
Outputs="$(ApiCompatBaselineFile);$(ApiCompatNSBaselineFile)">
35+
Inputs="@(NetCoreAppCurrentRefFile);$(ApiCompatBaselineFile);$(ApiCompatBaselineIgnoreFile);$(ApiCompatNSBaselineFile);$(ApiCompatNSOnlyBaselineFile);$(PreviousNetCoreAppBaselineFile)"
36+
Outputs="$(ApiCompatResponseFile)">
3437

3538
<PropertyGroup>
36-
<ApiCompatImplementationDirs>$(NetCoreAppCurrentRefPath.TrimEnd('\/'))</ApiCompatImplementationDirs>
37-
<ApiCompatArgs Condition="'$(ApiCompatExcludeAttributeList)' != ''">$(ApiCompatArgs) --exclude-attributes "$(ApiCompatExcludeAttributeList)"</ApiCompatArgs>
38-
<ApiCompatArgs>$(ApiCompatArgs) --impl-dirs "$(ApiCompatImplementationDirs)"</ApiCompatArgs>
39-
<BaselineApiCompatArgs Condition="Exists($(ApiCompatBaselineIgnoreFile))">--baseline "$(ApiCompatBaselineIgnoreFile)"</BaselineApiCompatArgs>
4039
<ApiCompatExitCode>0</ApiCompatExitCode>
40+
<ApiCompatArgs>--impl-dirs "$(NetCoreAppCurrentRefPath.TrimEnd('\/'))"</ApiCompatArgs>
41+
<ApiCompatArgs Condition="'$(ApiCompatExcludeAttributeList)' != ''">$(ApiCompatArgs) --exclude-attributes "$(ApiCompatExcludeAttributeList)"</ApiCompatArgs>
4142
</PropertyGroup>
4243

4344
<MakeDir Directories="$(IntermediateOutputPath)" />
44-
<WriteLinesToFile File="$(ApiCompatResponseFile)" Lines="$(ApiCompatArgs)" Overwrite="true" />
45+
<WriteLinesToFile File="$(ApiCompatResponseFile)"
46+
Lines="$(ApiCompatArgs)"
47+
Overwrite="true" />
4548

46-
<Exec Command="$(_ApiCompatCommand) &quot;@(NetFxReference -> '$(NetFxRefPath)%(Identity).dll')&quot; $(BaselineApiCompatArgs) @&quot;$(ApiCompatResponseFile)&quot; &gt; $(ApiCompatBaselineFile)"
49+
<Exec Command="$(_ApiCompatCommand) &quot;@(NetFxReference -> '$(NetFxRefPath)%(Identity).dll')&quot; --baseline &quot;$(ApiCompatBaselineIgnoreFile)&quot; @&quot;$(ApiCompatResponseFile)&quot; &gt; $(ApiCompatBaselineFile)"
4750
Condition="'$(BaselineApiCompat)' == 'true'"
4851
CustomErrorRegularExpression="^[a-zA-Z]+ :"
4952
StandardOutputImportance="Low"
5053
IgnoreExitCode="true">
5154
<Output TaskParameter="ExitCode" PropertyName="ApiCompatExitCode" />
5255
</Exec>
5356

57+
<Delete Condition="'$(ApiCompatExitCode)' != '0'" Files="$(ApiCompatResponseFile)" />
5458
<Error Condition="'$(ApiCompatExitCode)' != '0'" Text="ApiCompat failed comparing $(NETFrameworkReferenceAssemblyTFM) to $(NetCoreAppCurrent)" />
5559

56-
57-
<!--
58-
In order to update the .NET Standard baseline, you can just start the build with /p:UpdateNETStandardBaseline=True
59-
-->
60+
<!-- In order to update the .NETStandard baseline, you can just start the build with /p:UpdateNETStandardBaseline=true -->
6061
<PropertyGroup>
61-
<UpdateNETStandardBaseline Condition="'$(UpdateNETStandardBaseline)' == ''">False</UpdateNETStandardBaseline>
62-
<_netStandardLibrary20RefPath>$([MSBuild]::NormalizeDirectory('$(NuGetPackageRoot)', 'netstandard.library', '$(NetStandardLibraryVersion)', 'build', 'netstandard2.0', 'ref'))</_netStandardLibrary20RefPath>
63-
<_netStandard21OnlyRef>$(NETStandard21RefPath)netstandard.dll</_netStandard21OnlyRef>
64-
<_netStandard21BaselineModifer>--baseline</_netStandard21BaselineModifer>
65-
<_netStandard21BaselineModifer Condition="$(UpdateNETStandardBaseline)">&gt;</_netStandard21BaselineModifer>
62+
<NetStandardLibrary20RefPath>$([MSBuild]::NormalizeDirectory('$(NuGetPackageRoot)', 'netstandard.library', '$(NetStandardLibraryVersion)', 'build', 'netstandard2.0', 'ref'))</NetStandardLibrary20RefPath>
63+
<NetStandard21OnlyRef>$(NETStandard21RefPath)netstandard.dll</NetStandard21OnlyRef>
64+
<NetStandard21BaselineModifer>--baseline</NetStandard21BaselineModifer>
65+
<NetStandard21BaselineModifer Condition="'$(UpdateNETStandardBaseline)' == 'true'">&gt;</NetStandard21BaselineModifer>
6666
</PropertyGroup>
6767

68-
<Exec Command="$(_ApiCompatCommand) &quot;$(_netStandard21OnlyRef)&quot; @&quot;$(ApiCompatResponseFile)&quot; $(_netStandard21BaselineModifer) &quot;$(ApiCompatNSOnlyBaselineFile)&quot;"
68+
<Exec Command="$(_ApiCompatCommand) &quot;$(NetStandard21OnlyRef)&quot; @&quot;$(ApiCompatResponseFile)&quot; $(NetStandard21BaselineModifer) &quot;$(ApiCompatNSOnlyBaselineFile)&quot;"
6969
CustomErrorRegularExpression="^[a-zA-Z]+ :"
7070
StandardOutputImportance="Low"
7171
IgnoreExitCode="true">
7272
<Output TaskParameter="ExitCode" PropertyName="ApiCompatExitCode" />
7373
</Exec>
74-
74+
<Delete Condition="'$(ApiCompatExitCode)' != '0'" Files="$(ApiCompatResponseFile)" />
7575
<Error Condition="'$(ApiCompatExitCode)' != '0'" Text="ApiCompat failed comparing netstandard.dll to $(NetCoreAppCurrent)" />
7676

77-
<Exec Command="$(_ApiCompatCommand) &quot;$(_netStandardLibrary20RefPath.TrimEnd('\/'))&quot; --baseline &quot;$(ApiCompatNSBaselineFile)&quot; @&quot;$(ApiCompatResponseFile)&quot;"
77+
<Exec Command="$(_ApiCompatCommand) &quot;$(NetStandardLibrary20RefPath.TrimEnd('\/'))&quot; --baseline &quot;$(ApiCompatNSBaselineFile)&quot; @&quot;$(ApiCompatResponseFile)&quot;"
7878
CustomErrorRegularExpression="^[a-zA-Z]+ :"
7979
StandardOutputImportance="Low"
8080
IgnoreExitCode="true">
8181
<Output TaskParameter="ExitCode" PropertyName="ApiCompatExitCode" />
8282
</Exec>
83-
83+
<Delete Condition="'$(ApiCompatExitCode)' != '0'" Files="$(ApiCompatResponseFile)" />
8484
<Error Condition="'$(ApiCompatExitCode)' != '0'" Text="ApiCompat failed comparing netstandard to $(NetCoreAppCurrent)" />
8585

86+
<!-- In order to update the previous .NETCoreApp baseline, you can just start the build with /p:UpdatePreviousNetCoreAppBaseline=true -->
8687
<PropertyGroup>
8788
<PreviousNetCoreAppRefPath>$([MSBuild]::NormalizeDirectory('$(NuGetPackageRoot)', 'microsoft.netcore.app.ref', '$(NetCoreAppLatestStablePackageBaselineVersion)', 'ref', '$(NetCoreAppLatestStable)'))</PreviousNetCoreAppRefPath>
88-
<_previousNetCoreAppBaselineFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.PreviousNetCoreApp.txt</_previousNetCoreAppBaselineFile>
89-
<_previousNetCoreAppBaselineParam>--baseline &quot;$(_previousNetCoreAppBaselineFile)&quot;</_previousNetCoreAppBaselineParam>
90-
<_previousNetCoreAppBaselineParam Condition="'$(UpdatePreviousNetCoreAppBaseline)' == 'true'">&gt; &quot;$(_previousNetCoreAppBaselineFile)&quot;</_previousNetCoreAppBaselineParam>
89+
<PreviousNetCoreAppBaselineParam>--baseline</PreviousNetCoreAppBaselineParam>
90+
<PreviousNetCoreAppBaselineParam Condition="'$(UpdatePreviousNetCoreAppBaseline)' == 'true'">&gt;</PreviousNetCoreAppBaselineParam>
9191
</PropertyGroup>
9292

93-
<Error Condition="!Exists($(PreviousNetCoreAppRefPath))" Text="Missing reference assemblies for '$(NetCoreAppLatestStable)'" />
94-
<Exec Command="$(_ApiCompatCommand) &quot;$(PreviousNetCoreAppRefPath.TrimEnd('\/'))&quot; @&quot;$(ApiCompatResponseFile)&quot; $(_previousNetCoreAppBaselineParam)"
93+
<Exec Command="$(_ApiCompatCommand) &quot;$(PreviousNetCoreAppRefPath.TrimEnd('\/'))&quot; @&quot;$(ApiCompatResponseFile)&quot; $(PreviousNetCoreAppBaselineParam) &quot;$(PreviousNetCoreAppBaselineFile)&quot;"
9594
CustomErrorRegularExpression="^[a-zA-Z]+ :"
9695
StandardOutputImportance="Low"
9796
IgnoreExitCode="true">
9897
<Output TaskParameter="ExitCode" PropertyName="ApiCompatExitCode" />
9998
</Exec>
100-
99+
<Delete Condition="'$(ApiCompatExitCode)' != '0'" Files="$(ApiCompatResponseFile)" />
101100
<Error Condition="'$(ApiCompatExitCode)' != '0'" Text="ApiCompat failed comparing $(NetCoreAppLatestStable) to $(NetCoreAppCurrent). If this breaking change is intentional, the ApiCompat baseline can be updated by running 'dotnet build $(MSBuildThisFileFullPath) /p:UpdatePreviousNetCoreAppBaseline=true'" />
102101
</Target>
103102

104-
<Target Name="CleanAdditionalFiles" AfterTargets="Clean">
105-
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
106-
</Target>
107-
108103
</Project>

0 commit comments

Comments
 (0)