summaryrefslogtreecommitdiff
path: root/.packages/illink.tasks/0.1.5-preview-1461378/build/ILLink.Tasks.targets
diff options
context:
space:
mode:
Diffstat (limited to '.packages/illink.tasks/0.1.5-preview-1461378/build/ILLink.Tasks.targets')
-rwxr-xr-x.packages/illink.tasks/0.1.5-preview-1461378/build/ILLink.Tasks.targets528
1 files changed, 528 insertions, 0 deletions
diff --git a/.packages/illink.tasks/0.1.5-preview-1461378/build/ILLink.Tasks.targets b/.packages/illink.tasks/0.1.5-preview-1461378/build/ILLink.Tasks.targets
new file mode 100755
index 0000000000..45ca66cc2f
--- /dev/null
+++ b/.packages/illink.tasks/0.1.5-preview-1461378/build/ILLink.Tasks.targets
@@ -0,0 +1,528 @@
+<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
+
+ <PropertyGroup>
+ <_LinkTaskDirectoryRoot>$(MSBuildThisFileDirectory)../tools/</_LinkTaskDirectoryRoot>
+ <_LinkTaskTFM Condition=" '$(MSBuildRuntimeType)' == 'Core' ">netcoreapp2.0</_LinkTaskTFM>
+ <_LinkTaskTFM Condition=" '$(_LinkTaskTFM)' == '' ">net46</_LinkTaskTFM>
+ <_LinkTaskDirectory>$(_LinkTaskDirectoryRoot)$(_LinkTaskTFM)/</_LinkTaskDirectory>
+ <LinkTaskDllPath Condition=" '$(LinkTaskDllPath)' == '' ">$(_LinkTaskDirectory)ILLink.Tasks.dll</LinkTaskDllPath>
+ </PropertyGroup>
+
+ <PropertyGroup>
+ <!-- LinkDuringPublish allows the linker to be disabled by passing
+ a property on the command-line. (/p:LinkDuringPublish=false)
+ -->
+ <LinkDuringPublish Condition=" '$(LinkDuringPublish)' == '' ">true</LinkDuringPublish>
+ <LinkDuringPublish Condition=" '$(LinkDuringPublish)' != 'true' ">false</LinkDuringPublish>
+ <ShowLinkerSizeComparison Condition=" '$(ShowLinkerSizeComparison)' == '' ">false</ShowLinkerSizeComparison>
+ <LinkerDumpDependencies Condition=" '$(LinkerDumpDependencies)' == '' ">false</LinkerDumpDependencies>
+ <UsedApplicationAssemblyAction Condition=" '$(UsedApplicationAssemblyAction)' == '' ">Copy</UsedApplicationAssemblyAction>
+ <UnusedApplicationAssemblyAction Condition=" '$(UnusedApplicationAssemblyAction)' == '' ">Delete</UnusedApplicationAssemblyAction>
+ <UsedPlatformAssemblyAction Condition=" '$(UsedPlatformAssemblyAction)' == '' and '$(SelfContained)' == 'true' ">AddBypassNGen</UsedPlatformAssemblyAction>
+ <UsedPlatformAssemblyAction Condition=" '$(UsedPlatformAssemblyAction)' == '' ">Skip</UsedPlatformAssemblyAction>
+ <UnusedPlatformAssemblyAction Condition=" '$(UnusedPlatformAssemblyAction)' == '' and '$(SelfContained)' == 'true' ">Delete</UnusedPlatformAssemblyAction>
+ <UnusedPlatformAssemblyAction Condition=" '$(UnusedPlatformAssemblyAction)' == '' ">Skip</UnusedPlatformAssemblyAction>
+ <RootAllApplicationAssemblies Condition=" '$(RootAllApplicationAssemblies)' == '' ">true</RootAllApplicationAssemblies>
+ <RootAllApplicationAssemblies Condition=" '$(RootAllApplicationAssemblies)' != 'true' ">false</RootAllApplicationAssemblies>
+ <LinkerTrimNativeDeps Condition=" '$(LinkerTrimNativeDeps)' == '' ">true</LinkerTrimNativeDeps>
+ <LinkerTrimNativeDeps Condition=" '$(LinkerTrimNativeDeps)' != 'true' ">false</LinkerTrimNativeDeps>
+ <ClearInitLocals Condition=" '$(ClearInitLocals)' == '' ">false</ClearInitLocals>
+ </PropertyGroup>
+
+ <!-- This depends on LinkDuringPublish, so it needs to be imported
+ after the property is set. -->
+ <Import Project="$(MSBuildThisFileDirectory)ILLink.CrossGen.targets" />
+
+ <ItemGroup>
+ <!-- LinkerRootDescriptors (the ItemGroup) is set to contain
+ LinkerRootDescriptors (the Property), which allows adding
+ linker roots on the command-line
+ (/p:LinkerRootDescriptors=path/to/a.xml;path/to/b.xml;). These
+ are relative paths from the project to the xml file.
+ LinkerRootDescriptors (the ItemGroup) can also be set in the
+ project file, and these will be included in addition to those
+ specified on the command-line. -->
+ <LinkerRootDescriptors Include="$(LinkerRootDescriptors)" />
+ </ItemGroup>
+
+ <!-- By default, the linker will generate roots for the intermediate
+ assembly that root everything in the assembly. -->
+ <PropertyGroup>
+ <_IntermediateRootDescriptorName Condition=" '$(_IntermediateRootDescriptorName)' == '' ">IntermediateAssemblyRoots.xml</_IntermediateRootDescriptorName>
+ <_IntermediateRootDescriptorPath Condition=" '$(_IntermediateRootDescriptorPath)' == '' ">$(IntermediateOutputPath)$(_IntermediateRootDescriptorName)</_IntermediateRootDescriptorPath>
+ </PropertyGroup>
+
+ <!-- The linker will place linked assemblies into an intermediate
+ directory, and hook into the rest of the publish pipeline to
+ publish the linked assemblies instead of those given as input
+ to the linker. -->
+ <PropertyGroup>
+ <IntermediateLinkDirName Condition=" '$(IntermediateLinkDirName)' == '' ">linked</IntermediateLinkDirName>
+ <IntermediateLinkDir Condition=" '$(IntermediateLinkDir)' == '' ">$(IntermediateOutputPath)$(IntermediateLinkDirName)</IntermediateLinkDir>
+ </PropertyGroup>
+
+ <!-- Used to enable incremental build for the link target. -->
+ <PropertyGroup>
+ <_LinkSemaphore>$(IntermediateOutputPath)Link.semaphore</_LinkSemaphore>
+ </PropertyGroup>
+
+ <!--
+ This target runs the linker during the publish pipeline. The
+ publish pipeline has a target called ComputeFilesToPublish,
+ which computes the ItemGroup ResolvedFileToPublish. To extend
+ this target, we insert a target before
+ ComputeFilesToPublish. Our target rewrites the relevant inputs
+ (@(IntermediateAssembly), @(ResolvedAssembliesToPublish)). This
+ lets ComputeFilesToPublish be ignorant of the linker, but
+ changes the meaning of IntermediateAssembly and
+ ResolvedAssembliesToPublish.
+
+ To include linked pdbs in the publish output, we also rewrite
+ the ComputeFilesToPublish input
+ @(_DebugSymbolsIntermediatePath). Note that this is a private
+ itemgroup, so relying on this is not ideal.
+ -->
+ <!-- DependsOnTargets here doesn't include the targets that compute
+ ResolvedAssembliesToPublish or IntermediateAssembly, because
+ ComputeFilesToPublish already depends on
+ these. BeforeTargets="ComputeFilesToPublish" ensures that
+ ComputeLinkedFilesToPublish will run before
+ ComputeFilesToPublish, but after all of its dependencies. -->
+ <Target Name="ComputeLinkedFilesToPublish"
+ BeforeTargets="ComputeFilesToPublish"
+ DependsOnTargets="_ComputeLinkedAssemblies;_FindNativeDeps"
+ Condition=" '$(LinkDuringPublish)' == 'true' ">
+ <!-- Rewrite ResolvedAssembliesToPublish, which is an input to
+ ComputeFilesToPublish. -->
+ <ItemGroup>
+ <ResolvedAssembliesToPublish Remove="@(_ManagedAssembliesToLink)" />
+ <ResolvedAssembliesToPublish Remove="@(_NativeResolvedDepsToPublish)" />
+ <ResolvedAssembliesToPublish Include="@(_NativeKeptDepsToPublish)" />
+ <ResolvedAssembliesToPublish Include="@(_LinkedResolvedAssemblies)" />
+ </ItemGroup>
+
+ <!-- Rewrite IntermediateAssembly, which is an input to
+ ComputeFilesToPublish. -->
+ <ItemGroup>
+ <IntermediateAssembly Remove="@(IntermediateAssembly)" />
+ <IntermediateAssembly Include="@(_LinkedIntermediateAssembly)" />
+ </ItemGroup>
+
+ <!-- Rewrite _DebugSymbolsIntermediatePath, which is an input to
+ ComputeFilesToPublish. -->
+ <ItemGroup>
+ <_DebugSymbolsIntermediatePath Remove="@(_DebugSymbolsIntermediatePath)" Condition=" '$(_DebugSymbolsProduced)' == 'true' " />
+ <_DebugSymbolsIntermediatePath Include="@(_LinkedDebugSymbols)" Condition=" '$(_DebugSymbolsProduced)' == 'true' " />
+ </ItemGroup>
+ </Target>
+
+ <!-- The SDK has a target called ComputeRefAssembliesToPublish that
+ runs after ComputeFilesToPublish and rewrites
+ ResolvedFileToPublish to include any reference assemblies that
+ aren't in ResolvedAssembliesToPublish. Because
+ ComputeLinkedFilesToPublish changes ResolvedAssembliesToPublish
+ (replacing the original assemblies with linked assemblies),
+ this would change the behavior of
+ ComputeRefAssembliesToPublish, resulting in extra assemblies
+ being placed in the refs directory of the output. To prevent
+ this, we save ResolvedAssembliesToPublish before linking, and
+ restore it to its pre-link state before
+ ComputeRefAssembliesToPublish. -->
+ <Target Name="SaveResolvedAssembliesToPublish"
+ BeforeTargets="ComputeLinkedFilesToPublish">
+ <ItemGroup>
+ <PreLinkResolvedAssembliesToPublish Include="@(ResolvedAssembliesToPublish)" />
+ </ItemGroup>
+ </Target>
+ <Target Name="RestoreResolvedAssembliesToPublish"
+ BeforeTargets="ComputeRefAssembliesToPublish">
+ <ItemGroup>
+ <ResolvedAssembliesToPublish Remove="@(ResolvedAssembliesToPublish)" />
+ <ResolvedAssembliesToPublish Include="@(PreLinkResolvedAssembliesToPublish)" />
+ </ItemGroup>
+ </Target>
+
+ <!-- Print out a size comparison report for the linked
+ assemblies. This is disabled by default, but can be turned on
+ by setting $(ShowLinkerSizeComparison) to true. This runs after
+ the ComputeFilesToPublish, so it is output even during
+ incremental builds and takes into account all transformations
+ on the files to be published, including link and crossgen. -->
+ <UsingTask TaskName="CompareAssemblySizes" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="_CompareLinkedAssemblySizes"
+ AfterTargets="ComputeFilesToPublish"
+ DependsOnTargets="_ComputeManagedAssembliesToLink;_ComputeLinkedAssemblies"
+ Condition=" '$(LinkDuringPublish)' == 'true' And '$(ShowLinkerSizeComparison)' == 'true' ">
+ <FilterByMetadata Items="@(ResolvedAssembliesToPublish);@(IntermediateAssembly)"
+ MetadataName="Filename"
+ MetadataValues="@(_ManagedAssembliesToLink->'%(Filename)')">
+ <Output TaskParameter="FilteredItems" ItemName="_FinalAssembliesTouchedByLinker" />
+ </FilterByMetadata>
+ <CompareAssemblySizes UnlinkedAssemblies="@(_ManagedAssembliesToLink)"
+ LinkedAssemblies="@(_FinalAssembliesTouchedByLinker)" />
+ </Target>
+
+
+ <!-- Computes _LinkedResolvedAssemblies,
+ _LinkedIntermediateAssembly, and
+ _LinkedDebugSymbols. _LinkedResolvedAssemblies needs to keep
+ metadata from _ManagedResolvedAssembliesToPublish, since this
+ is used by ComputeFilesToPublish. -->
+ <Target Name="_ComputeLinkedAssemblies"
+ DependsOnTargets="_ComputeManagedResolvedAssembliesToPublish;ILLink">
+ <ItemGroup>
+ <__LinkedResolvedAssemblies Include="@(_ManagedResolvedAssembliesToPublish->'$(IntermediateLinkDir)/%(Filename)%(Extension)')" />
+ <__LinkedResolvedAssemblies Remove="@(_DuplicateManagedAssembliesToSkip->'$(IntermediateLinkDir)/%(Filename)%(Extension)')" />
+ <_LinkedResolvedAssemblies Include="@(__LinkedResolvedAssemblies)" Condition="Exists('%(Identity)')" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <__LinkedIntermediateAssembly Include="@(IntermediateAssembly->'$(IntermediateLinkDir)/%(Filename)%(Extension)')" />
+ <_LinkedIntermediateAssembly Include="@(__LinkedIntermediateAssembly)" Condition="Exists('%(Identity)')" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <__LinkedDebugSymbols Include="@(_DebugSymbolsIntermediatePath->'$(IntermediateLinkDir)/%(Filename)%(Extension)')"
+ Condition=" '$(_DebugSymbolsProduced)' == 'true' " />
+ <_LinkedDebugSymbols Include="@(__LinkedDebugSymbols)"
+ Condition="Exists('%(Identity)') And '$(_DebugSymbolsProduced)' == 'true' " />
+ </ItemGroup>
+
+ </Target>
+
+ <!-- Compute the default set of assemblies to crossgen after
+ linking. This will include any assemblies modified by the
+ linker that were crossgen'd before linking. -->
+ <Target Name="_ComputeLinkedAssembliesToCrossgen"
+ AfterTargets="_ComputeLinkedAssemblies"
+ Condition=" '$(CrossGenDuringPublish)' == 'true' ">
+ <FilterByMetadata Items="@(_ManagedResolvedAssembliesToPublish);@(IntermediateAssembly)"
+ MetadataName="Filename"
+ MetadataValues="@(_LinkedResolvedAssemblies->'%(Filename)');@(_LinkedIntermediateAssembly->'%(Filename)')">
+ <Output TaskParameter="FilteredItems" ItemName="_OriginalLinkedAssemblies" />
+ </FilterByMetadata>
+
+ <ComputeCrossgenedAssemblies Assemblies="@(_OriginalLinkedAssemblies)">
+ <Output TaskParameter="CrossgenedAssemblies" ItemName="_OriginalLinkedAssembliesThatWereCrossgened" />
+ </ComputeCrossgenedAssemblies>
+
+ <!-- Ideally, we would remember which assemblies were R2R and
+ which were fragile crossgen-ed, and do the same after
+ linking. Currently this makes no difference because
+ System.Private.CoreLib is the only fragile image, and it
+ can't be ready-to-run crossgen-ed. -->
+ <ItemGroup>
+ <_LinkedAssembliesToCrossgen Include="@(_OriginalLinkedAssembliesThatWereCrossgened->'$(IntermediateLinkDir)/%(Filename)%(Extension)')" />
+ <FilesToCrossgen Include="@(_LinkedAssembliesToCrossgen)" />
+ </ItemGroup>
+
+ </Target>
+
+ <UsingTask TaskName="SetAssemblyActions" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="_SetAssemblyActions"
+ DependsOnTargets="_ComputeManagedAssembliesToLink;_ComputePlatformLibraries">
+
+ <ItemGroup>
+ <_PlatformAssembliesToLink Include="@(PlatformLibraries->'%(Filename)')" />
+ <_ApplicationAssembliesToLink Include="@(_ManagedAssembliesToLink->'%(Filename)')" />
+ <_ApplicationAssembliesToLink Remove="@(_PlatformAssembliesToLink)" />
+ </ItemGroup>
+
+ <SetAssemblyActions AssemblyPaths="@(_ManagedAssembliesToLink)"
+ ApplicationAssemblyNames="@(_ApplicationAssembliesToLink)"
+ PlatformAssemblyNames="@(_PlatformAssembliesToLink)"
+ UsedApplicationAssemblyAction="$(UsedApplicationAssemblyAction)"
+ UnusedApplicationAssemblyAction="$(UnusedApplicationAssemblyAction)"
+ UsedPlatformAssemblyAction="$(UsedPlatformAssemblyAction)"
+ UnusedPlatformAssemblyAction="$(UnusedPlatformAssemblyAction)">
+ <Output TaskParameter="AssemblyPathsWithActions" ItemName="_ManagedAssembliesToLinkWithActions" />
+ </SetAssemblyActions>
+
+ <ItemGroup>
+ <_ManagedAssembliesToLink Remove="@(_ManagedAssembliesToLink)" />
+ <_ManagedAssembliesToLink Include="@(_ManagedAssembliesToLinkWithActions)" />
+ </ItemGroup>
+
+ </Target>
+
+ <!-- This calls the linker. Inputs are the managed assemblies to
+ link, and root specifications. The semaphore enables msbuild to
+ skip linking during an incremental build, when the semaphore is
+ up to date with respect to _ManagedAssembliesToLink. -->
+ <UsingTask TaskName="ILLink" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="ILLink"
+ DependsOnTargets="_ComputeManagedAssembliesToLink;_ComputeLinkerRootAssemblies;_ComputeLinkerRootDescriptors;_SetAssemblyActions"
+ Inputs="@(_ManagedAssembliesToLink);@(LinkerRootDescriptors);$(MSBuildAllProjects)"
+ Outputs="$(_LinkSemaphore)">
+ <!-- These extra arguments have been hard-coded for now, as this
+ is what we want to use when linking a self-contained app. In
+ the future we will want to generate these depending on the
+ scenario in which the linker is invoked. -->
+ <PropertyGroup>
+ <ExtraLinkerArgs Condition=" '$(ExtraLinkerArgs)' == '' ">-t -l none -b true --skip-unresolved true --verbose</ExtraLinkerArgs>
+ </PropertyGroup>
+ <ILLink AssemblyPaths="@(_ManagedAssembliesToLink)"
+ RootAssemblyNames="@(LinkerRootAssemblies)"
+ RootDescriptorFiles="@(LinkerRootDescriptors)"
+ OutputDirectory="$(IntermediateLinkDir)"
+ DumpDependencies="$(LinkerDumpDependencies)"
+ ClearInitLocals="$(ClearInitLocals)"
+ ClearInitLocalsAssemblies="$(ClearInitLocalsAssemblies)"
+ ExtraArgs="$(ExtraLinkerArgs)" />
+
+ <Touch Files="$(_LinkSemaphore)" AlwaysCreate="true">
+ <Output TaskParameter="TouchedFiles" ItemName="FileWrites" />
+ </Touch>
+ </Target>
+
+ <!-- FindNativeDeps scans the managed assemblies kept by the linker
+ to find references to native files. It outputs the found native
+ dependencies, and these are prevented from being published. -->
+ <UsingTask TaskName="FindNativeDeps" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="_FindNativeDeps"
+ DependsOnTargets="_ComputeLinkedAssemblies"
+ Condition=" '$(LinkerTrimNativeDeps)' == 'true' ">
+ <ItemGroup>
+ <_NativeResolvedDepsToPublish Include="@(ResolvedAssembliesToPublish)" />
+ <_NativeResolvedDepsToPublish Remove="@(_ManagedResolvedAssembliesToPublish)" />
+ <_NativeResolvedDepsToPublish Remove="@(_NativeResolvedDepsToPublish->WithMetadataValue('AssetType', 'resources'))" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <_ManagedLinkedAssemblies Include="@(_LinkedResolvedAssemblies)" />
+ <_ManagedLinkedAssemblies Include="@(_LinkedIntermediateAssembly)" />
+ </ItemGroup>
+
+ <ItemGroup>
+ <_NativeDepsToAlwaysKeep Include="coreclr.dll;libcoreclr.dylib;libcoreclr.so" />
+ <_NativeDepsToAlwaysKeep Include="clrjit.dll;libclrjit.dylib;libclrjit.so" />
+ <_NativeDepsToAlwaysKeep Include="hostfxr.dll;libhostfxr.dylib;libhostfxr.so" />
+ <_NativeDepsToAlwaysKeep Include="hostpolicy.dll;libhostpolicy.dylib;libhostpolicy.so" />
+ </ItemGroup>
+
+ <FindNativeDeps ManagedAssemblyPaths="@(_ManagedLinkedAssemblies);@(_DuplicateManagedAssembliesToSkip)"
+ NativeDepsPaths="@(_NativeResolvedDepsToPublish)"
+ NativeDepsToKeep="@(_NativeDepsToAlwaysKeep)">
+ <Output TaskParameter="KeptNativeDepsPaths" ItemName="_NativeKeptDepsToPublish" />
+ </FindNativeDeps>
+
+ </Target>
+
+ <!-- Computes the managed assemblies that are input to the
+ linker. Includes managed assemblies from
+ ResolvedAssembliesToPublish, and IntermediateAssembly. -->
+ <UsingTask TaskName="FindDuplicatesByMetadata" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="_ComputeManagedAssembliesToLink"
+ DependsOnTargets="_ComputeManagedResolvedAssembliesToPublish">
+ <ItemGroup>
+ <_ManagedAssembliesToLink Include="@(IntermediateAssembly)" />
+ <_ManagedAssembliesToLink Include="@(_ManagedResolvedAssembliesToPublish)" />
+ </ItemGroup>
+
+ <!-- Remove duplicate implementation dlls. This can happen if a
+ portable app has platform-specific managed assemblies. The
+ linker isn't currently able to analyze multiple assemblies
+ with the same identity, so we skip these, keeping only one
+ representative assembly from each set of duplicates. -->
+ <FindDuplicatesByMetadata Items="@(_ManagedAssembliesToLink)"
+ MetadataName="Filename">
+ <Output TaskParameter="DuplicateItems" ItemName="_DuplicateManagedAssemblies" />
+ <Output TaskParameter="DuplicateRepresentatives" ItemName="_DuplicateManagedAssembliesToLink" />
+ </FindDuplicatesByMetadata>
+ <ItemGroup>
+ <_DuplicateManagedAssembliesToSkip Include="@(_DuplicateManagedAssemblies)" />
+ <_DuplicateManagedAssembliesToSkip Remove="@(_DuplicateManagedAssembliesToLink)" />
+ <_ManagedAssembliesToLink Remove="@(_DuplicateManagedAssembliesToSkip)" />
+ </ItemGroup>
+
+ <!-- Portable publish: need to supply the linker with any needed
+ reference assemblies as well.
+
+ Sometimes assemblies have separate reference and
+ implementation assemblies. In these cases, prefer the
+ implementation assembly, and prevent inclusion of the ref
+ assembly by filtering on filename instead of the full
+ path. -->
+ <FilterByMetadata Items="@(ReferencePath->'%(ResolvedPath)')"
+ MetadataName="Filename"
+ MetadataValues="@(_ManagedAssembliesToLink->'%(Filename)')"
+ Condition=" '$(SelfContained)' != 'true' ">
+ <Output TaskParameter="FilteredItems" ItemName="_ReferencedLibrariesToExclude" />
+ </FilterByMetadata>
+ <ItemGroup Condition=" '$(SelfContained)' != 'true' ">
+ <_ReferencedLibraries Include="@(ReferencePath->'%(ResolvedPath)')" Exclude="@(_ReferencedLibrariesToExclude)" />
+ <_ManagedAssembliesToLink Include="@(_ReferencedLibraries)" />
+ </ItemGroup>
+
+ </Target>
+
+
+ <!-- Computes the managed subset of
+ ResolvedAssembliesToPublish. This needs to preserve metadata,
+ because it is later used to compute the linked assemblies with
+ metadata that gets used by the rest of the publish
+ pipeline. This needs to run even during incremental build,
+ because we use the list of managed assemblies to filter the
+ publish output. -->
+ <UsingTask TaskName="ComputeManagedAssemblies" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="_ComputeManagedResolvedAssembliesToPublish">
+ <!-- TODO: Is there a better way to get the managed assemblies
+ from ResolvedAssembliesToPublish? We may be able to check for
+ AssetType="runtime" on managed assemblies - would that give
+ the same set of assemblies? -->
+ <ComputeManagedAssemblies Assemblies="@(ResolvedAssembliesToPublish)">
+ <Output TaskParameter="ManagedAssemblies" ItemName="_ManagedResolvedAssembliesToPublish" />
+ </ComputeManagedAssemblies>
+ <!-- For now, hard-code System.Private.CoreLib.ni, the only .ni
+ file we've been encountering. This is a special case matching
+ how we compute the linker roots by default - we always root
+ System.Private.CoreLib, so we want to keep it in the publish
+ output and the generated deps.json file. Excluding it from
+ _ManagedResolvedAssembliesToPublish will prevent it from
+ getting filtered out of the publish output later.
+
+ In the future we may want to detect ngen assemblies and
+ filter them more robustly. -->
+ <!-- TODO: Which .ni files do we expect to be in
+ ResolvedAssembliesToPublish? -->
+ <ItemGroup>
+ <_ManagedResolvedAssembliesToPublish Remove="@(_ManagedResolvedAssembliesToPublish->WithMetadataValue('Filename', 'System.Private.CoreLib.ni'))" />
+ </ItemGroup>
+ <!-- Some of the managed dlls are satellite assemblies containing
+ binary resources that we don't want to link. -->
+ <ItemGroup>
+ <_ManagedResolvedAssembliesToPublish Remove="@(_ManagedResolvedAssembliesToPublish->WithMetadataValue('AssetType', 'resources'))" />
+ </ItemGroup>
+ </Target>
+
+
+ <!-- Compute the assemblies the linker should mark as roots. By
+ default, these are passed as "-a", but this is an
+ implementation detail of the link task and should not be relied
+ upon in general. In the future we may add other inputs to the
+ link task to control how these are rooted.
+ -->
+ <!-- We may want to add an additional mode in which we root only the
+ assembly we have built, rooting all entry points visible from
+ the outside of the assembly. We need to discuss whether this
+ even makes sense during publish, since typically libraries get
+ packaged via "dotnet pack", and the pack task takes input from
+ build, not from publish. Thus linking the library itself should
+ be part of the build step or pack step, OR pack could be made
+ to work on the publish output. -->
+ <Target Name="_ComputeLinkerRootAssemblies"
+ DependsOnTargets="_ComputeManagedResolvedAssembliesToPublish;_ComputePlatformLibraries;_CheckSystemPrivateCorelibEmbeddedRoots">
+ <!-- If RootAllApplicationAssemblies is true, roots are everything
+ minus the framework assemblies. This doesn't include the
+ intermediate assembly, because we root it separately using an
+ xml file, which lets us explicitly root everything.
+
+ If RootAllApplicationAssemblies is false, only intermediate
+ assembly's Main method is rooted.
+
+ System.Private.CoreLib is rooted unless it has an embedded
+ xml descriptor file. -->
+
+ <ItemGroup Condition=" '$(RootAllApplicationAssemblies)' == 'true' ">
+ <_LinkerRootAssemblies Include="@(_ManagedResolvedAssembliesToPublish->'%(Filename)')" />
+ <_LinkerRootAssemblies Remove="@(PlatformLibraries->'%(Filename)')" />
+ </ItemGroup>
+ <RemoveDuplicates Inputs="@(_LinkerRootAssemblies)"
+ Condition=" '$(RootAllApplicationAssemblies)' == 'true' ">
+ <Output TaskParameter="Filtered" ItemName="_UniqueLinkerRootAssemblies" />
+ </RemoveDuplicates>
+ <ItemGroup Condition=" '$(RootAllApplicationAssemblies)' == 'true' ">
+ <LinkerRootAssemblies Include="@(_UniqueLinkerRootAssemblies)" />
+ </ItemGroup>
+
+ <ItemGroup Condition=" '$(RootAllApplicationAssemblies)' == 'false' ">
+ <LinkerRootAssemblies Include="@(IntermediateAssembly)" />
+ </ItemGroup>
+
+ <ItemGroup Condition=" '$(_SPCHasEmbeddedRootDescriptor)' != 'true' ">
+ <LinkerRootAssemblies Include="@(_ManagedResolvedAssembliesToPublish->'%(Filename)')" Condition=" '%(Filename)' == 'System.Private.CoreLib' " />
+ </ItemGroup>
+
+ </Target>
+
+ <UsingTask TaskName="CheckEmbeddedRootDescriptor" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="_CheckSystemPrivateCorelibEmbeddedRoots" Condition=" '$(SelfContained)' == 'true' "
+ DependsOnTargets="_ComputeManagedAssembliesToLink">
+ <CheckEmbeddedRootDescriptor AssemblyPath="@(_ManagedAssembliesToLink->WithMetadataValue('Filename', 'System.Private.CoreLib'))">
+ <Output TaskParameter="HasEmbeddedRootDescriptor" PropertyName="_SPCHasEmbeddedRootDescriptor" />
+ </CheckEmbeddedRootDescriptor>
+ </Target>
+
+ <!-- Platform libraries are the managed runtime assets needed by the
+ "platform", currently Microsoft.NETCore.App. -->
+ <UsingTask TaskName="GetRuntimeLibraries" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="_ComputePlatformLibraries"
+ DependsOnTargets="_ComputeManagedAssembliesToLink">
+ <GetRuntimeLibraries Condition=" '$(SelfContained)' == 'true' "
+ AssetsFilePath="$(ProjectAssetsFile)"
+ TargetFramework="$(TargetFrameworkMoniker)"
+ RuntimeIdentifier="$(RuntimeIdentifier)"
+ PackageNames="$(MicrosoftNETPlatformLibrary)">
+ <Output TaskParameter="RuntimeLibraries" ItemName="PlatformLibraries" />
+ </GetRuntimeLibraries>
+
+ <ItemGroup>
+ <PlatformLibraries Include="@(_ManagedAssembliesToLink)" Condition=" '%(Filename)' == 'System.Private.CoreLib' " />
+ </ItemGroup>
+
+ <ItemGroup Condition=" '$(SelfContained)' != 'true' ">
+ <!-- Portable publish: computed referenced-not-published set in _ComputeManagedAssembliesToLink -->
+ <PlatformLibraries Include="@(_ReferencedLibraries)" />
+ </ItemGroup>
+ </Target>
+
+
+ <!-- This target prepares the LinkerRootDescriptors itemgroup for
+ input to the link task. In addition to including user-specified
+ LinkerRootDescriptors in the ItemGroup statically above, we
+ dynamically include the generated descriptor files for the
+ intermediate assembly. -->
+ <Target Name="_ComputeLinkerRootDescriptors"
+ DependsOnTargets="_GenerateIntermediateRootDescriptor"
+ Condition=" '$(RootAllApplicationAssemblies)' == 'true' ">
+ <ItemGroup>
+ <LinkerRootDescriptors Include="$(_IntermediateRootDescriptorPath)" />
+ </ItemGroup>
+ </Target>
+
+
+ <!-- Generates the xml root descriptor file that completely roots
+ the intermediate assembly. -->
+ <UsingTask TaskName="CreateRootDescriptorFile" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="_GenerateIntermediateRootDescriptor"
+ Inputs="@(IntermediateAssembly)"
+ Outputs="$(_IntermediateRootDescriptorPath)"
+ Condition=" '$(RootAllApplicationAssemblies)' == 'true' ">
+ <CreateRootDescriptorFile AssemblyNames="@(IntermediateAssembly->'%(Filename)')"
+ RootDescriptorFilePath="$(_IntermediateRootDescriptorPath)" />
+ </Target>
+
+ <!-- Uses _PublishConflictPackageFiles, an input to the publish deps
+ file generation target, to exclude the removed managed
+ assemblies and native dependencies from the generated deps
+ file. -->
+ <UsingTask TaskName="ComputeRemovedAssemblies" AssemblyFile="$(LinkTaskDllPath)" />
+ <Target Name="_ExcludeRemovedFilesFromDepFileGeneration"
+ DependsOnTargets="_ComputeManagedResolvedAssembliesToPublish;_ComputeLinkedAssemblies;_FindNativeDeps;_HandlePublishFileConflicts"
+ BeforeTargets="GeneratePublishDependencyFile"
+ Condition=" '$(LinkDuringPublish)' == 'true' ">
+ <ComputeRemovedAssemblies InputAssemblies="@(_ManagedAssembliesToLink)"
+ KeptAssemblies="@(_LinkedResolvedAssemblies)">
+ <Output TaskParameter="RemovedAssemblies" ItemName="_RemovedManagedAssemblies" />
+ </ComputeRemovedAssemblies>
+
+ <ItemGroup>
+ <_RemovedNativeDeps Include="@(_NativeResolvedDepsToPublish)" />
+ <_RemovedNativeDeps Remove="@(_NativeKeptDepsToPublish)" />
+
+ <_PublishConflictPackageFiles Include="@(_RemovedManagedAssemblies)" />
+ <_PublishConflictPackageFiles Include="@(_RemovedNativeDeps)" />
+ </ItemGroup>
+ </Target>
+
+</Project>