diff --git a/src/ILLink.Tasks/ILLink.Tasks.csproj b/src/ILLink.Tasks/ILLink.Tasks.csproj
index 47d61557af87..6bf4836d7ce2 100644
--- a/src/ILLink.Tasks/ILLink.Tasks.csproj
+++ b/src/ILLink.Tasks/ILLink.Tasks.csproj
@@ -33,11 +33,17 @@
-
-
+
+ PreserveNewest
+
+
+ PreserveNewest
+
-
+
+ PreserveNewest
+
diff --git a/src/ILLink.Tasks/LinkTask.cs b/src/ILLink.Tasks/LinkTask.cs
index f4f70d4abf4e..661c82c9ce69 100644
--- a/src/ILLink.Tasks/LinkTask.cs
+++ b/src/ILLink.Tasks/LinkTask.cs
@@ -60,7 +60,7 @@ public class ILLink : ToolTask
public ITaskItem OutputDirectory { get; set; }
///
- /// The subset of warnings that have to be turned off.
+ /// The subset of warnings that have to be turned off.
/// Maps to '--nowarn'.
///
public string NoWarn { get; set; }
@@ -200,6 +200,7 @@ public class ILLink : ToolTask
///
/// Sets the default action for assemblies which have not opted into trimming.
/// Maps to '--action'
+ ///
public string DefaultAction { get; set; }
///
@@ -312,6 +313,23 @@ protected override string GenerateResponseFileCommands ()
args.AppendLine ("--singlewarn-");
}
+ string trimMode = TrimMode switch {
+ "full" => "link",
+ "partial" => "link",
+ var x => x
+ };
+ if (trimMode != null)
+ args.Append ("--trim-mode ").AppendLine (trimMode);
+
+ string defaultAction = TrimMode switch {
+ "full" => "link",
+ "partial" => "copy",
+ _ => DefaultAction
+ };
+ if (defaultAction != null)
+ args.Append ("--action ").AppendLine (defaultAction);
+
+
HashSet assemblyNames = new HashSet (StringComparer.OrdinalIgnoreCase);
foreach (var assembly in AssemblyPaths) {
var assemblyPath = assembly.ItemSpec;
@@ -323,10 +341,20 @@ protected override string GenerateResponseFileCommands ()
args.Append ("-reference ").AppendLine (Quote (assemblyPath));
- string trimMode = assembly.GetMetadata ("TrimMode");
- if (!String.IsNullOrEmpty (trimMode)) {
+ string assemblyTrimMode = assembly.GetMetadata ("TrimMode");
+ string isTrimmable = assembly.GetMetadata ("IsTrimmable");
+ if (string.IsNullOrEmpty (assemblyTrimMode)) {
+ if (isTrimmable.Equals ("true", StringComparison.OrdinalIgnoreCase)) {
+ // isTrimmable ~= true
+ assemblyTrimMode = trimMode;
+ } else if (isTrimmable.Equals ("false", StringComparison.OrdinalIgnoreCase)) {
+ // isTrimmable ~= false
+ assemblyTrimMode = "copy";
+ }
+ }
+ if (!string.IsNullOrEmpty (assemblyTrimMode)) {
args.Append ("--action ");
- args.Append (trimMode);
+ args.Append (assemblyTrimMode);
args.Append (' ').AppendLine (Quote (assemblyName));
}
@@ -441,12 +469,6 @@ protected override string GenerateResponseFileCommands ()
if (_removeSymbols == false)
args.AppendLine ("-b");
- if (TrimMode != null)
- args.Append ("--trim-mode ").AppendLine (TrimMode);
-
- if (DefaultAction != null)
- args.Append ("--action ").AppendLine (DefaultAction);
-
if (CustomSteps != null) {
foreach (var customStep in CustomSteps) {
args.Append ("--custom-step ");
diff --git a/src/ILLink.Tasks/build/Microsoft.NET.ILLink.targets b/src/ILLink.Tasks/build/Microsoft.NET.ILLink.targets
index 8da437694957..1e296ccd7e50 100644
--- a/src/ILLink.Tasks/build/Microsoft.NET.ILLink.targets
+++ b/src/ILLink.Tasks/build/Microsoft.NET.ILLink.targets
@@ -51,8 +51,8 @@ Copyright (c) .NET Foundation. All rights reserved.
true
-
- true
+
+ true
false
@@ -159,7 +159,7 @@ Copyright (c) .NET Foundation. All rights reserved.
ReferenceAssemblyPaths="@(ReferencePath)"
RootAssemblyNames="@(TrimmerRootAssembly)"
TrimMode="$(TrimMode)"
- DefaultAction="$(TrimmerDefaultAction)"
+ DefaultAction="$(_TrimmerDefaultAction)"
RemoveSymbols="$(TrimmerRemoveSymbols)"
FeatureSettings="@(_TrimmerFeatureSettings)"
CustomData="@(_TrimmerCustomData)"
@@ -225,16 +225,23 @@ Copyright (c) .NET Foundation. All rights reserved.
0
-
-
- copyused
-
- $(TrimMode)
+
+
+
+
+
+ copyused
+ partial
+ full
+
+
+ <_TrimmerDefaultAction Condition="$([MSBuild]::VersionLessThan($(TargetFrameworkVersion), '7.0'))">$(TrimmerDefaultAction)
+ <_TrimmerDefaultAction Condition="'$(_TrimmerDefaultAction)' == '' And $([MSBuild]::VersionLessThan($(TargetFrameworkVersion), '6.0'))">$(TrimMode)
+ <_TrimmerDefaultAction Condition="'$(_TrimmerDefaultAction)' == '' And $([MSBuild]::VersionEquals($(TargetFrameworkVersion), '6.0'))">copy
+
- link
-
- copy
$(TreatWarningsAsErrors)
<_ExtraTrimmerArgs>--skip-unresolved true $(_ExtraTrimmerArgs)
true
@@ -295,16 +302,6 @@ Copyright (c) .NET Foundation. All rights reserved.
-
-
-
- $(TrimMode)
-
-
- $(TrimmerDefaultAction)
-
-
-
diff --git a/test/ILLink.Tasks.Tests/ILLink.Tasks.Tests.cs b/test/ILLink.Tasks.Tests/ILLink.Tasks.Tests.cs
index 3ae04b65272f..103111ad260c 100644
--- a/test/ILLink.Tasks.Tests/ILLink.Tasks.Tests.cs
+++ b/test/ILLink.Tasks.Tests/ILLink.Tasks.Tests.cs
@@ -56,6 +56,45 @@ public class TaskArgumentTests
}
};
+ [Theory]
+ [InlineData ("full", AssemblyAction.Link)]
+ [InlineData ("partial", AssemblyAction.Copy)]
+ public void TrimModeFullAndPartial (string trimMode, AssemblyAction expectedDefaultAction)
+ {
+ var task = new MockTask () {
+ TrimMode = trimMode
+ };
+ using (var driver = task.CreateDriver ()) {
+ Assert.Equal (AssemblyAction.Link, driver.Context.TrimAction);
+ Assert.Equal (expectedDefaultAction, driver.Context.DefaultAction);
+ }
+ }
+
+ [Theory]
+ [InlineData ("full")]
+ [InlineData ("partial")]
+ public void TrimModeAssemblyPaths (string trimMode)
+ {
+ var assemblyPaths = new ITaskItem[] {
+ new TaskItem("Assembly1.dll", new Dictionary {{ "IsTrimmable", "true" }}),
+ new TaskItem("Assembly2.dll", new Dictionary ()),
+ new TaskItem("Assembly3.dll", new Dictionary {{ "IsTrimmable", "false" }}),
+ };
+ var task = new MockTask () {
+ TrimMode = trimMode,
+ AssemblyPaths = assemblyPaths
+ };
+ using var driver = task.CreateDriver ();
+ var context = driver.Context;
+ var references = driver.GetReferenceAssemblies ();
+ Assert.Equal ("", assemblyPaths[0].GetMetadata ("TrimMode"));
+ Assert.Equal (AssemblyAction.Link, context.Actions["Assembly1"]);
+ Assert.Equal ("", assemblyPaths[1].GetMetadata ("TrimMode"));
+ Assert.False (context.Actions.ContainsKey ("Assembly2"));
+ Assert.Equal ("", assemblyPaths[2].GetMetadata ("TrimMode"));
+ Assert.Equal (AssemblyAction.Copy, context.Actions["Assembly3"]);
+ }
+
[Theory]
[MemberData (nameof (AssemblyPathsCases))]
public void TestAssemblyPaths (ITaskItem[] assemblyPaths)