Merge pull request #17233 from fiigii/portvectortests
[platform/upstream/coreclr.git] / src / mscorlib / ILLink.targets
1 <?xml version="1.0" encoding="utf-8"?>
2 <Project ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
3   <PropertyGroup>
4     <TargetsTriggeredByCompilation>
5       $(TargetsTriggeredByCompilation);
6       ILLinkTrimAssembly
7     </TargetsTriggeredByCompilation>
8   </PropertyGroup>
9
10   <!-- Inputs and outputs of ILLinkTrimAssembly -->
11   <PropertyGroup>
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>
23
24     <!-- if building a PDB, tell illink to rewrite the symbols file -->
25     <ILLinkRewritePDBs Condition="'$(ILLinkRewritePDBs)' == '' AND '$(DebugSymbols)' != 'false'">true</ILLinkRewritePDBs>
26   </PropertyGroup>
27
28   <!-- Custom binplacing for pre/post-trimming and reports that is useful for analysis 
29        Must be enabled by setting BinPlaceILLinkTrimAssembly=true
30   --> 
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>
44   </ItemGroup>
45
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"
49   -->
50   <UsingTask TaskName="ILLink" AssemblyFile="$(ILLinkTasksPath)" />
51   <Target Name="ILLinkTrimAssembly" Condition="'$(ILLinkTrimAssembly)' == 'true'" DependsOnTargets="EnsureBuildToolsRuntime">
52     <PropertyGroup>
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>
67     </PropertyGroup>
68
69     <MakeDir Directories="$(ILLinkTrimInputPath)" />
70
71     <!-- Move the assembly into a subdirectory for ILLink -->
72     <Move SourceFiles="$(ILLinkTrimAssemblyPath)"
73           DestinationFolder="$(ILLinkTrimInputPath)"
74     />
75
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)')"
80     />
81
82     <ILLink AssemblyPaths="$(ILLinkTrimInputAssembly)"
83             RootAssemblyNames=""
84             OutputDirectory="$(ILLinkTrimOutputPath)"
85             ClearInitLocals="true"
86             ClearInitLocalsAssemblies="$(TargetName)"
87             ExtraArgs="$(ILLinkArgs)" />
88
89   </Target>
90
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)' != ''">
98     <PropertyGroup>
99       <AsmDiffArgs>$(AsmDiffArgs) $(ILLinkTrimInputAssembly)</AsmDiffArgs>
100       <AsmDiffArgs>$(AsmDiffArgs) $(ILLinkTrimAssemblyPath)</AsmDiffArgs>
101       <AsmDiffArgs>$(AsmDiffArgs) -includePrivateApis -includeInternalApis -alwaysDiffMembers -diffAttributes</AsmDiffArgs>
102
103       <AsmDiffReport>$(IntermediateOutputPath)$(TargetName).diff.html</AsmDiffReport>
104       <AsmDiffReportArgs>$(AsmDiffArgs) -out:$(AsmDiffReport)</AsmDiffReportArgs>
105       <AsmDiffReportArgs>$(AsmDiffReportArgs) -unchanged -changed -added -removed</AsmDiffReportArgs>
106
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>
111     </PropertyGroup>
112
113     <Exec Command="$(AsmDiffCmd) $(AsmDiffReportArgs)" />
114     <Message Text="Assembly trimming diff: $(AsmDiffReport)" />
115     <Exec Command="$(AsmDiffCmd) $(AsmDiffListArgs)" />
116     <Message Text="Assembly trimming report: $(AsmDiffList)" />
117   </Target>
118   
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'">
124     <ItemGroup>
125       <PreTrimmedItem Condition="Exists('$(ILLinkTrimInputAssembly)')" Include="$(ILLinkTrimInputAssembly)" />
126       <PreTrimmedItem Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimInputSymbols)')" Include="$(ILLinkTrimInputSymbols)" />
127       <FileWrites Include="@(PreTrimmedItem)" />
128
129       <TrimmedItem Condition="Exists('$(ILLinkTrimAssemblyPath)')" Include="$(ILLinkTrimAssemblyPath)" />
130       <TrimmedItem Condition="'$(ILLinkRewritePDBs)' == 'true' AND Exists('$(ILLinkTrimAssemblySymbols)')" Include="$(ILLinkTrimAssemblySymbols)" />
131
132       <TrimmingReport Condition="Exists('$(AsmDiffReport)')" Include="$(AsmDiffReport)" />
133       <TrimmingReport Condition="Exists('$(AsmDiffList)')" Include="$(AsmDiffList)" />
134     </ItemGroup>
135   </Target>
136 </Project>