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();