From 07b3d459ea0a45cbef29b98d283edafbab26462a Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Wed, 12 Oct 2022 22:01:55 -0700 Subject: Normalize ToolsetTask implementation to call wix.exe and heat.exe Share the ToolsetTask implementation that can find .NET Core and .NET Framework with multiple architectures. Fixes 6951 --- .../WixCommandLineBuilder.cs | 177 +++++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 src/internal/WixToolset.BaseBuildTasks.Sources/WixCommandLineBuilder.cs (limited to 'src/internal/WixToolset.BaseBuildTasks.Sources/WixCommandLineBuilder.cs') diff --git a/src/internal/WixToolset.BaseBuildTasks.Sources/WixCommandLineBuilder.cs b/src/internal/WixToolset.BaseBuildTasks.Sources/WixCommandLineBuilder.cs new file mode 100644 index 00000000..152992dd --- /dev/null +++ b/src/internal/WixToolset.BaseBuildTasks.Sources/WixCommandLineBuilder.cs @@ -0,0 +1,177 @@ +// Copyright (c) .NET Foundation and contributors. All rights reserved. Licensed under the Microsoft Reciprocal License. See LICENSE.TXT file in the project root for full license information. + +namespace WixToolset.BaseBuildTasks +{ + using System; + using System.Collections.Generic; + using System.Globalization; + using System.IO; + + using Microsoft.Build.Framework; + using Microsoft.Build.Utilities; + + /// + /// Helper class for appending the command line arguments. + /// + public class WixCommandLineBuilder : CommandLineBuilder + { + internal const int Unspecified = -1; + + /// + /// Append a switch to the command line if the value has been specified. + /// + /// Switch to append. + /// Value specified by the user. + public void AppendIfSpecified(string switchName, int value) + { + if (value != Unspecified) + { + this.AppendSwitchIfNotNull(switchName, value.ToString(CultureInfo.InvariantCulture)); + } + } + + /// + /// Append a switch to the command line if the condition is true. + /// + /// Switch to append. + /// Condition specified by the user. + public void AppendIfTrue(string switchName, bool condition) + { + if (condition) + { + this.AppendSwitch(switchName); + } + } + + /// + /// Append a switch to the command line if any values in the array have been specified. + /// + /// Switch to append. + /// Values specified by the user. + public void AppendArrayIfNotNull(string switchName, IEnumerable values) + { + if (values != null) + { + foreach (ITaskItem value in values) + { + this.AppendSwitchIfNotNull(switchName, value); + } + } + } + + /// + /// Append a switch to the command line if any values in the array have been specified. + /// + /// Switch to append. + /// Values specified by the user. + public void AppendArrayIfNotNull(string switchName, IEnumerable values) + { + if (values != null) + { + foreach (string value in values) + { + this.AppendSwitchIfNotNull(switchName, value); + } + } + } + + /// + /// Build the extensions argument. Each extension is searched in the current folder, user defined search + /// directories (ReferencePath), HintPath, and under Wix Extension Directory in that order. + /// The order of precedence is based off of that described in Microsoft.Common.Targets's SearchPaths + /// property for the ResolveAssemblyReferences task. + /// + /// The list of extensions to include. + /// Evaluated default folder for Wix Extensions + /// User defined reference directories to search in + public void AppendExtensions(ITaskItem[] extensions, string wixExtensionDirectory, string [] referencePaths) + { + if (extensions == null) + { + return; + } + + foreach (ITaskItem extension in extensions) + { + string className = extension.GetMetadata("Class"); + + string fileName = Path.GetFileName(extension.ItemSpec); + + if (String.IsNullOrEmpty(Path.GetExtension(fileName))) + { + fileName += ".dll"; + } + + // First try reference paths + var resolvedPath = FileSearchHelperMethods.SearchFilePaths(referencePaths, fileName); + + if (String.IsNullOrEmpty(resolvedPath)) + { + // Now try HintPath + resolvedPath = extension.GetMetadata("HintPath"); + + if (!File.Exists(resolvedPath)) + { + // Now try the item itself + resolvedPath = extension.ItemSpec; + + if (String.IsNullOrEmpty(Path.GetExtension(resolvedPath))) + { + resolvedPath += ".dll"; + } + + if (!File.Exists(resolvedPath)) + { + if (!String.IsNullOrEmpty(wixExtensionDirectory)) + { + // Now try the extension directory + resolvedPath = Path.Combine(wixExtensionDirectory, Path.GetFileName(resolvedPath)); + } + + if (!File.Exists(resolvedPath)) + { + // Extension wasn't found, just set it to the extension name passed in + resolvedPath = extension.ItemSpec; + } + } + } + } + + if (String.IsNullOrEmpty(className)) + { + this.AppendSwitchIfNotNull("-ext ", resolvedPath); + } + else + { + this.AppendSwitchIfNotNull("-ext ", className + ", " + resolvedPath); + } + } + } + + /// + /// Append arbitrary text to the command-line if specified. + /// + /// Text to append. + public void AppendTextIfNotNull(string textToAppend) + { + if (!String.IsNullOrEmpty(textToAppend)) + { + this.AppendSpaceIfNotEmpty(); + this.AppendTextUnquoted(textToAppend); + } + } + + /// + /// Append arbitrary text to the command-line if specified. + /// + /// Text to append. + public void AppendTextIfNotWhitespace(string textToAppend) + { + if (!String.IsNullOrWhiteSpace(textToAppend)) + { + this.AppendSpaceIfNotEmpty(); + this.AppendTextUnquoted(textToAppend); + } + } + } +} -- cgit v1.2.3-55-g6feb