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)