From bfe5ab76b5ecc1a21078534e6fba90d12cfd3c00 Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Sun, 30 Jan 2022 17:02:13 -0500 Subject: Add platform-specific CAs and compiler extension. https://github.com/wixtoolset/issues/issues/5933 --- src/ext/DirectX/ca/directx.def | 2 +- src/ext/DirectX/ca/directxca.vcxproj | 2 +- .../DirectXExtensionFixture.cs | 5 +- .../TestData/UsingPixelShaderVersion/Package.wxs | 2 +- .../UsingPixelShaderVersion/PackageComponents.wxs | 5 +- src/ext/DirectX/wixext/DirectXCompiler.cs | 70 ++++++++++++++++ src/ext/DirectX/wixext/DirectXExtensionFactory.cs | 1 + src/ext/DirectX/wixlib/DirectXExtension.wxs | 33 -------- .../DirectX/wixlib/DirectXExtension_Platform.wxi | 23 ++++++ src/ext/DirectX/wixlib/DirectXExtension_arm64.wxs | 7 ++ src/ext/DirectX/wixlib/DirectXExtension_x64.wxs | 7 ++ src/ext/DirectX/wixlib/DirectXExtension_x86.wxs | 7 ++ src/ext/DirectX/wixlib/caerr.wxi | 96 ---------------------- src/ext/DirectX/wixlib/directx.wixproj | 10 ++- src/wix/WixToolset.Converters/WixConverter.cs | 14 +++- .../DirectXExtensionFixture.cs | 51 ++++++++++++ 16 files changed, 195 insertions(+), 140 deletions(-) create mode 100644 src/ext/DirectX/wixext/DirectXCompiler.cs delete mode 100644 src/ext/DirectX/wixlib/DirectXExtension.wxs create mode 100644 src/ext/DirectX/wixlib/DirectXExtension_Platform.wxi create mode 100644 src/ext/DirectX/wixlib/DirectXExtension_arm64.wxs create mode 100644 src/ext/DirectX/wixlib/DirectXExtension_x64.wxs create mode 100644 src/ext/DirectX/wixlib/DirectXExtension_x86.wxs delete mode 100644 src/ext/DirectX/wixlib/caerr.wxi create mode 100644 src/wix/test/WixToolsetTest.Converters/DirectXExtensionFixture.cs diff --git a/src/ext/DirectX/ca/directx.def b/src/ext/DirectX/ca/directx.def index 8f46f9a8..48ca4d24 100644 --- a/src/ext/DirectX/ca/directx.def +++ b/src/ext/DirectX/ca/directx.def @@ -1,7 +1,7 @@ ; 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. -LIBRARY "directxca" +LIBRARY "dxca" EXPORTS WixQueryDirectXCaps diff --git a/src/ext/DirectX/ca/directxca.vcxproj b/src/ext/DirectX/ca/directxca.vcxproj index e2baa46a..54837271 100644 --- a/src/ext/DirectX/ca/directxca.vcxproj +++ b/src/ext/DirectX/ca/directxca.vcxproj @@ -33,7 +33,7 @@ {76542B28-0FFD-47D3-AD6A-D0F20FA875AC} DynamicLibrary Unicode - directxca + dxca directx.def WiX Toolset DirectX CustomAction diff --git a/src/ext/DirectX/test/WixToolsetTest.DirectX/DirectXExtensionFixture.cs b/src/ext/DirectX/test/WixToolsetTest.DirectX/DirectXExtensionFixture.cs index ae8bbbf0..f936cdfe 100644 --- a/src/ext/DirectX/test/WixToolsetTest.DirectX/DirectXExtensionFixture.cs +++ b/src/ext/DirectX/test/WixToolsetTest.DirectX/DirectXExtensionFixture.cs @@ -16,10 +16,11 @@ namespace WixToolsetTest.DirectX var folder = TestData.Get(@"TestData\UsingPixelShaderVersion"); var build = new Builder(folder, typeof(DirectXExtensionFactory), new[] { folder }); - var results = build.BuildAndQuery(Build, "CustomAction"); + var results = build.BuildAndQuery(Build, "CustomAction", "Binary"); WixAssert.CompareLineByLine(new[] { - "CustomAction:WixQueryDirectXCaps\t65\tDirectXCA\tWixQueryDirectXCaps\t", + "Binary:Wix4DXCA_X86\t[Binary data]", + "CustomAction:Wix4QueryDirectXCaps_X86\t65\tWix4DXCA_X86\tWixQueryDirectXCaps\t", }, results); } diff --git a/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.wxs b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.wxs index bd31e81f..411893bc 100644 --- a/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.wxs +++ b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/Package.wxs @@ -1,5 +1,5 @@  - + diff --git a/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/PackageComponents.wxs b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/PackageComponents.wxs index f3a2ae92..de1288b3 100644 --- a/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/PackageComponents.wxs +++ b/src/ext/DirectX/test/WixToolsetTest.DirectX/TestData/UsingPixelShaderVersion/PackageComponents.wxs @@ -1,7 +1,8 @@ - + - + + diff --git a/src/ext/DirectX/wixext/DirectXCompiler.cs b/src/ext/DirectX/wixext/DirectXCompiler.cs new file mode 100644 index 00000000..968683bd --- /dev/null +++ b/src/ext/DirectX/wixext/DirectXCompiler.cs @@ -0,0 +1,70 @@ +// 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.DirectX +{ + using System; + using System.Collections.Generic; + using System.Xml.Linq; + using WixToolset.Data; + using WixToolset.Extensibility; + using WixToolset.Extensibility.Data; + + /// + /// The compiler for the WiX Toolset DirectX Extension. + /// + public sealed class DirectXCompiler : BaseCompilerExtension + { + public override XNamespace Namespace => "http://wixtoolset.org/schemas/v4/wxs/directx"; + + /// + /// Processes an element for the Compiler. + /// + /// Parent element of element to process. + /// Element to process. + /// Extra information about the context in which this element is being parsed. + public override void ParseElement(Intermediate intermediate, IntermediateSection section, XElement parentElement, XElement element, IDictionary context) + { + switch (parentElement.Name.LocalName) + { + case "Fragment": + case "Module": + case "Package": + case "UI": + this.AddCustomActionReference(intermediate, section, element, parentElement); + break; + default: + this.ParseHelper.UnexpectedElement(parentElement, element); + break; + } + } + + private void AddCustomActionReference(Intermediate intermediate, IntermediateSection section, XElement element, XElement parentElement) + { + var sourceLineNumbers = this.ParseHelper.GetSourceLineNumbers(element); + + switch (element.Name.LocalName) + { + case "GetCapabilities": + this.ParseHelper.CreateCustomActionReference(sourceLineNumbers, section, "Wix4QueryDirectXCaps", this.Context.Platform, CustomActionPlatforms.X86 | CustomActionPlatforms.X64 | CustomActionPlatforms.ARM64); + break; + default: + this.ParseHelper.UnexpectedElement(parentElement, element); + break; + } + + foreach (var attrib in element.Attributes()) + { + if (String.IsNullOrEmpty(attrib.Name.NamespaceName) || this.Namespace == attrib.Name.Namespace) + { + // no attributes today + } + else + { + this.ParseHelper.ParseExtensionAttribute(this.Context.Extensions, intermediate, section, element, attrib); + } + } + + this.ParseHelper.ParseForExtensionElements(this.Context.Extensions, intermediate, section, element); + } + } +} diff --git a/src/ext/DirectX/wixext/DirectXExtensionFactory.cs b/src/ext/DirectX/wixext/DirectXExtensionFactory.cs index fb7f84aa..790725fd 100644 --- a/src/ext/DirectX/wixext/DirectXExtensionFactory.cs +++ b/src/ext/DirectX/wixext/DirectXExtensionFactory.cs @@ -11,6 +11,7 @@ namespace WixToolset.DirectX protected override IReadOnlyCollection ExtensionTypes => new[] { typeof(DirectXExtensionData), + typeof(DirectXCompiler), }; } } diff --git a/src/ext/DirectX/wixlib/DirectXExtension.wxs b/src/ext/DirectX/wixlib/DirectXExtension.wxs deleted file mode 100644 index b83dc98d..00000000 --- a/src/ext/DirectX/wixlib/DirectXExtension.wxs +++ /dev/null @@ -1,33 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/src/ext/DirectX/wixlib/DirectXExtension_Platform.wxi b/src/ext/DirectX/wixlib/DirectXExtension_Platform.wxi new file mode 100644 index 00000000..317e75d4 --- /dev/null +++ b/src/ext/DirectX/wixlib/DirectXExtension_Platform.wxi @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/ext/DirectX/wixlib/DirectXExtension_arm64.wxs b/src/ext/DirectX/wixlib/DirectXExtension_arm64.wxs new file mode 100644 index 00000000..b3172384 --- /dev/null +++ b/src/ext/DirectX/wixlib/DirectXExtension_arm64.wxs @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ext/DirectX/wixlib/DirectXExtension_x64.wxs b/src/ext/DirectX/wixlib/DirectXExtension_x64.wxs new file mode 100644 index 00000000..31646944 --- /dev/null +++ b/src/ext/DirectX/wixlib/DirectXExtension_x64.wxs @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ext/DirectX/wixlib/DirectXExtension_x86.wxs b/src/ext/DirectX/wixlib/DirectXExtension_x86.wxs new file mode 100644 index 00000000..5381957c --- /dev/null +++ b/src/ext/DirectX/wixlib/DirectXExtension_x86.wxs @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/ext/DirectX/wixlib/caerr.wxi b/src/ext/DirectX/wixlib/caerr.wxi deleted file mode 100644 index ff7ec121..00000000 --- a/src/ext/DirectX/wixlib/caerr.wxi +++ /dev/null @@ -1,96 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file diff --git a/src/ext/DirectX/wixlib/directx.wixproj b/src/ext/DirectX/wixlib/directx.wixproj index a7281dd0..ea0f3330 100644 --- a/src/ext/DirectX/wixlib/directx.wixproj +++ b/src/ext/DirectX/wixlib/directx.wixproj @@ -6,7 +6,15 @@ - + + + + + + + + + diff --git a/src/wix/WixToolset.Converters/WixConverter.cs b/src/wix/WixToolset.Converters/WixConverter.cs index b8a83326..5dae29b7 100644 --- a/src/wix/WixToolset.Converters/WixConverter.cs +++ b/src/wix/WixToolset.Converters/WixConverter.cs @@ -56,6 +56,7 @@ namespace WixToolset.Converters private static readonly XNamespace Wix3Namespace = "http://schemas.microsoft.com/wix/2006/wi"; private static readonly XNamespace WixBalNamespace = "http://wixtoolset.org/schemas/v4/wxs/bal"; private static readonly XNamespace WixDependencyNamespace = "http://wixtoolset.org/schemas/v4/wxs/dependency"; + private static readonly XNamespace WixDirectXNamespace = "http://wixtoolset.org/schemas/v4/wxs/directx"; private static readonly XNamespace WixFirewallNamespace = "http://wixtoolset.org/schemas/v4/wxs/firewall"; private static readonly XNamespace WixUiNamespace = "http://wixtoolset.org/schemas/v4/wxs/ui"; private static readonly XNamespace WixUtilNamespace = "http://wixtoolset.org/schemas/v4/wxs/util"; @@ -94,6 +95,7 @@ namespace WixToolset.Converters private static readonly XName FileElementName = WixNamespace + "File"; private static readonly XName FragmentElementName = WixNamespace + "Fragment"; private static readonly XName FirewallRemoteAddressElementName = WixFirewallNamespace + "RemoteAddress"; + private static readonly XName GetCapabilitiesElementName = WixFirewallNamespace + "GetCapabilities"; private static readonly XName LaunchElementName = WixNamespace + "Launch"; private static readonly XName LevelElementName = WixNamespace + "Level"; private static readonly XName ExePackageElementName = WixNamespace + "ExePackage"; @@ -455,11 +457,11 @@ namespace WixToolset.Converters { text.Value = text.Value.Trim(); } - else if (node.NextNode is XCData cdata) + else if (node.NextNode is XCData) { this.EnsurePrecedingWhitespaceRemoved(text, node, ConverterTestType.WhitespacePrecedingNodeWrong); } - else if (node.NextNode is XElement element) + else if (node.NextNode is XElement) { this.EnsurePrecedingWhitespaceCorrect(text, node, level, ConverterTestType.WhitespacePrecedingNodeWrong); } @@ -503,7 +505,7 @@ namespace WixToolset.Converters { newValue = this.DeprecatedPrefixRegex.Replace(value, "!"); - if (object.ReferenceEquals(newValue, value)) + if (Object.ReferenceEquals(newValue, value)) { return false; } @@ -1439,6 +1441,12 @@ namespace WixToolset.Converters newNamespaceName = "vs"; replace = false; break; + case "WIX_DIRECTX_PIXELSHADERVERSION": + case "WIX_DIRECTX_VERTEXSHADERVERSION": + newElementName = "GetCapabilities"; + newNamespace = WixDirectXNamespace; + newNamespaceName = "directx"; + break; } if (!String.IsNullOrEmpty(newElementName) diff --git a/src/wix/test/WixToolsetTest.Converters/DirectXExtensionFixture.cs b/src/wix/test/WixToolsetTest.Converters/DirectXExtensionFixture.cs new file mode 100644 index 00000000..f72a4a23 --- /dev/null +++ b/src/wix/test/WixToolsetTest.Converters/DirectXExtensionFixture.cs @@ -0,0 +1,51 @@ +// 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 WixToolsetTest.Converters +{ + using System; + using System.Xml.Linq; + using WixBuildTools.TestSupport; + using WixToolset.Converters; + using WixToolsetTest.Converters.Mocks; + using Xunit; + + public class DirectXExtensionFixture : BaseConverterFixture + { + [Fact] + public void FixUIRefs() + { + var parse = String.Join(Environment.NewLine, + "", + " ", + " ", + " ", + " ", + " ", + " ", + ""); + + var expected = new[] + { + "", + " ", + " ", + " ", + " ", + " ", + " ", + "" + }; + + var document = XDocument.Parse(parse, LoadOptions.PreserveWhitespace | LoadOptions.SetLineInfo); + + var messaging = new MockMessaging(); + var converter = new WixConverter(messaging, 2, null, null); + + var errors = converter.ConvertDocument(document); + Assert.Equal(3, errors); + + var actualLines = UnformattedDocumentLines(document); + WixAssert.CompareLineByLine(expected, actualLines); + } + } +} -- cgit v1.2.3-55-g6feb