From 1adfdda935b814541693cd550bb34fdbf2942b1f Mon Sep 17 00:00:00 2001 From: Bob Arnson Date: Thu, 26 Mar 2020 13:51:14 -0400 Subject: Add intermediate levels to track how IR has been lowered. --- .../Bind/BindDatabaseCommand.cs | 25 ++++++++--- src/WixToolset.Core/Compiler.cs | 2 + src/WixToolset.Core/Librarian.cs | 4 +- src/WixToolset.Core/Linker.cs | 8 +++- src/WixToolset.Core/Resolver.cs | 2 + .../LinkerFixture.cs | 29 +++++++++++++ .../WixToolsetTest.CoreIntegration/MsiFixture.cs | 50 ++++++++++++++++++++++ .../WixiplFixture.cs | 16 ++++++- .../WixlibFixture.cs | 16 ++++++- 9 files changed, 140 insertions(+), 12 deletions(-) (limited to 'src') diff --git a/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs b/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs index 7412e6da..6878aed5 100644 --- a/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs +++ b/src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs @@ -100,6 +100,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind public IBindResult Execute() { + if (!this.Intermediate.HasLevel(Data.IntermediateLevels.Linked) && !this.Intermediate.HasLevel(Data.IntermediateLevels.Resolved)) + { + this.Messaging.Write(ErrorMessages.IntermediatesMustBeResolved(this.Intermediate.Id)); + } + var section = this.Intermediate.Sections.Single(); var fileTransfers = new List(); @@ -178,15 +183,18 @@ namespace WixToolset.Core.WindowsInstaller.Bind } } - // Sequence all the actions. + if (!this.Intermediate.HasLevel(Data.WindowsInstaller.IntermediateLevels.PartiallyBound)) { - var command = new SequenceActionsCommand(this.Messaging, section); - command.Execute(); - } + // Sequence all the actions. + { + var command = new SequenceActionsCommand(this.Messaging, section); + command.Execute(); + } - { - var command = new CreateSpecialPropertiesCommand(section); - command.Execute(); + { + var command = new CreateSpecialPropertiesCommand(section); + command.Execute(); + } } #if TODO_PATCHING @@ -220,6 +228,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind if (this.PdbType == PdbType.Partial) { // Time to create the output object, since we're bypassing everything that touches files. + this.Intermediate.UpdateLevel(Data.WindowsInstaller.IntermediateLevels.PartiallyBound); + var command = new CreateOutputFromIRCommand(this.Messaging, section, tableDefinitions, this.BackendExtensions); command.Execute(); @@ -227,6 +237,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind } else { + this.Intermediate.UpdateLevel(Data.WindowsInstaller.IntermediateLevels.FullyBound); this.Messaging.Write(VerboseMessages.UpdatingFileInformation()); // Extract files that come from binary .wixlibs and WixExtensions (this does not extract files from merge modules). diff --git a/src/WixToolset.Core/Compiler.cs b/src/WixToolset.Core/Compiler.cs index de718c84..8c0c4a39 100644 --- a/src/WixToolset.Core/Compiler.cs +++ b/src/WixToolset.Core/Compiler.cs @@ -163,6 +163,8 @@ namespace WixToolset.Core this.Core = null; } + target.UpdateLevel(IntermediateLevels.Compiled); + return this.Messaging.EncounteredError ? null : target; } diff --git a/src/WixToolset.Core/Librarian.cs b/src/WixToolset.Core/Librarian.cs index b6be73e9..d862c326 100644 --- a/src/WixToolset.Core/Librarian.cs +++ b/src/WixToolset.Core/Librarian.cs @@ -63,7 +63,9 @@ namespace WixToolset.Core section.LibraryId = context.LibraryId; } - library = new Intermediate(context.LibraryId, sections, localizationsByCulture); + library = new Intermediate(context.LibraryId, IntermediateLevels.Compiled, sections, localizationsByCulture); + + library.UpdateLevel(IntermediateLevels.Combined); this.Validate(library); } diff --git a/src/WixToolset.Core/Linker.cs b/src/WixToolset.Core/Linker.cs index 6ef252b7..f05aabd1 100644 --- a/src/WixToolset.Core/Linker.cs +++ b/src/WixToolset.Core/Linker.cs @@ -70,6 +70,12 @@ namespace WixToolset.Core extension.PreLink(this.Context); } + var invalidIntermediates = this.Context.Intermediates.Where(i => !i.HasLevel(Data.IntermediateLevels.Compiled)); + if (invalidIntermediates.Any()) + { + this.Messaging.Write(ErrorMessages.IntermediatesMustBeCompiled(String.Join(", ", invalidIntermediates.Select(i => i.Id)))); + } + Intermediate intermediate = null; try { @@ -564,7 +570,7 @@ namespace WixToolset.Core var collate = new CollateLocalizationsCommand(this.Messaging, localizations); var localizationsByCulture = collate.Execute(); - intermediate = new Intermediate(resolvedSection.Id, new[] { resolvedSection }, localizationsByCulture); + intermediate = new Intermediate(resolvedSection.Id, Data.IntermediateLevels.Linked, new[] { resolvedSection }, localizationsByCulture); #if MOVE_TO_BACKEND this.CheckOutputConsistency(output); diff --git a/src/WixToolset.Core/Resolver.cs b/src/WixToolset.Core/Resolver.cs index 6913ce98..d4a03d82 100644 --- a/src/WixToolset.Core/Resolver.cs +++ b/src/WixToolset.Core/Resolver.cs @@ -114,6 +114,8 @@ namespace WixToolset.Core var expectedEmbeddedFiles = filesWithEmbeddedFiles.GetExpectedEmbeddedFiles(); + context.IntermediateRepresentation.UpdateLevel(IntermediateLevels.Resolved); + return new ResolveResult { Codepage = codepage.HasValue ? codepage.Value : -1, diff --git a/src/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs b/src/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs index da1a374f..254b78f8 100644 --- a/src/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs @@ -6,13 +6,42 @@ namespace WixToolsetTest.CoreIntegration using System.IO; using System.Linq; using WixBuildTools.TestSupport; + using WixToolset.Core; using WixToolset.Core.TestPackage; using WixToolset.Data; using WixToolset.Data.Tuples; + using WixToolset.Extensibility.Data; + using WixToolset.Extensibility.Services; using Xunit; public class LinkerFixture { + [Fact] + public void MustCompileBeforeLinking() + { + var intermediate1 = new Intermediate("TestIntermediate1", new[] { new IntermediateSection("test1", SectionType.Product, 65001) }, null); + var intermediate2 = new Intermediate("TestIntermediate2", new[] { new IntermediateSection("test2", SectionType.Fragment, 65001) }, null); + var serviceProvider = new WixToolsetServiceProvider(); + + var listener = new TestMessageListener(); + var messaging = serviceProvider.GetService(); + messaging.SetListener(listener); + + var creator = serviceProvider.GetService(); + var context = serviceProvider.GetService(); + context.Extensions = Enumerable.Empty(); + context.ExtensionData = Enumerable.Empty(); + context.Intermediates = new[] { intermediate1, intermediate2 }; + context.TupleDefinitionCreator = creator; + + var linker = serviceProvider.GetService(); + linker.Link(context); + + Assert.Equal((int)ErrorMessages.Ids.IntermediatesMustBeCompiled, messaging.LastErrorNumber); + Assert.Single(listener.Messages); + Assert.EndsWith("TestIntermediate1, TestIntermediate2", listener.Messages[0].ToString()); + } + [Fact] public void CanBuildWithOverridableActions() { diff --git a/src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs b/src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs index 9d057dd8..2141e68c 100644 --- a/src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs @@ -41,6 +41,12 @@ namespace WixToolsetTest.CoreIntegration Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\MsiPackage\test.txt"))); var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); + + Assert.False(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Compiled)); + Assert.True(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Linked)); + Assert.True(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Resolved)); + Assert.True(intermediate.HasLevel(WixToolset.Data.WindowsInstaller.IntermediateLevels.FullyBound)); + var section = intermediate.Sections.Single(); var fileTuple = section.Tuples.OfType().First(); @@ -468,6 +474,50 @@ namespace WixToolsetTest.CoreIntegration } } + [Fact] + public void CanBuildWithPartialWixpdbInput() + { + var folder = TestData.Get(@"TestData\SingleFile"); + + using (var fs = new DisposableFileSystem()) + { + var baseFolder = fs.GetFolder(); + var intermediateFolder = Path.Combine(baseFolder, "obj"); + var wixpdbPath = Path.Combine(baseFolder, @"partial\test.wixpdb"); + + var result = WixRunner.Execute(new[] + { + "build", + Path.Combine(folder, "Package.wxs"), + Path.Combine(folder, "PackageComponents.wxs"), + "-loc", Path.Combine(folder, "Package.en-us.wxl"), + "-bindpath", Path.Combine(folder, "data"), + "-intermediateFolder", intermediateFolder, + //"-o", Path.Combine(baseFolder, @"partial\test.msi"), + "-pdb", wixpdbPath, + "-pdbtype", "Partial", + }, out var messages); + Assert.Equal(0, result); + + result = WixRunner.Execute(new[] + { + "build", + wixpdbPath, + "-loc", Path.Combine(folder, "Package.en-us.wxl"), + "-bindpath", Path.Combine(folder, "data"), + "-intermediateFolder", intermediateFolder, + "-o", Path.Combine(baseFolder, @"bin\test.msi"), + }, out messages); + Assert.Equal(0, result); + + var builtFiles = Directory.GetFiles(Path.Combine(baseFolder, @"bin")); + Assert.Equal(new[]{ + "test.msi", + "test.wixpdb", + }, builtFiles.Select(Path.GetFileName).ToArray()); + } + } + [Fact] public void CanBuildWixlib() { diff --git a/src/test/WixToolsetTest.CoreIntegration/WixiplFixture.cs b/src/test/WixToolsetTest.CoreIntegration/WixiplFixture.cs index 5927987b..b3d7da26 100644 --- a/src/test/WixToolsetTest.CoreIntegration/WixiplFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/WixiplFixture.cs @@ -23,6 +23,7 @@ namespace WixToolsetTest.CoreIntegration { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); + var wixiplPath = Path.Combine(intermediateFolder, @"test.wixipl"); var result = WixRunner.Execute(new[] { @@ -30,11 +31,17 @@ namespace WixToolsetTest.CoreIntegration Path.Combine(folder, "Package.wxs"), Path.Combine(folder, "PackageComponents.wxs"), "-intermediateFolder", intermediateFolder, - "-o", Path.Combine(intermediateFolder, @"test.wixipl") + "-o", wixiplPath, }); result.AssertSuccess(); + var intermediate = Intermediate.Load(wixiplPath); + + Assert.False(intermediate.HasLevel(IntermediateLevels.Compiled)); + Assert.True(intermediate.HasLevel(IntermediateLevels.Linked)); + Assert.False(intermediate.HasLevel(IntermediateLevels.Resolved)); + result = WixRunner.Execute(new[] { "build", @@ -47,7 +54,12 @@ namespace WixToolsetTest.CoreIntegration result.AssertSuccess(); - var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); + intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); + + Assert.False(intermediate.HasLevel(IntermediateLevels.Compiled)); + Assert.True(intermediate.HasLevel(IntermediateLevels.Linked)); + Assert.True(intermediate.HasLevel(IntermediateLevels.Resolved)); + var section = intermediate.Sections.Single(); var fileTuple = section.Tuples.OfType().First(); diff --git a/src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs b/src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs index a48a8370..5f8a278e 100644 --- a/src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs +++ b/src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs @@ -77,17 +77,25 @@ namespace WixToolsetTest.CoreIntegration { var baseFolder = fs.GetFolder(); var intermediateFolder = Path.Combine(baseFolder, "obj"); + var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib"); var result = WixRunner.Execute(new[] { "build", Path.Combine(folder, "PackageComponents.wxs"), "-intermediateFolder", intermediateFolder, - "-o", Path.Combine(intermediateFolder, @"test.wixlib") + "-o", wixlibPath, }); result.AssertSuccess(); + var wixlib = Intermediate.Load(wixlibPath); + + Assert.True(wixlib.HasLevel(IntermediateLevels.Compiled)); + Assert.True(wixlib.HasLevel(IntermediateLevels.Combined)); + Assert.False(wixlib.HasLevel(IntermediateLevels.Linked)); + Assert.False(wixlib.HasLevel(IntermediateLevels.Resolved)); + result = WixRunner.Execute(new[] { "build", @@ -102,6 +110,12 @@ namespace WixToolsetTest.CoreIntegration result.AssertSuccess(); var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); + + Assert.False(intermediate.HasLevel(IntermediateLevels.Compiled)); + Assert.False(intermediate.HasLevel(IntermediateLevels.Combined)); + Assert.True(intermediate.HasLevel(IntermediateLevels.Linked)); + Assert.True(intermediate.HasLevel(IntermediateLevels.Resolved)); + var section = intermediate.Sections.Single(); var wixFile = section.Tuples.OfType().First(); -- cgit v1.2.3-55-g6feb