From 853887b4e84df1965794802b7683f3a9aca3e930 Mon Sep 17 00:00:00 2001 From: Staffan Gustafsson Date: Wed, 30 Nov 2022 17:15:12 +0100 Subject: Adding support for DotNetCoreSdkSearch and DotNetCoreSdkCompatibilityCheck --- src/ext/NetFx/wixext/NetFxCompiler.cs | 293 +++++++++++++++++---- src/ext/NetFx/wixext/NetfxTableDefinitions.cs | 2 +- .../Symbols/NetFxDotNetCompatibilityCheckSymbol.cs | 34 +-- .../wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs | 64 +++++ .../NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs | 9 +- 5 files changed, 329 insertions(+), 73 deletions(-) create mode 100644 src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs (limited to 'src/ext/NetFx/wixext') diff --git a/src/ext/NetFx/wixext/NetFxCompiler.cs b/src/ext/NetFx/wixext/NetFxCompiler.cs index 563cd19d..7a37cf90 100644 --- a/src/ext/NetFx/wixext/NetFxCompiler.cs +++ b/src/ext/NetFx/wixext/NetFxCompiler.cs @@ -49,6 +49,12 @@ namespace WixToolset.Netfx case "DotNetCoreSearchRef": this.ParseDotNetCoreSearchRefElement(intermediate, section, element); break; + case "DotNetCoreSdkSearch": + this.ParseDotNetCoreSdkSearchElement(intermediate, section, element); + break; + case "DotNetCoreSdkSearchRef": + this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element); + break; case "DotNetCompatibilityCheck": this.ParseDotNetCompatibilityCheckElement(intermediate, section, element); break; @@ -69,6 +75,12 @@ namespace WixToolset.Netfx case "DotNetCoreSearchRef": this.ParseDotNetCoreSearchRefElement(intermediate, section, element); break; + case "DotNetCoreSdkSearch": + this.ParseDotNetCoreSdkSearchElement(intermediate, section, element); + break; + case "DotNetCoreSdkSearchRef": + this.ParseDotNetCoreSdkSearchRefElement(intermediate, section, element); + break; default: this.ParseHelper.UnexpectedElement(parentElement, element); break; @@ -248,6 +260,137 @@ namespace WixToolset.Netfx this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); } + private void ParseDotNetCoreSdkSearchElement(Intermediate intermediate, IntermediateSection section, XElement element) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + Identifier id = null; + string variable = null; + string condition = null; + string after = null; + NetCoreSdkSearchPlatform? platform = null; + string version = null; + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + id = this.ParseHelper.GetAttributeIdentifier(sourceLineNumbers, attrib); + break; + case "Variable": + variable = this.ParseHelper.GetAttributeBundleVariableNameValue(sourceLineNumbers, attrib); + break; + case "Condition": + condition = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "After": + after = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + break; + case "Platform": + var platformValue = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + switch (platformValue) + { + case "arm64": + platform = NetCoreSdkSearchPlatform.Arm64; + break; + case "x64": + platform = NetCoreSdkSearchPlatform.X64; + break; + case "x86": + platform = NetCoreSdkSearchPlatform.X86; + break; + default: + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Platform", platformValue, "arm64", "x64", "x86")); + break; + } + break; + case "Version": + // .NET Core had a different deployment strategy before .NET Core 3.0 which would require different detection logic. + version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + if (id == null) + { + id = this.ParseHelper.CreateIdentifier("dncss", variable, condition, after); + } + + if (!platform.HasValue) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Platform")); + } + + + if (String.IsNullOrEmpty(version)) + { + this.Messaging.Write(ErrorMessages.ExpectedAttribute(sourceLineNumbers, element.Name.LocalName, "Version")); + } + + var ver = Version.Parse(version); + if (ver.Major == 4) + { + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, "Version", version, "3.*", "5+.*")); + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + + var bundleExtensionId = this.ParseHelper.CreateIdentifierValueFromPlatform("Wix4NetfxBundleExtension", this.Context.Platform, BurnPlatforms.X86 | BurnPlatforms.X64 | BurnPlatforms.ARM64); + if (bundleExtensionId == null) + { + this.Messaging.Write(ErrorMessages.UnsupportedPlatformForElement(sourceLineNumbers, this.Context.Platform.ToString(), element.Name.LocalName)); + } + + if (!this.Messaging.EncounteredError) + { + this.ParseHelper.CreateWixSearchSymbol(section, sourceLineNumbers, element.Name.LocalName, id, variable, condition, after, bundleExtensionId); + + section.AddSymbol(new NetFxNetCoreSdkSearchSymbol(sourceLineNumbers, id) + { + Platform = platform.Value, + Version = version, + }); + } + } + + private void ParseDotNetCoreSdkSearchRefElement(Intermediate intermediate, IntermediateSection section, XElement element) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + switch (attrib.Name.LocalName) + { + case "Id": + var refId = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); + this.ParseHelper.CreateSimpleReference(section, sourceLineNumbers, NetfxSymbolDefinitions.NetFxNetCoreSdkSearch, refId); + break; + default: + this.ParseHelper.UnexpectedAttribute(element, attrib); + break; + } + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + } + /// /// Parses a NativeImage element. /// @@ -389,66 +532,19 @@ namespace WixToolset.Netfx property = this.ParseHelper.GetAttributeIdentifierValue(sourceLineNumbers, attrib); break; case "RuntimeType": - runtimeType = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); - switch (runtimeType.ToLower()) - { - case "aspnet": - runtimeType = "Microsoft.AspNetCore.App"; - break; - case "desktop": - runtimeType = "Microsoft.WindowsDesktop.App"; - break; - case "core": - runtimeType = "Microsoft.NETCore.App"; - break; - default: - this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, runtimeType, "aspnet", "desktop", "core")); - break; - } + runtimeType = this.ParseRuntimeType(element, sourceLineNumbers, attrib); break; case "Platform": - platform = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); - switch (platform.ToLower()) - { - case "x86": - case "x64": - case "arm64": - platform = platform.ToLower(); - break; - default: - this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, platform, "x86", "x64", "arm64")); - break; - } + platform = this.ParsePlatform(element, sourceLineNumbers, attrib); + break; + case "FeatureBand": + platform = this.ParseFeatureBand(element, sourceLineNumbers, attrib); break; case "Version": version = this.ParseHelper.GetAttributeVersionValue(sourceLineNumbers, attrib); break; case "RollForward": - rollForward = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); - switch (rollForward.ToLowerInvariant()) - { - case "latestmajor": - rollForward = "LatestMajor"; - break; - case "major": - rollForward = "Major"; - break; - case "latestminor": - rollForward = "LatestMinor"; - break; - case "minor": - rollForward = "Minor"; - break; - case "latestpatch": - rollForward = "LatestPatch"; - break; - case "disable": - rollForward = "Disable"; - break; - default: - this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, attrib.Name.LocalName, rollForward, "latestmajor", "major", "latestminor", "minor", "latestpatch", "disable")); - break; - } + rollForward = this.ParseRollForward(element, sourceLineNumbers, attrib); break; default: this.ParseHelper.UnexpectedAttribute(element, attrib); @@ -503,6 +599,97 @@ namespace WixToolset.Netfx } } + private string ParseRollForward(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib) + { + string rollForward; + rollForward = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + switch (rollForward.ToLowerInvariant()) + { + case "latestmajor": + rollForward = "LatestMajor"; + break; + case "major": + rollForward = "Major"; + break; + case "latestminor": + rollForward = "LatestMinor"; + break; + case "minor": + rollForward = "Minor"; + break; + case "latestpatch": + rollForward = "LatestPatch"; + break; + case "disable": + rollForward = "Disable"; + break; + default: + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, + attrib.Name.LocalName, rollForward, "latestmajor", "major", "latestminor", "minor", "latestpatch", "disable")); + break; + } + + return rollForward; + } + + private string ParsePlatform(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib) + { + string platform; + platform = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + switch (platform.ToLower()) + { + case "x86": + case "x64": + case "arm64": + platform = platform.ToLower(); + break; + default: + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, + attrib.Name.LocalName, platform, "x86", "x64", "arm64")); + break; + } + + return platform; + } + + private string ParseFeatureBand(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib) + { + string featureBand = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + + if (!Int32.TryParse(featureBand, out var intFeatureBand) || (100 > intFeatureBand) || (intFeatureBand > 999)) + { + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, + attrib.Name.LocalName, featureBand, "An integer in the range [100 - 999]")); + + } + + return featureBand; + } + + private string ParseRuntimeType(XElement element, SourceLineNumber sourceLineNumbers, XAttribute attrib) + { + var runtimeType = this.ParseHelper.GetAttributeValue(sourceLineNumbers, attrib); + switch (runtimeType.ToLower()) + { + case "aspnet": + runtimeType = "Microsoft.AspNetCore.App"; + break; + case "desktop": + runtimeType = "Microsoft.WindowsDesktop.App"; + break; + case "core": + runtimeType = "Microsoft.NETCore.App"; + break; + default: + this.Messaging.Write(ErrorMessages.IllegalAttributeValue(sourceLineNumbers, element.Name.LocalName, + attrib.Name.LocalName, runtimeType, "aspnet", "desktop", "core")); + break; + } + + return runtimeType; + } + + /// /// Parses a DotNetCompatibilityCheckRef element. /// diff --git a/src/ext/NetFx/wixext/NetfxTableDefinitions.cs b/src/ext/NetFx/wixext/NetfxTableDefinitions.cs index 6be1abe7..114275c3 100644 --- a/src/ext/NetFx/wixext/NetfxTableDefinitions.cs +++ b/src/ext/NetFx/wixext/NetfxTableDefinitions.cs @@ -40,7 +40,7 @@ namespace WixToolset.Netfx public static readonly TableDefinition[] All = new[] { NetFxNativeImage, - NetFxDotNetCompatibilityCheck + NetFxDotNetCompatibilityCheck, }; } } diff --git a/src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs b/src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs index a46cf17f..ea1b16c5 100644 --- a/src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs +++ b/src/ext/NetFx/wixext/Symbols/NetFxDotNetCompatibilityCheckSymbol.cs @@ -11,11 +11,11 @@ namespace WixToolset.Netfx NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck.ToString(), new[] { - new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.RuntimeType), IntermediateFieldType.String), - new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.Platform), IntermediateFieldType.String), - new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.Version), IntermediateFieldType.String), - new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.RollForward), IntermediateFieldType.String), - new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbollFields.Property), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.RuntimeType), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.Platform), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.Version), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.RollForward), IntermediateFieldType.String), + new IntermediateFieldDefinition(nameof(NetFxDotNetCompatibilityCheckSymbolFields.Property), IntermediateFieldType.String), }, typeof(NetFxDotNetCompatibilityCheckSymbol)); } @@ -25,7 +25,7 @@ namespace WixToolset.Netfx.Symbols { using WixToolset.Data; - public enum NetFxDotNetCompatibilityCheckSymbollFields + public enum NetFxDotNetCompatibilityCheckSymbolFields { RuntimeType, Platform, @@ -44,36 +44,36 @@ namespace WixToolset.Netfx.Symbols { } - public IntermediateField this[NetFxDotNetCompatibilityCheckSymbollFields index] => this.Fields[(int)index]; + public IntermediateField this[NetFxDotNetCompatibilityCheckSymbolFields index] => this.Fields[(int)index]; public string RuntimeType { - get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.RuntimeType].AsString(); - set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.RuntimeType, value); + get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.RuntimeType].AsString(); + set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.RuntimeType, value); } public string Platform { - get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.Platform].AsString(); - set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.Platform, value); + get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.Platform].AsString(); + set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.Platform, value); } public string Version { - get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.Version].AsString(); - set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.Version, value); + get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.Version].AsString(); + set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.Version, value); } public string RollForward { - get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.RollForward].AsString(); - set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.RollForward, value); + get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.RollForward].AsString(); + set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.RollForward, value); } public string Property { - get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbollFields.Property].AsString(); - set => this.Set((int)NetFxDotNetCompatibilityCheckSymbollFields.Property, value); + get => this.Fields[(int)NetFxDotNetCompatibilityCheckSymbolFields.Property].AsString(); + set => this.Set((int)NetFxDotNetCompatibilityCheckSymbolFields.Property, value); } } } diff --git a/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs b/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs new file mode 100644 index 00000000..86b750ea --- /dev/null +++ b/src/ext/NetFx/wixext/Symbols/NetFxNetCoreSearchSdkSymbol.cs @@ -0,0 +1,64 @@ +// 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.Netfx +{ + using WixToolset.Data; + using WixToolset.Netfx.Symbols; + + public static partial class NetfxSymbolDefinitions + { + public static readonly IntermediateSymbolDefinition NetFxNetCoreSdkSearch = new IntermediateSymbolDefinition( + NetfxSymbolDefinitionType.NetFxNetCoreSdkSearch.ToString(), + new[] + { + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.Platform), IntermediateFieldType.Number), + new IntermediateFieldDefinition(nameof(NetFxNetCoreSdkSearchSymbolFields.Version), IntermediateFieldType.String), + }, + typeof(NetFxNetCoreSearchSymbol)); + } +} + +namespace WixToolset.Netfx.Symbols +{ + using WixToolset.Data; + + + public enum NetCoreSdkSearchPlatform + { + X86, + X64, + Arm64, + } + + public enum NetFxNetCoreSdkSearchSymbolFields + { + Platform, + Version, + } + + + public class NetFxNetCoreSdkSearchSymbol : IntermediateSymbol + { + public NetFxNetCoreSdkSearchSymbol() : base(NetfxSymbolDefinitions.NetFxNetCoreSdkSearch, null, null) + { + } + + public NetFxNetCoreSdkSearchSymbol(SourceLineNumber sourceLineNumber, Identifier id = null) : base(NetfxSymbolDefinitions.NetFxNetCoreSdkSearch, sourceLineNumber, id) + { + } + + public IntermediateField this[NetFxNetCoreSdkSearchSymbolFields index] => this.Fields[(int)index]; + + public NetCoreSdkSearchPlatform Platform + { + get => (NetCoreSdkSearchPlatform)this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Platform].AsNumber(); + set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.Platform, (int)value); + } + + public string Version + { + get => this.Fields[(int)NetFxNetCoreSdkSearchSymbolFields.Version].AsString(); + set => this.Set((int)NetFxNetCoreSdkSearchSymbolFields.Version, value); + } + } +} diff --git a/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs b/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs index ad729dd4..00c52f9e 100644 --- a/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs +++ b/src/ext/NetFx/wixext/Symbols/NetfxSymbolDefinitions.cs @@ -10,7 +10,8 @@ namespace WixToolset.Netfx { NetFxNativeImage, NetFxNetCoreSearch, - NetFxDotNetCompatibilityCheck + NetFxNetCoreSdkSearch, + NetFxDotNetCompatibilityCheck, } public static partial class NetfxSymbolDefinitions @@ -36,7 +37,10 @@ namespace WixToolset.Netfx case NetfxSymbolDefinitionType.NetFxNetCoreSearch: return NetfxSymbolDefinitions.NetFxNetCoreSearch; - + + case NetfxSymbolDefinitionType.NetFxNetCoreSdkSearch: + return NetfxSymbolDefinitions.NetFxNetCoreSdkSearch; + case NetfxSymbolDefinitionType.NetFxDotNetCompatibilityCheck: return NetfxSymbolDefinitions.NetFxDotNetCompatibilityCheck; @@ -48,6 +52,7 @@ namespace WixToolset.Netfx static NetfxSymbolDefinitions() { NetFxNetCoreSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag); + NetFxNetCoreSdkSearch.AddTag(BurnConstants.BundleExtensionSearchSymbolDefinitionTag); } } } -- cgit v1.2.3-55-g6feb