Skip to content

Commit 35482cb

Browse files
authored
Make ApiCompat.proj incrementally buildable (#64037)
* 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. * Update ApiCompat.proj
1 parent 83f8df4 commit 35482cb

File tree

1 file changed

+33
-38
lines changed

1 file changed

+33
-38
lines changed

src/libraries/shims/ApiCompat.proj

Lines changed: 33 additions & 38 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>
20-
<ApiCompatResponseFile>$(IntermediateOutputPath)apicompat.rsp</ApiCompatResponseFile>
2119
<ApiCompatBaselineFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.netcoreapp.netfx461.txt</ApiCompatBaselineFile>
2220
<ApiCompatBaselineIgnoreFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.netcoreapp.netfx461.ignore.txt</ApiCompatBaselineIgnoreFile>
2321
<ApiCompatNSBaselineFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.netcoreapp.netstandard.txt</ApiCompatNSBaselineFile>
2422
<ApiCompatNSOnlyBaselineFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.netcoreapp.netstandardOnly.txt</ApiCompatNSOnlyBaselineFile>
23+
<PreviousNetCoreAppBaselineFile>$(MSBuildThisFileDirectory)ApiCompatBaseline.PreviousNetCoreApp.txt</PreviousNetCoreAppBaselineFile>
24+
<ApiCompatMarkerFile>$(BaseIntermediateOutputPath)marker.txt</ApiCompatMarkerFile>
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="$(ApiCompatMarkerFile)">
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>
39+
<ApiCompatResponseFile>$(BaseIntermediateOutputPath)apicompat.rsp</ApiCompatResponseFile>
4040
<ApiCompatExitCode>0</ApiCompatExitCode>
41+
<ApiCompatArgs>--impl-dirs "$(NetCoreAppCurrentRefPath.TrimEnd('\/'))"</ApiCompatArgs>
42+
<ApiCompatArgs Condition="'$(ApiCompatExcludeAttributeList)' != ''">$(ApiCompatArgs) --exclude-attributes "$(ApiCompatExcludeAttributeList)"</ApiCompatArgs>
4143
</PropertyGroup>
4244

43-
<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>
53-
5456
<Error Condition="'$(ApiCompatExitCode)' != '0'" Text="ApiCompat failed comparing $(NETFrameworkReferenceAssemblyTFM) to $(NetCoreAppCurrent)" />
5557

56-
57-
<!--
58-
In order to update the .NET Standard baseline, you can just start the build with /p:UpdateNETStandardBaseline=True
59-
-->
58+
<!-- In order to update the .NETStandard baseline, you can just start the build with /p:UpdateNETStandardBaseline=true -->
6059
<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>
60+
<NetStandardLibrary20RefPath>$([MSBuild]::NormalizeDirectory('$(NuGetPackageRoot)', 'netstandard.library', '$(NetStandardLibraryVersion)', 'build', 'netstandard2.0', 'ref'))</NetStandardLibrary20RefPath>
61+
<NetStandard21OnlyRef>$(NETStandard21RefPath)netstandard.dll</NetStandard21OnlyRef>
62+
<NetStandard21BaselineModifer>--baseline</NetStandard21BaselineModifer>
63+
<NetStandard21BaselineModifer Condition="'$(UpdateNETStandardBaseline)' == 'true'">&gt;</NetStandard21BaselineModifer>
6664
</PropertyGroup>
6765

68-
<Exec Command="$(_ApiCompatCommand) &quot;$(_netStandard21OnlyRef)&quot; @&quot;$(ApiCompatResponseFile)&quot; $(_netStandard21BaselineModifer) &quot;$(ApiCompatNSOnlyBaselineFile)&quot;"
66+
<Exec Command="$(_ApiCompatCommand) &quot;$(NetStandard21OnlyRef)&quot; @&quot;$(ApiCompatResponseFile)&quot; $(NetStandard21BaselineModifer) &quot;$(ApiCompatNSOnlyBaselineFile)&quot;"
6967
CustomErrorRegularExpression="^[a-zA-Z]+ :"
7068
StandardOutputImportance="Low"
7169
IgnoreExitCode="true">
7270
<Output TaskParameter="ExitCode" PropertyName="ApiCompatExitCode" />
7371
</Exec>
74-
7572
<Error Condition="'$(ApiCompatExitCode)' != '0'" Text="ApiCompat failed comparing netstandard.dll to $(NetCoreAppCurrent)" />
7673

77-
<Exec Command="$(_ApiCompatCommand) &quot;$(_netStandardLibrary20RefPath.TrimEnd('\/'))&quot; --baseline &quot;$(ApiCompatNSBaselineFile)&quot; @&quot;$(ApiCompatResponseFile)&quot;"
74+
<Exec Command="$(_ApiCompatCommand) &quot;$(NetStandardLibrary20RefPath.TrimEnd('\/'))&quot; --baseline &quot;$(ApiCompatNSBaselineFile)&quot; @&quot;$(ApiCompatResponseFile)&quot;"
7875
CustomErrorRegularExpression="^[a-zA-Z]+ :"
7976
StandardOutputImportance="Low"
8077
IgnoreExitCode="true">
8178
<Output TaskParameter="ExitCode" PropertyName="ApiCompatExitCode" />
8279
</Exec>
83-
8480
<Error Condition="'$(ApiCompatExitCode)' != '0'" Text="ApiCompat failed comparing netstandard to $(NetCoreAppCurrent)" />
8581

82+
<!-- In order to update the previous .NETCoreApp baseline, you can just start the build with /p:UpdatePreviousNetCoreAppBaseline=true -->
8683
<PropertyGroup>
8784
<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>
85+
<PreviousNetCoreAppBaselineParam>--baseline</PreviousNetCoreAppBaselineParam>
86+
<PreviousNetCoreAppBaselineParam Condition="'$(UpdatePreviousNetCoreAppBaseline)' == 'true'">&gt;</PreviousNetCoreAppBaselineParam>
9187
</PropertyGroup>
9288

93-
<Error Condition="!Exists($(PreviousNetCoreAppRefPath))" Text="Missing reference assemblies for '$(NetCoreAppLatestStable)'" />
94-
<Exec Command="$(_ApiCompatCommand) &quot;$(PreviousNetCoreAppRefPath.TrimEnd('\/'))&quot; @&quot;$(ApiCompatResponseFile)&quot; $(_previousNetCoreAppBaselineParam)"
89+
<Exec Command="$(_ApiCompatCommand) &quot;$(PreviousNetCoreAppRefPath.TrimEnd('\/'))&quot; @&quot;$(ApiCompatResponseFile)&quot; $(PreviousNetCoreAppBaselineParam) &quot;$(PreviousNetCoreAppBaselineFile)&quot;"
9590
CustomErrorRegularExpression="^[a-zA-Z]+ :"
9691
StandardOutputImportance="Low"
9792
IgnoreExitCode="true">
9893
<Output TaskParameter="ExitCode" PropertyName="ApiCompatExitCode" />
9994
</Exec>
100-
10195
<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'" />
102-
</Target>
10396

104-
<Target Name="CleanAdditionalFiles" AfterTargets="Clean">
105-
<RemoveDir Directories="$(BaseIntermediateOutputPath)" />
97+
<!-- Create a marker file which serves as the target's output to enable incremental builds. -->
98+
<Touch Files="$(ApiCompatMarkerFile)"
99+
AlwaysCreate="true" />
100+
106101
</Target>
107102

108103
</Project>

0 commit comments

Comments
 (0)