1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
4 <TargetsTriggeredByCompilation>
5 $(TargetsTriggeredByCompilation);
7 </TargetsTriggeredByCompilation>
10 <!-- Inputs and outputs of ILLinkTrimAssembly -->
12 <ILLinkTasksToolsDir>$(PackagesDir)/illink.tasks/$(ILLinkTasksPackageVersion)/tools</ILLinkTasksToolsDir>
13 <ILLinkTasksDir>$(ILLinkTasksToolsDir)/net46/</ILLinkTasksDir>
14 <ILLinkTasksDir Condition="'$(MSBuildRuntimeType)' == 'Core'">$(ILLinkTasksToolsDir)/netcoreapp2.0/</ILLinkTasksDir>
15 <ILLinkTasksPath>$(ILLinkTasksDir)ILLink.Tasks.dll</ILLinkTasksPath>
16 <ILLinkTrimAssembly Condition="'$(ILLinkTrimAssembly)' == ''">true</ILLinkTrimAssembly>
17 <ILLinkTrimAssemblyPath>$(IntermediateOutputPath)$(TargetName)$(TargetExt)</ILLinkTrimAssemblyPath>
18 <ILLinkTrimAssemblySymbols>$(IntermediateOutputPath)$(TargetName).pdb</ILLinkTrimAssemblySymbols>
19 <ILLinkTrimInputPath>$(IntermediateOutputPath)PreTrim/</ILLinkTrimInputPath>
20 <ILLinkTrimInputAssembly>$(ILLinkTrimInputPath)$(TargetName)$(TargetExt)</ILLinkTrimInputAssembly>
21 <ILLinkTrimInputSymbols>$(ILLinkTrimInputPath)$(TargetName).pdb</ILLinkTrimInputSymbols>
22 <ILLinkTrimOutputPath>$(IntermediateOutputPath)</ILLinkTrimOutputPath>
24 <!-- if building a PDB, tell illink to rewrite the symbols file -->
25 <ILLinkRewritePDBs Condition="'$(ILLinkRewritePDBs)' == '' AND '$(DebugSymbols)' != 'false'">true</ILLinkRewritePDBs>
28 <!-- Custom binplacing for pre/post-trimming and reports that is useful for analysis
29 Must be enabled by setting BinPlaceILLinkTrimAssembly=true
31 <ItemGroup Condition="'$(BinPlaceILLinkTrimAssembly)' == 'true'">
32 <BinPlaceConfiguration Include="$(BuildConfiguration)">
33 <RuntimePath>$(BinDir)ILLinkTrimAssembly/$(BuildConfiguration)/trimmed</RuntimePath>
34 <ItemName>TrimmedItem</ItemName>
35 </BinPlaceConfiguration>
36 <BinPlaceConfiguration Include="$(BuildConfiguration)">
37 <RuntimePath>$(BinDir)ILLinkTrimAssembly/$(BuildConfiguration)/reports</RuntimePath>
38 <ItemName>TrimmingReport</ItemName>
39 </BinPlaceConfiguration>
40 <BinPlaceConfiguration Include="$(BuildConfiguration)">
41 <RuntimePath>$(BinDir)ILLinkTrimAssembly/$(BuildConfiguration)/pretrimmed</RuntimePath>
42 <ItemName>PreTrimmedItem</ItemName>
43 </BinPlaceConfiguration>
46 <!-- ILLinkTrimAssembly
47 Examines the "input assembly" for IL that is unreachable from public API and trims that,
48 rewriting the assembly to an "output assembly"
50 <UsingTask TaskName="ILLink" AssemblyFile="$(ILLinkTasksPath)" />
51 <Target Name="ILLinkTrimAssembly" Condition="'$(ILLinkTrimAssembly)' == 'true'" DependsOnTargets="EnsureBuildToolsRuntime">
53 <ILLinkArgs>$(ILLinkArgs)-r $(TargetName)</ILLinkArgs>
54 <!-- default action for core assemblies -->
55 <ILLinkArgs>$(ILLinkArgs) -c skip</ILLinkArgs>
56 <!-- default action for non-core assemblies -->
57 <ILLinkArgs>$(ILLinkArgs) -u skip</ILLinkArgs>
58 <!-- trim the target assembly -->
59 <ILLinkArgs>$(ILLinkArgs) -p link $(TargetName)</ILLinkArgs>
60 <ILLinkArgs Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimAssemblySymbols)')">$(ILLinkArgs) -b true</ILLinkArgs>
61 <!-- keep types and members required by Debugger-related attributes -->
62 <ILLinkArgs>$(ILLinkArgs) -v true</ILLinkArgs>
63 <!-- don't remove the embedded root xml resource since ILLink may run again on the assembly -->
64 <ILLinkArgs>$(ILLinkArgs) --strip-resources false</ILLinkArgs>
65 <!-- reflection heuristics to apply -->
66 <ILLinkArgs>$(ILLinkArgs) -h LdtokenTypeMethods,InstanceConstructors</ILLinkArgs>
69 <MakeDir Directories="$(ILLinkTrimInputPath)" />
71 <!-- Move the assembly into a subdirectory for ILLink -->
72 <Move SourceFiles="$(ILLinkTrimAssemblyPath)"
73 DestinationFolder="$(ILLinkTrimInputPath)"
76 <!-- Move the PDB into a subdirectory for ILLink if we are rewriting PDBs -->
77 <Move SourceFiles="$(ILLinkTrimAssemblySymbols)"
78 DestinationFolder="$(ILLinkTrimInputPath)"
79 Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimAssemblySymbols)')"
82 <ILLink AssemblyPaths="$(ILLinkTrimInputAssembly)"
84 OutputDirectory="$(ILLinkTrimOutputPath)"
85 ClearInitLocals="true"
86 ClearInitLocalsAssemblies="$(TargetName)"
87 ExtraArgs="$(ILLinkArgs)" />
91 <!-- ILLink reporting.
92 Only enabled when developer specifies a path to the AsmDiff tool with property AsmDiffCmd.
93 EG: AsmDiffCmd=d:\tools\asmdiff\asmdiff.exe
94 This is necessary until the AsmDiff tool is ported to .NET Core. -->
95 <Target Name="_CreateILLinkTrimAssemblyReports"
96 AfterTargets="ILLinkTrimAssembly"
97 Condition="'$(AsmDiffCmd)' != ''">
99 <AsmDiffArgs>$(AsmDiffArgs) $(ILLinkTrimInputAssembly)</AsmDiffArgs>
100 <AsmDiffArgs>$(AsmDiffArgs) $(ILLinkTrimAssemblyPath)</AsmDiffArgs>
101 <AsmDiffArgs>$(AsmDiffArgs) -includePrivateApis -includeInternalApis -alwaysDiffMembers -diffAttributes</AsmDiffArgs>
103 <AsmDiffReport>$(IntermediateOutputPath)$(TargetName).diff.html</AsmDiffReport>
104 <AsmDiffReportArgs>$(AsmDiffArgs) -out:$(AsmDiffReport)</AsmDiffReportArgs>
105 <AsmDiffReportArgs>$(AsmDiffReportArgs) -unchanged -changed -added -removed</AsmDiffReportArgs>
107 <AsmDiffList>$(IntermediateOutputPath)$(TargetName).diff.csv</AsmDiffList>
108 <AsmDiffListArgs>$(AsmDiffArgs) -out:$(AsmDiffList)</AsmDiffListArgs>
109 <AsmDiffListArgs>$(AsmDiffListArgs) -unchanged -changed -added -removed </AsmDiffListArgs>
110 <AsmDiffListArgs>$(AsmDiffListArgs) -diffWriter:CSV</AsmDiffListArgs>
113 <Exec Command="$(AsmDiffCmd) $(AsmDiffReportArgs)" />
114 <Message Text="Assembly trimming diff: $(AsmDiffReport)" />
115 <Exec Command="$(AsmDiffCmd) $(AsmDiffListArgs)" />
116 <Message Text="Assembly trimming report: $(AsmDiffList)" />
119 <!-- Similar to _CheckForCompileOutputs and runs in the same places,
120 always set these even if compile didn't run. -->
121 <Target Name="_CheckForILLinkTrimAssemblyOutputs"
122 BeforeTargets="CopyFilesToOutputDirectory;_CleanGetCurrentAndPriorFileWrites"
123 Condition="'$(ILLinkTrimAssembly)' == 'true'">
125 <PreTrimmedItem Condition="Exists('$(ILLinkTrimInputAssembly)')" Include="$(ILLinkTrimInputAssembly)" />
126 <PreTrimmedItem Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimInputSymbols)')" Include="$(ILLinkTrimInputSymbols)" />
127 <FileWrites Include="@(PreTrimmedItem)" />
129 <TrimmedItem Condition="Exists('$(ILLinkTrimAssemblyPath)')" Include="$(ILLinkTrimAssemblyPath)" />
130 <TrimmedItem Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimAssemblySymbols)')" Include="$(ILLinkTrimAssemblySymbols)" />
132 <TrimmingReport Condition="Exists('$(AsmDiffReport)')" Include="$(AsmDiffReport)" />
133 <TrimmingReport Condition="Exists('$(AsmDiffList)')" Include="$(AsmDiffList)" />