@joebigelow / wix / commits / 1adfdda9

Add intermediate levels to track how IR has been lowered.

Bob Arnson committed Mar 26, 2020 at 13:51 UTC 1adfdda935b814541693cd550bb34fdbf2942b1f
9 files changed +140 -12
src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs
+18 -7
@@ -100,6 +100,11 @@ namespace WixToolset.Core.WindowsInstaller.Bind
100
101 public IBindResult Execute()
102 {
103 + if (!this.Intermediate.HasLevel(Data.IntermediateLevels.Linked) && !this.Intermediate.HasLevel(Data.IntermediateLevels.Resolved))
104 + {
105 + this.Messaging.Write(ErrorMessages.IntermediatesMustBeResolved(this.Intermediate.Id));
106 + }
107 +
108 var section = this.Intermediate.Sections.Single();
109
110 var fileTransfers = new List<IFileTransfer>();
@@ -178,15 +183,18 @@ namespace WixToolset.Core.WindowsInstaller.Bind
183 }
184 }
185
181 - // Sequence all the actions.
186 + if (!this.Intermediate.HasLevel(Data.WindowsInstaller.IntermediateLevels.PartiallyBound))
187 {
183 - var command = new SequenceActionsCommand(this.Messaging, section);
184 - command.Execute();
185 - }
188 + // Sequence all the actions.
189 + {
190 + var command = new SequenceActionsCommand(this.Messaging, section);
191 + command.Execute();
192 + }
193
187 - {
188 - var command = new CreateSpecialPropertiesCommand(section);
189 - command.Execute();
194 + {
195 + var command = new CreateSpecialPropertiesCommand(section);
196 + command.Execute();
197 + }
198 }
199
200 #if TODO_PATCHING
@@ -220,6 +228,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind
228 if (this.PdbType == PdbType.Partial)
229 {
230 // Time to create the output object, since we're bypassing everything that touches files.
231 + this.Intermediate.UpdateLevel(Data.WindowsInstaller.IntermediateLevels.PartiallyBound);
232 +
233 var command = new CreateOutputFromIRCommand(this.Messaging, section, tableDefinitions, this.BackendExtensions);
234 command.Execute();
235
@@ -227,6 +237,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
237 }
238 else
239 {
240 + this.Intermediate.UpdateLevel(Data.WindowsInstaller.IntermediateLevels.FullyBound);
241 this.Messaging.Write(VerboseMessages.UpdatingFileInformation());
242
243 // Extract files that come from binary .wixlibs and WixExtensions (this does not extract files from merge modules).
src/WixToolset.Core/Compiler.cs
+2
@@ -163,6 +163,8 @@ namespace WixToolset.Core
163 this.Core = null;
164 }
165
166 + target.UpdateLevel(IntermediateLevels.Compiled);
167 +
168 return this.Messaging.EncounteredError ? null : target;
169 }
170
src/WixToolset.Core/Librarian.cs
+3 -1
@@ -63,7 +63,9 @@ namespace WixToolset.Core
63 section.LibraryId = context.LibraryId;
64 }
65
66 - library = new Intermediate(context.LibraryId, sections, localizationsByCulture);
66 + library = new Intermediate(context.LibraryId, IntermediateLevels.Compiled, sections, localizationsByCulture);
67 +
68 + library.UpdateLevel(IntermediateLevels.Combined);
69
70 this.Validate(library);
71 }
src/WixToolset.Core/Linker.cs
+7 -1
@@ -70,6 +70,12 @@ namespace WixToolset.Core
70 extension.PreLink(this.Context);
71 }
72
73 + var invalidIntermediates = this.Context.Intermediates.Where(i => !i.HasLevel(Data.IntermediateLevels.Compiled));
74 + if (invalidIntermediates.Any())
75 + {
76 + this.Messaging.Write(ErrorMessages.IntermediatesMustBeCompiled(String.Join(", ", invalidIntermediates.Select(i => i.Id))));
77 + }
78 +
79 Intermediate intermediate = null;
80 try
81 {
@@ -564,7 +570,7 @@ namespace WixToolset.Core
570 var collate = new CollateLocalizationsCommand(this.Messaging, localizations);
571 var localizationsByCulture = collate.Execute();
572
567 - intermediate = new Intermediate(resolvedSection.Id, new[] { resolvedSection }, localizationsByCulture);
573 + intermediate = new Intermediate(resolvedSection.Id, Data.IntermediateLevels.Linked, new[] { resolvedSection }, localizationsByCulture);
574
575 #if MOVE_TO_BACKEND
576 this.CheckOutputConsistency(output);
src/WixToolset.Core/Resolver.cs
+2
@@ -114,6 +114,8 @@ namespace WixToolset.Core
114
115 var expectedEmbeddedFiles = filesWithEmbeddedFiles.GetExpectedEmbeddedFiles();
116
117 + context.IntermediateRepresentation.UpdateLevel(IntermediateLevels.Resolved);
118 +
119 return new ResolveResult
120 {
121 Codepage = codepage.HasValue ? codepage.Value : -1,
src/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs
+29
@@ -6,13 +6,42 @@ namespace WixToolsetTest.CoreIntegration
6 using System.IO;
7 using System.Linq;
8 using WixBuildTools.TestSupport;
9 + using WixToolset.Core;
10 using WixToolset.Core.TestPackage;
11 using WixToolset.Data;
12 using WixToolset.Data.Tuples;
13 + using WixToolset.Extensibility.Data;
14 + using WixToolset.Extensibility.Services;
15 using Xunit;
16
17 public class LinkerFixture
18 {
19 + [Fact]
20 + public void MustCompileBeforeLinking()
21 + {
22 + var intermediate1 = new Intermediate("TestIntermediate1", new[] { new IntermediateSection("test1", SectionType.Product, 65001) }, null);
23 + var intermediate2 = new Intermediate("TestIntermediate2", new[] { new IntermediateSection("test2", SectionType.Fragment, 65001) }, null);
24 + var serviceProvider = new WixToolsetServiceProvider();
25 +
26 + var listener = new TestMessageListener();
27 + var messaging = serviceProvider.GetService<IMessaging>();
28 + messaging.SetListener(listener);
29 +
30 + var creator = serviceProvider.GetService<ITupleDefinitionCreator>();
31 + var context = serviceProvider.GetService<ILinkContext>();
32 + context.Extensions = Enumerable.Empty<WixToolset.Extensibility.ILinkerExtension>();
33 + context.ExtensionData = Enumerable.Empty<WixToolset.Extensibility.IExtensionData>();
34 + context.Intermediates = new[] { intermediate1, intermediate2 };
35 + context.TupleDefinitionCreator = creator;
36 +
37 + var linker = serviceProvider.GetService<ILinker>();
38 + linker.Link(context);
39 +
40 + Assert.Equal((int)ErrorMessages.Ids.IntermediatesMustBeCompiled, messaging.LastErrorNumber);
41 + Assert.Single(listener.Messages);
42 + Assert.EndsWith("TestIntermediate1, TestIntermediate2", listener.Messages[0].ToString());
43 + }
44 +
45 [Fact]
46 public void CanBuildWithOverridableActions()
47 {
src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs
+50
@@ -41,6 +41,12 @@ namespace WixToolsetTest.CoreIntegration
41 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\MsiPackage\test.txt")));
42
43 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
44 +
45 + Assert.False(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Compiled));
46 + Assert.True(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Linked));
47 + Assert.True(intermediate.HasLevel(WixToolset.Data.IntermediateLevels.Resolved));
48 + Assert.True(intermediate.HasLevel(WixToolset.Data.WindowsInstaller.IntermediateLevels.FullyBound));
49 +
50 var section = intermediate.Sections.Single();
51
52 var fileTuple = section.Tuples.OfType<FileTuple>().First();
@@ -468,6 +474,50 @@ namespace WixToolsetTest.CoreIntegration
474 }
475 }
476
477 + [Fact]
478 + public void CanBuildWithPartialWixpdbInput()
479 + {
480 + var folder = TestData.Get(@"TestData\SingleFile");
481 +
482 + using (var fs = new DisposableFileSystem())
483 + {
484 + var baseFolder = fs.GetFolder();
485 + var intermediateFolder = Path.Combine(baseFolder, "obj");
486 + var wixpdbPath = Path.Combine(baseFolder, @"partial\test.wixpdb");
487 +
488 + var result = WixRunner.Execute(new[]
489 + {
490 + "build",
491 + Path.Combine(folder, "Package.wxs"),
492 + Path.Combine(folder, "PackageComponents.wxs"),
493 + "-loc", Path.Combine(folder, "Package.en-us.wxl"),
494 + "-bindpath", Path.Combine(folder, "data"),
495 + "-intermediateFolder", intermediateFolder,
496 + //"-o", Path.Combine(baseFolder, @"partial\test.msi"),
497 + "-pdb", wixpdbPath,
498 + "-pdbtype", "Partial",
499 + }, out var messages);
500 + Assert.Equal(0, result);
501 +
502 + result = WixRunner.Execute(new[]
503 + {
504 + "build",
505 + wixpdbPath,
506 + "-loc", Path.Combine(folder, "Package.en-us.wxl"),
507 + "-bindpath", Path.Combine(folder, "data"),
508 + "-intermediateFolder", intermediateFolder,
509 + "-o", Path.Combine(baseFolder, @"bin\test.msi"),
510 + }, out messages);
511 + Assert.Equal(0, result);
512 +
513 + var builtFiles = Directory.GetFiles(Path.Combine(baseFolder, @"bin"));
514 + Assert.Equal(new[]{
515 + "test.msi",
516 + "test.wixpdb",
517 + }, builtFiles.Select(Path.GetFileName).ToArray());
518 + }
519 + }
520 +
521 [Fact]
522 public void CanBuildWixlib()
523 {
src/test/WixToolsetTest.CoreIntegration/WixiplFixture.cs
+14 -2
@@ -23,6 +23,7 @@ namespace WixToolsetTest.CoreIntegration
23 {
24 var baseFolder = fs.GetFolder();
25 var intermediateFolder = Path.Combine(baseFolder, "obj");
26 + var wixiplPath = Path.Combine(intermediateFolder, @"test.wixipl");
27
28 var result = WixRunner.Execute(new[]
29 {
@@ -30,11 +31,17 @@ namespace WixToolsetTest.CoreIntegration
31 Path.Combine(folder, "Package.wxs"),
32 Path.Combine(folder, "PackageComponents.wxs"),
33 "-intermediateFolder", intermediateFolder,
33 - "-o", Path.Combine(intermediateFolder, @"test.wixipl")
34 + "-o", wixiplPath,
35 });
36
37 result.AssertSuccess();
38
39 + var intermediate = Intermediate.Load(wixiplPath);
40 +
41 + Assert.False(intermediate.HasLevel(IntermediateLevels.Compiled));
42 + Assert.True(intermediate.HasLevel(IntermediateLevels.Linked));
43 + Assert.False(intermediate.HasLevel(IntermediateLevels.Resolved));
44 +
45 result = WixRunner.Execute(new[]
46 {
47 "build",
@@ -47,7 +54,12 @@ namespace WixToolsetTest.CoreIntegration
54
55 result.AssertSuccess();
56
50 - var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
57 + intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
58 +
59 + Assert.False(intermediate.HasLevel(IntermediateLevels.Compiled));
60 + Assert.True(intermediate.HasLevel(IntermediateLevels.Linked));
61 + Assert.True(intermediate.HasLevel(IntermediateLevels.Resolved));
62 +
63 var section = intermediate.Sections.Single();
64
65 var fileTuple = section.Tuples.OfType<FileTuple>().First();
src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs
+15 -1
@@ -77,17 +77,25 @@ namespace WixToolsetTest.CoreIntegration
77 {
78 var baseFolder = fs.GetFolder();
79 var intermediateFolder = Path.Combine(baseFolder, "obj");
80 + var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
81
82 var result = WixRunner.Execute(new[]
83 {
84 "build",
85 Path.Combine(folder, "PackageComponents.wxs"),
86 "-intermediateFolder", intermediateFolder,
86 - "-o", Path.Combine(intermediateFolder, @"test.wixlib")
87 + "-o", wixlibPath,
88 });
89
90 result.AssertSuccess();
91
92 + var wixlib = Intermediate.Load(wixlibPath);
93 +
94 + Assert.True(wixlib.HasLevel(IntermediateLevels.Compiled));
95 + Assert.True(wixlib.HasLevel(IntermediateLevels.Combined));
96 + Assert.False(wixlib.HasLevel(IntermediateLevels.Linked));
97 + Assert.False(wixlib.HasLevel(IntermediateLevels.Resolved));
98 +
99 result = WixRunner.Execute(new[]
100 {
101 "build",
@@ -102,6 +110,12 @@ namespace WixToolsetTest.CoreIntegration
110 result.AssertSuccess();
111
112 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb"));
113 +
114 + Assert.False(intermediate.HasLevel(IntermediateLevels.Compiled));
115 + Assert.False(intermediate.HasLevel(IntermediateLevels.Combined));
116 + Assert.True(intermediate.HasLevel(IntermediateLevels.Linked));
117 + Assert.True(intermediate.HasLevel(IntermediateLevels.Resolved));
118 +
119 var section = intermediate.Sections.Single();
120
121 var wixFile = section.Tuples.OfType<FileTuple>().First();