aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorBob Arnson <bob@firegiant.com>2020-03-26 13:51:14 -0400
committerBob Arnson <bob@firegiant.com>2020-03-26 15:14:33 -0400
commit1adfdda935b814541693cd550bb34fdbf2942b1f (patch)
tree72b815664870bd37b9c049faa102348cc872fdd9 /src
parent22c97adba70fa838b8f285d404750d0f8fe685d8 (diff)
downloadwix-1adfdda935b814541693cd550bb34fdbf2942b1f.tar.gz
wix-1adfdda935b814541693cd550bb34fdbf2942b1f.tar.bz2
wix-1adfdda935b814541693cd550bb34fdbf2942b1f.zip
Add intermediate levels to track how IR has been lowered.
Diffstat (limited to 'src')
-rw-r--r--src/WixToolset.Core.WindowsInstaller/Bind/BindDatabaseCommand.cs25
-rw-r--r--src/WixToolset.Core/Compiler.cs2
-rw-r--r--src/WixToolset.Core/Librarian.cs4
-rw-r--r--src/WixToolset.Core/Linker.cs8
-rw-r--r--src/WixToolset.Core/Resolver.cs2
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/LinkerFixture.cs29
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/MsiFixture.cs50
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/WixiplFixture.cs16
-rw-r--r--src/test/WixToolsetTest.CoreIntegration/WixlibFixture.cs16
9 files changed, 140 insertions, 12 deletions
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
100 100
101 public IBindResult Execute() 101 public IBindResult Execute()
102 { 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
103 var section = this.Intermediate.Sections.Single(); 108 var section = this.Intermediate.Sections.Single();
104 109
105 var fileTransfers = new List<IFileTransfer>(); 110 var fileTransfers = new List<IFileTransfer>();
@@ -178,15 +183,18 @@ namespace WixToolset.Core.WindowsInstaller.Bind
178 } 183 }
179 } 184 }
180 185
181 // Sequence all the actions. 186 if (!this.Intermediate.HasLevel(Data.WindowsInstaller.IntermediateLevels.PartiallyBound))
182 { 187 {
183 var command = new SequenceActionsCommand(this.Messaging, section); 188 // Sequence all the actions.
184 command.Execute(); 189 {
185 } 190 var command = new SequenceActionsCommand(this.Messaging, section);
191 command.Execute();
192 }
186 193
187 { 194 {
188 var command = new CreateSpecialPropertiesCommand(section); 195 var command = new CreateSpecialPropertiesCommand(section);
189 command.Execute(); 196 command.Execute();
197 }
190 } 198 }
191 199
192#if TODO_PATCHING 200#if TODO_PATCHING
@@ -220,6 +228,8 @@ namespace WixToolset.Core.WindowsInstaller.Bind
220 if (this.PdbType == PdbType.Partial) 228 if (this.PdbType == PdbType.Partial)
221 { 229 {
222 // Time to create the output object, since we're bypassing everything that touches files. 230 // Time to create the output object, since we're bypassing everything that touches files.
231 this.Intermediate.UpdateLevel(Data.WindowsInstaller.IntermediateLevels.PartiallyBound);
232
223 var command = new CreateOutputFromIRCommand(this.Messaging, section, tableDefinitions, this.BackendExtensions); 233 var command = new CreateOutputFromIRCommand(this.Messaging, section, tableDefinitions, this.BackendExtensions);
224 command.Execute(); 234 command.Execute();
225 235
@@ -227,6 +237,7 @@ namespace WixToolset.Core.WindowsInstaller.Bind
227 } 237 }
228 else 238 else
229 { 239 {
240 this.Intermediate.UpdateLevel(Data.WindowsInstaller.IntermediateLevels.FullyBound);
230 this.Messaging.Write(VerboseMessages.UpdatingFileInformation()); 241 this.Messaging.Write(VerboseMessages.UpdatingFileInformation());
231 242
232 // Extract files that come from binary .wixlibs and WixExtensions (this does not extract files from merge modules). 243 // 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
163 this.Core = null; 163 this.Core = null;
164 } 164 }
165 165
166 target.UpdateLevel(IntermediateLevels.Compiled);
167
166 return this.Messaging.EncounteredError ? null : target; 168 return this.Messaging.EncounteredError ? null : target;
167 } 169 }
168 170
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
63 section.LibraryId = context.LibraryId; 63 section.LibraryId = context.LibraryId;
64 } 64 }
65 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);
67 69
68 this.Validate(library); 70 this.Validate(library);
69 } 71 }
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
70 extension.PreLink(this.Context); 70 extension.PreLink(this.Context);
71 } 71 }
72 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
73 Intermediate intermediate = null; 79 Intermediate intermediate = null;
74 try 80 try
75 { 81 {
@@ -564,7 +570,7 @@ namespace WixToolset.Core
564 var collate = new CollateLocalizationsCommand(this.Messaging, localizations); 570 var collate = new CollateLocalizationsCommand(this.Messaging, localizations);
565 var localizationsByCulture = collate.Execute(); 571 var localizationsByCulture = collate.Execute();
566 572
567 intermediate = new Intermediate(resolvedSection.Id, new[] { resolvedSection }, localizationsByCulture); 573 intermediate = new Intermediate(resolvedSection.Id, Data.IntermediateLevels.Linked, new[] { resolvedSection }, localizationsByCulture);
568 574
569#if MOVE_TO_BACKEND 575#if MOVE_TO_BACKEND
570 this.CheckOutputConsistency(output); 576 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
114 114
115 var expectedEmbeddedFiles = filesWithEmbeddedFiles.GetExpectedEmbeddedFiles(); 115 var expectedEmbeddedFiles = filesWithEmbeddedFiles.GetExpectedEmbeddedFiles();
116 116
117 context.IntermediateRepresentation.UpdateLevel(IntermediateLevels.Resolved);
118
117 return new ResolveResult 119 return new ResolveResult
118 { 120 {
119 Codepage = codepage.HasValue ? codepage.Value : -1, 121 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,14 +6,43 @@ namespace WixToolsetTest.CoreIntegration
6 using System.IO; 6 using System.IO;
7 using System.Linq; 7 using System.Linq;
8 using WixBuildTools.TestSupport; 8 using WixBuildTools.TestSupport;
9 using WixToolset.Core;
9 using WixToolset.Core.TestPackage; 10 using WixToolset.Core.TestPackage;
10 using WixToolset.Data; 11 using WixToolset.Data;
11 using WixToolset.Data.Tuples; 12 using WixToolset.Data.Tuples;
13 using WixToolset.Extensibility.Data;
14 using WixToolset.Extensibility.Services;
12 using Xunit; 15 using Xunit;
13 16
14 public class LinkerFixture 17 public class LinkerFixture
15 { 18 {
16 [Fact] 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]
17 public void CanBuildWithOverridableActions() 46 public void CanBuildWithOverridableActions()
18 { 47 {
19 var folder = TestData.Get(@"TestData\OverridableActions"); 48 var folder = TestData.Get(@"TestData\OverridableActions");
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
41 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\MsiPackage\test.txt"))); 41 Assert.True(File.Exists(Path.Combine(baseFolder, @"bin\MsiPackage\test.txt")));
42 42
43 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); 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
44 var section = intermediate.Sections.Single(); 50 var section = intermediate.Sections.Single();
45 51
46 var fileTuple = section.Tuples.OfType<FileTuple>().First(); 52 var fileTuple = section.Tuples.OfType<FileTuple>().First();
@@ -469,6 +475,50 @@ namespace WixToolsetTest.CoreIntegration
469 } 475 }
470 476
471 [Fact] 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]
472 public void CanBuildWixlib() 522 public void CanBuildWixlib()
473 { 523 {
474 var folder = TestData.Get(@"TestData\SingleFile"); 524 var folder = TestData.Get(@"TestData\SingleFile");
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
23 { 23 {
24 var baseFolder = fs.GetFolder(); 24 var baseFolder = fs.GetFolder();
25 var intermediateFolder = Path.Combine(baseFolder, "obj"); 25 var intermediateFolder = Path.Combine(baseFolder, "obj");
26 var wixiplPath = Path.Combine(intermediateFolder, @"test.wixipl");
26 27
27 var result = WixRunner.Execute(new[] 28 var result = WixRunner.Execute(new[]
28 { 29 {
@@ -30,11 +31,17 @@ namespace WixToolsetTest.CoreIntegration
30 Path.Combine(folder, "Package.wxs"), 31 Path.Combine(folder, "Package.wxs"),
31 Path.Combine(folder, "PackageComponents.wxs"), 32 Path.Combine(folder, "PackageComponents.wxs"),
32 "-intermediateFolder", intermediateFolder, 33 "-intermediateFolder", intermediateFolder,
33 "-o", Path.Combine(intermediateFolder, @"test.wixipl") 34 "-o", wixiplPath,
34 }); 35 });
35 36
36 result.AssertSuccess(); 37 result.AssertSuccess();
37 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
38 result = WixRunner.Execute(new[] 45 result = WixRunner.Execute(new[]
39 { 46 {
40 "build", 47 "build",
@@ -47,7 +54,12 @@ namespace WixToolsetTest.CoreIntegration
47 54
48 result.AssertSuccess(); 55 result.AssertSuccess();
49 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
51 var section = intermediate.Sections.Single(); 63 var section = intermediate.Sections.Single();
52 64
53 var fileTuple = section.Tuples.OfType<FileTuple>().First(); 65 var fileTuple = section.Tuples.OfType<FileTuple>().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
77 { 77 {
78 var baseFolder = fs.GetFolder(); 78 var baseFolder = fs.GetFolder();
79 var intermediateFolder = Path.Combine(baseFolder, "obj"); 79 var intermediateFolder = Path.Combine(baseFolder, "obj");
80 var wixlibPath = Path.Combine(intermediateFolder, @"test.wixlib");
80 81
81 var result = WixRunner.Execute(new[] 82 var result = WixRunner.Execute(new[]
82 { 83 {
83 "build", 84 "build",
84 Path.Combine(folder, "PackageComponents.wxs"), 85 Path.Combine(folder, "PackageComponents.wxs"),
85 "-intermediateFolder", intermediateFolder, 86 "-intermediateFolder", intermediateFolder,
86 "-o", Path.Combine(intermediateFolder, @"test.wixlib") 87 "-o", wixlibPath,
87 }); 88 });
88 89
89 result.AssertSuccess(); 90 result.AssertSuccess();
90 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
91 result = WixRunner.Execute(new[] 99 result = WixRunner.Execute(new[]
92 { 100 {
93 "build", 101 "build",
@@ -102,6 +110,12 @@ namespace WixToolsetTest.CoreIntegration
102 result.AssertSuccess(); 110 result.AssertSuccess();
103 111
104 var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wixpdb")); 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
105 var section = intermediate.Sections.Single(); 119 var section = intermediate.Sections.Single();
106 120
107 var wixFile = section.Tuples.OfType<FileTuple>().First(); 121 var wixFile = section.Tuples.OfType<FileTuple>().First();