Skip to content

Commit

Permalink
Make ILLink validation steps in libs incrementally buildable (dotnet#…
Browse files Browse the repository at this point in the history
…64041)

* Make ILLink validation steps in libs incrementally buildable

Both the illink-oob and the illink-sharedframework targets don't define Inputs and Outputs which makes them run during no-op incremental builds. This change defines Inputs and Outputs based on what's used during the target's execution so that if the input assemblies or the illink assembly itself haven't changed, the step will be skipped.

Also renaming properties and items to make them more readable and consistent. As these target files are "extensions" of the src.proj file and aren't shared anywhere, they can be treated like logic inside a project file and hence prefixing properties and items with an underscore "_" isn't necessary.
  • Loading branch information
ViktorHofer committed Jan 21, 2022
1 parent 358ee3c commit 4a099dc
Show file tree
Hide file tree
Showing 2 changed files with 89 additions and 62 deletions.
93 changes: 54 additions & 39 deletions src/libraries/illink-oob.targets
Original file line number Diff line number Diff line change
@@ -1,63 +1,78 @@
<Project>

<Target Name="ILLinkTrimOOBAssemblies"
AfterTargets="Build"
<Target Name="GetOOBAssembliesToTrim"
DependsOnTargets="PrepareForAssembliesTrim">

<Message Text="Trimming $(PackageRID) OOB assemblies with ILLinker..." Importance="high" />

<PropertyGroup>
<LibrariesTrimmedOOBArtifactsPath>$([MSBuild]::NormalizePath('$(ILLinkTrimAssemblyArtifactsRootDir)', 'trimmed-oobs'))</LibrariesTrimmedOOBArtifactsPath>
<OOBAssembliesTrimmedArtifactsPath>$([MSBuild]::NormalizePath('$(ILLinkTrimAssemblyArtifactsRootDir)', 'trimmed-oobs'))</OOBAssembliesTrimmedArtifactsPath>
</PropertyGroup>

<ItemGroup>

<!-- Include suppression XML files bin-placed in earlier per-library linker run. -->
<OOBLibrarySuppressionsXml Include="$(ILLinkTrimAssemblyOOBSuppressionsXmlsDir)*.xml" />

<!-- The following is the list of all the OOBs we will ignore for now -->
<_OOBsToIgnore Include="System.CodeDom" />
<_OOBsToIgnore Include="System.ComponentModel.Composition" />
<_OOBsToIgnore Include="System.ComponentModel.Composition.Registration" />
<_OOBsToIgnore Include="System.Composition.AttributedModel" />
<_OOBsToIgnore Include="System.Composition.Convention" />
<_OOBsToIgnore Include="System.Composition.Hosting" />
<_OOBsToIgnore Include="System.Composition.Runtime" />
<_OOBsToIgnore Include="System.Composition.TypedParts" />
<_OOBsToIgnore Include="System.Configuration.ConfigurationManager" />
<_OOBsToIgnore Include="System.Speech" />

<_NetCoreAppRuntimeAssemblies Include="$(NetCoreAppCurrentRuntimePath)*.dll" Exclude="$(NetCoreAppCurrentRuntimePath)*.Generator.dll;$(NetCoreAppCurrentRuntimePath)*.Native.dll;$(NetCoreAppCurrentRuntimePath)*msquic.dll" />
<_RuntimePackTrimmedAssemblies Include="$(MicrosoftNetCoreAppRuntimePackRidLibTfmDir)*.dll" />

<!-- Move previous items to FileName so that we can subtract them -->
<_NetCoreAppRuntimeAssembliesToFileName Include="@(_NetCoreAppRuntimeAssemblies -> '%(FileName)')">
<OriginalIdentity>%(Identity)</OriginalIdentity>
</_NetCoreAppRuntimeAssembliesToFileName>
<_RuntimePackAssembliesToFileName Include="@(_RuntimePackTrimmedAssemblies -> '%(FileName)')">
<OriginalIdentity>%(Identity)</OriginalIdentity>
</_RuntimePackAssembliesToFileName>

<_OOBsToTrimFileName Include="@(_NetCoreAppRuntimeAssembliesToFileName)" Exclude="@(_RuntimePackAssembliesToFileName);@(_OOBsToIgnore)" />
<_OOBReferencesFileName Include="@(_NetCoreAppRuntimeAssembliesToFileName)" Exclude="@(_OOBsToTrimFileName)" />
<_OOBsToTrim Include="@(_OOBsToTrimFileName -> '%(OriginalIdentity)')" />
<_OOBReferences Include="@(_OOBReferencesFileName -> '%(OriginalIdentity)')" />
<_OOBReferences Include="$(SystemPrivateCoreLibPath)" />
<OOBAssemblyToIgnore Include="System.CodeDom" />
<OOBAssemblyToIgnore Include="System.ComponentModel.Composition" />
<OOBAssemblyToIgnore Include="System.ComponentModel.Composition.Registration" />
<OOBAssemblyToIgnore Include="System.Composition.AttributedModel" />
<OOBAssemblyToIgnore Include="System.Composition.Convention" />
<OOBAssemblyToIgnore Include="System.Composition.Hosting" />
<OOBAssemblyToIgnore Include="System.Composition.Runtime" />
<OOBAssemblyToIgnore Include="System.Composition.TypedParts" />
<OOBAssemblyToIgnore Include="System.Configuration.ConfigurationManager" />
<OOBAssemblyToIgnore Include="System.Speech" />

<NetCoreAppCurrentAssembly Include="$(NetCoreAppCurrentRuntimePath)*.dll"
Exclude="$(NetCoreAppCurrentRuntimePath)*.Generator.dll;
$(NetCoreAppCurrentRuntimePath)*.Native.dll;
$(NetCoreAppCurrentRuntimePath)*msquic.dll" />
<SharedFrameworkAssembly Include="$(MicrosoftNetCoreAppRuntimePackRidLibTfmDir)*.dll" />

<!-- Move items to FileName so that we can subtract them -->
<NetCoreAppCurrentAssemblyWithFilename Include="@(NetCoreAppCurrentAssembly -> '%(FileName)')"
OriginalIdentity="%(Identity)" />
<SharedFrameworkAssemblyWithFilename Include="@(SharedFrameworkAssembly -> '%(FileName)')"
OriginalIdentity="%(Identity)" />

<OOBAssemblyToTrimWithFileName Include="@(NetCoreAppCurrentAssemblyWithFilename)"
Exclude="@(SharedFrameworkAssemblyWithFilename);
@(OOBAssemblyToIgnore)" />
<OOBAssemblyToTrim Include="@(OOBAssemblyToTrimWithFileName -> '%(OriginalIdentity)')" />

<OOBAssemblyReferenceWithFilename Include="@(NetCoreAppCurrentAssemblyWithFilename)"
Exclude="@(OOBAssemblyToTrimWithFileName)" />
<OOBAssemblyReference Include="@(OOBAssemblyReferenceWithFilename -> '%(OriginalIdentity)')" />
<OOBAssemblyReference Include="$(SystemPrivateCoreLibPath)" />
</ItemGroup>

<ItemGroup>
<!-- Include suppression XML files bin-placed in earlier per-library linker run. -->
<_OOBSuppressionsXmls Include="$(ILLinkTrimAssemblyOOBSuppressionsXmlsDir)*.xml" />
<OOBLibraryTrimmed Include="$(OOBAssembliesTrimmedArtifactsPath)*.*" />
</ItemGroup>

</Target>

<Target Name="ILLinkTrimOOBAssemblies"
AfterTargets="Build"
DependsOnTargets="GetOOBAssembliesToTrim;PrepareForAssembliesTrim"
Inputs="$(ILLinkTasksAssembly);@(OOBAssemblyToTrim);@(OOBAssemblyReference);@(OOBLibrarySuppressionsXml)"
Outputs="@(OOBLibraryTrimmed)">

<Message Text="Trimming $(PackageRID) out-of-band assemblies with ILLinker..." Importance="high" />

<PropertyGroup>
<OOBILLinkArgs>$(ILLinkArgs)</OOBILLinkArgs>
<OOBILLinkArgs Condition="'@(_OOBSuppressionsXmls)' != ''" >$(OOBILLinkArgs) --link-attributes &quot;@(_OOBSuppressionsXmls->'%(FullPath)', '&quot; --link-attributes &quot;')&quot;</OOBILLinkArgs>
<OOBILLinkArgs Condition="'@(OOBLibrarySuppressionsXml)' != ''" >$(OOBILLinkArgs) --link-attributes &quot;@(OOBLibrarySuppressionsXml->'%(FullPath)', '&quot; --link-attributes &quot;')&quot;</OOBILLinkArgs>
</PropertyGroup>

<ILLink AssemblyPaths=""
RootAssemblyNames="@(_OOBsToTrim)"
ReferenceAssemblyPaths="@(_OOBReferences)"
OutputDirectory="$(LibrariesTrimmedOOBArtifactsPath)"
RootAssemblyNames="@(OOBAssemblyToTrim)"
ReferenceAssemblyPaths="@(OOBAssemblyReference)"
OutputDirectory="$(OOBAssembliesTrimmedArtifactsPath)"
ExtraArgs="$(OOBILLinkArgs)"
ToolExe="$(_DotNetHostFileName)"
ToolPath="$(_DotNetHostDirectory)" />

</Target>

</Project>
58 changes: 35 additions & 23 deletions src/libraries/illink-sharedframework.targets
Original file line number Diff line number Diff line change
@@ -1,48 +1,60 @@
<Project>

<Target Name="ILLinkTrimSharedFramework"
AfterTargets="Build"
<Target Name="GetSharedFrameworkAssembliesToTrim"
DependsOnTargets="PrepareForAssembliesTrim">

<Message Text="Trimming $(PackageRID) runtime pack assemblies with ILLinker..." Importance="high" />

<PropertyGroup>
<LibrariesTrimmedArtifactsPath>$([MSBuild]::NormalizePath('$(ILLinkTrimAssemblyArtifactsRootDir)', 'trimmed-runtimepack'))</LibrariesTrimmedArtifactsPath>
<SharedFrameworkAssembliesTrimmedArtifactsPath>$([MSBuild]::NormalizePath('$(ILLinkTrimAssemblyArtifactsRootDir)', 'trimmed-runtimepack'))</SharedFrameworkAssembliesTrimmedArtifactsPath>
</PropertyGroup>

<ItemGroup>
<!-- Include suppression XML files bin-placed in earlier per-library linker run. -->
<SharedFrameworkSuppressionsXml Include="$(ILLinkTrimAssemblyRuntimePackSuppressionsXmlsDir)*.xml" />
<!-- Collect CoreLib suppression XML files not bin-placed in earlier per-library linker run. CoreLib doesn't use bin-place logic. -->
<SharedFrameworkSuppressionsXml Include="$(CoreLibSharedDir)ILLink\ILLink.Suppressions.LibraryBuild.xml" />
<SharedFrameworkSuppressionsXml Condition="'$(RuntimeFlavor)' == 'CoreCLR'" Include="$(CoreClrProjectRoot)System.Private.CoreLib\$(ProjectILLinkSuppressionsFile).LibraryBuild.xml" />

<SharedFrameworkAssemblyToTrim Include="$(MicrosoftNetCoreAppRuntimePackRidLibTfmDir)*.dll" />
<SharedFrameworkAssemblyToTrim Include="$(SystemPrivateCoreLibPath)" />
</ItemGroup>

<ItemGroup>
<SharedFrameworkAssemblyTrimmed Include="$(SharedFrameworkAssembliesTrimmedArtifactsPath)*.*" />
</ItemGroup>

</Target>

<Target Name="ILLinkTrimSharedFramework"
AfterTargets="Build"
DependsOnTargets="GetSharedFrameworkAssembliesToTrim;PrepareForAssembliesTrim"
Inputs="$(ILLinkTasksAssembly);@(SharedFrameworkAssemblyToTrim);@(SharedFrameworkSuppressionsXml)"
Outputs="@(SharedFrameworkAssemblyTrimmed)">

<Message Text="Trimming $(PackageRID) shared framework assemblies with ILLinker..." Importance="high" />

<PropertyGroup>
<RuntimePackILLinkArgs>$(ILLinkArgs)</RuntimePackILLinkArgs>
<SharedFrameworkILLinkArgs>$(ILLinkArgs)</SharedFrameworkILLinkArgs>
<!-- update debug symbols -->
<RuntimePackILLinkArgs>$(RuntimePackILLinkArgs) -b true</RuntimePackILLinkArgs>
<SharedFrameworkILLinkArgs>$(SharedFrameworkILLinkArgs) -b true</SharedFrameworkILLinkArgs>
</PropertyGroup>

<ItemGroup>
<_LibrariesToTrim Include="$(MicrosoftNetCoreAppRuntimePackRidLibTfmDir)*.dll" />
<_LibrariesToTrim Include="$(SystemPrivateCoreLibPath)" />

<RootAssemblies Include="@(_LibrariesToTrim)">
<RootAssemblies Include="@(SharedFrameworkAssemblyToTrim)">
<RootMode>library</RootMode>
</RootAssemblies>
</ItemGroup>

<ItemGroup>
<!-- Include suppression XML files bin-placed in earlier per-library linker run. -->
<_RuntimePackSuppressionsXmls Include="$(ILLinkTrimAssemblyRuntimePackSuppressionsXmlsDir)*.xml" />

<!-- Collate CoreLib suppression XML files not bin-placed in earlier per-library linker run. CoreLib doesn't use bin-place logic. -->
<_RuntimePackSuppressionsXmls Include="$(CoreLibSharedDir)ILLink\ILLink.Suppressions.LibraryBuild.xml" />
<_RuntimePackSuppressionsXmls Condition="'$(RuntimeFlavor)' == 'CoreCLR'" Include="$(CoreClrProjectRoot)System.Private.CoreLib\$(ProjectILLinkSuppressionsFile).LibraryBuild.xml" />
</ItemGroup>

<PropertyGroup>
<RuntimePackILLinkArgs Condition="'@(_RuntimePackSuppressionsXmls)' != ''" >$(RuntimePackILLinkArgs) --link-attributes &quot;@(_RuntimePackSuppressionsXmls->'%(FullPath)', '&quot; --link-attributes &quot;')&quot;</RuntimePackILLinkArgs>
<SharedFrameworkILLinkArgs Condition="'@(SharedFrameworkSuppressionsXml)' != ''" >$(SharedFrameworkILLinkArgs) --link-attributes &quot;@(SharedFrameworkSuppressionsXml->'%(FullPath)', '&quot; --link-attributes &quot;')&quot;</SharedFrameworkILLinkArgs>
</PropertyGroup>

<ILLink AssemblyPaths=""
RootAssemblyNames="@(RootAssemblies)"
OutputDirectory="$(LibrariesTrimmedArtifactsPath)"
ExtraArgs="$(RuntimePackILLinkArgs)"
OutputDirectory="$(SharedFrameworkAssembliesTrimmedArtifactsPath)"
ExtraArgs="$(SharedFrameworkILLinkArgs)"
ToolExe="$(_DotNetHostFileName)"
ToolPath="$(_DotNetHostDirectory)" />

</Target>

</Project>

0 comments on commit 4a099dc

Please sign in to comment.