diff --git a/src/ILLink.Tasks/ILLink.Tasks.nuspec b/src/ILLink.Tasks/ILLink.Tasks.nuspec index 233fe59613f3..365501478395 100644 --- a/src/ILLink.Tasks/ILLink.Tasks.nuspec +++ b/src/ILLink.Tasks/ILLink.Tasks.nuspec @@ -10,5 +10,6 @@ + diff --git a/src/ILLink.Tasks/LinkTask.cs b/src/ILLink.Tasks/LinkTask.cs index 159b0f8a4d41..c7af45a7a549 100644 --- a/src/ILLink.Tasks/LinkTask.cs +++ b/src/ILLink.Tasks/LinkTask.cs @@ -1,12 +1,14 @@ using System; using System.Collections.Generic; using System.IO; +using System.Text; +using System.Reflection; using Microsoft.Build.Framework; using Microsoft.Build.Utilities; namespace ILLink.Tasks { - public class ILLink : Task + public class ILLink : ToolTask { /// /// Paths to the assembly files that should be considered as @@ -70,30 +72,63 @@ public class ILLink : Task /// public bool DumpDependencies { get; set; } - public override bool Execute () + + private static string DotNetHostPathEnvironmentName = "DOTNET_HOST_PATH"; + + private string _dotnetPath; + + private string DotNetPath { - string [] args = GenerateCommandLineCommands (); - var argsString = String.Join (" ", args); - Log.LogMessageFromText ($"illink {argsString}", MessageImportance.Normal); - var logger = new AdapterLogger (Log); - int ret = Mono.Linker.Driver.Execute (args, logger); - return ret == 0; + get + { + if (!String.IsNullOrEmpty (_dotnetPath)) + { + return _dotnetPath; + } + _dotnetPath = Environment.GetEnvironmentVariable (DotNetHostPathEnvironmentName); + if (String.IsNullOrEmpty (_dotnetPath)) + { + throw new InvalidOperationException ($"{DotNetHostPathEnvironmentName} is not set"); + } + return _dotnetPath; + } + } + + + /// ToolTask implementation + + protected override string ToolName => Path.GetFileName (DotNetPath); + + protected override string GenerateFullPathToTool () => DotNetPath; + + private string _illinkPath = ""; + + public string ILLinkPath { + get { + if (!String.IsNullOrEmpty (_illinkPath)) + { + return _illinkPath; + } + var taskDirectory = Path.GetDirectoryName (Assembly.GetExecutingAssembly ().Location); + _illinkPath = Path.Combine (taskDirectory, "illink.dll"); + return _illinkPath; + } + set => _illinkPath = value; } - string [] GenerateCommandLineCommands () + protected override string GenerateCommandLineCommands () { - var args = new List (); + var args = new StringBuilder (); + args.Append (ILLinkPath); if (RootDescriptorFiles != null) { foreach (var rootFile in RootDescriptorFiles) { - args.Add ("-x"); - args.Add (rootFile.ItemSpec); + args.Append (" -x ").Append (rootFile.ItemSpec); } } foreach (var assemblyItem in RootAssemblyNames) { - args.Add ("-a"); - args.Add (assemblyItem.ItemSpec); + args.Append (" -a ").Append (assemblyItem.ItemSpec); } HashSet directories = new HashSet (); @@ -102,42 +137,39 @@ string [] GenerateCommandLineCommands () var dir = Path.GetDirectoryName (assemblyPath); if (!directories.Contains (dir)) { directories.Add (dir); - args.Add ("-d"); - args.Add (dir); + args.Append (" -d ").Append (dir); } string action = assembly.GetMetadata ("action"); if ((action != null) && (action.Length > 0)) { - args.Add ("-p"); - args.Add (action); - args.Add (Path.GetFileNameWithoutExtension (assemblyPath)); + args.Append (" -p "); + args.Append (action); + args.Append (" ").Append (Path.GetFileNameWithoutExtension (assemblyPath)); } } if (OutputDirectory != null) { - args.Add ("-out"); - args.Add (OutputDirectory.ItemSpec); + args.Append (" -out ").Append (OutputDirectory.ItemSpec); } if (ClearInitLocals) { - args.Add ("-s"); + args.Append (" -s "); // Version of ILLink.CustomSteps is passed as a workaround for msbuild issue #3016 - args.Add ("ILLink.CustomSteps.ClearInitLocalsStep,ILLink.CustomSteps,Version=0.0.0.0:OutputStep"); + args.Append ("LLink.CustomSteps.ClearInitLocalsStep,ILLink.CustomSteps,Version=0.0.0.0:OutputStep"); if ((ClearInitLocalsAssemblies != null) && (ClearInitLocalsAssemblies.Length > 0)) { - args.Add ("-m"); - args.Add ("ClearInitLocalsAssemblies"); - args.Add (ClearInitLocalsAssemblies); + args.Append (" -m ClearInitLocalsAssemblies "); + args.Append (ClearInitLocalsAssemblies); } } if (ExtraArgs != null) { - args.AddRange (ExtraArgs.Split (' ')); + args.Append (" ").Append (ExtraArgs); } if (DumpDependencies) - args.Add ("--dump-dependencies"); + args.Append (" --dump-dependencies"); - return args.ToArray (); + return args.ToString (); } } diff --git a/src/linker/ILLink.props b/src/linker/ILLink.props index 33a3978cca13..cb98e6580ca5 100644 --- a/src/linker/ILLink.props +++ b/src/linker/ILLink.props @@ -7,7 +7,21 @@ false false illink - Library + + Exe + + + + + + + +