@joebigelow / wix / commits / 79473d77

Support build of a .wixipl to final output

Rob Mensching committed Jul 31, 2018 at 15:29 UTC 79473d778b6cc4c8eec93b92e3b244aed904dac1
3 files changed +138 -24
src/WixToolset.Core/Binder.cs
-1
@@ -8,7 +8,6 @@ namespace WixToolset.Core
8 using System.Linq;
9 using System.Reflection;
10 using WixToolset.Data;
11 - using WixToolset.Data.Bind;
11 using WixToolset.Data.Tuples;
12 using WixToolset.Extensibility;
13 using WixToolset.Extensibility.Data;
src/WixToolset.Core/CommandLine/BuildCommand.cs
+49 -23
@@ -74,17 +74,16 @@ namespace WixToolset.Core.CommandLine
74
75 public int Execute()
76 {
77 - var wixobjs = this.CompilePhase();
77 + var creator = this.ServiceProvider.GetService<ITupleDefinitionCreator>();
78 +
79 + this.EvaluateSourceFiles(creator, out var codeFiles, out var wixipl);
80
81 if (this.Messaging.EncounteredError)
82 {
83 return this.Messaging.LastErrorNumber;
84 }
85
84 - if (!wixobjs.Any())
85 - {
86 - return 1;
87 - }
86 + var wixobjs = this.CompilePhase(codeFiles);
87
88 var wxls = this.LoadLocalizationFiles().ToList();
89
@@ -104,7 +103,10 @@ namespace WixToolset.Core.CommandLine
103 }
104 else
105 {
107 - var wixipl = this.LinkPhase(wixobjs);
106 + if (wixipl == null)
107 + {
108 + wixipl = this.LinkPhase(wixobjs, creator);
109 + }
110
111 if (!this.Messaging.EncounteredError)
112 {
@@ -122,11 +124,49 @@ namespace WixToolset.Core.CommandLine
124 return this.Messaging.LastErrorNumber;
125 }
126
125 - private IEnumerable<Intermediate> CompilePhase()
127 + private void EvaluateSourceFiles(ITupleDefinitionCreator creator, out List<SourceFile> codeFiles, out Intermediate wixipl)
128 {
127 - var intermediates = new List<Intermediate>();
129 + codeFiles = new List<SourceFile>();
130 +
131 + wixipl = null;
132
133 foreach (var sourceFile in this.SourceFiles)
134 + {
135 + var extension = Path.GetExtension(sourceFile.SourcePath);
136 +
137 + if (wixipl != null || ".wxs".Equals(extension, StringComparison.OrdinalIgnoreCase))
138 + {
139 + codeFiles.Add(sourceFile);
140 + }
141 + else
142 + {
143 + try
144 + {
145 + wixipl = Intermediate.Load(sourceFile.SourcePath, creator);
146 + }
147 + catch (WixException)
148 + {
149 + // We'll assume anything that isn't a valid intermediate is source code to compile.
150 + codeFiles.Add(sourceFile);
151 + }
152 + }
153 + }
154 +
155 + if (wixipl == null && codeFiles.Count == 0)
156 + {
157 + this.Messaging.Write(ErrorMessages.NoSourceFiles());
158 + }
159 + else if (wixipl != null && codeFiles.Count != 0)
160 + {
161 + this.Messaging.Write(ErrorMessages.WixiplSourceFileIsExclusive());
162 + }
163 + }
164 +
165 + private IEnumerable<Intermediate> CompilePhase(IEnumerable<SourceFile> sourceFiles)
166 + {
167 + var intermediates = new List<Intermediate>();
168 +
169 + foreach (var sourceFile in sourceFiles)
170 {
171 var preprocessor = new Preprocessor(this.ServiceProvider);
172 preprocessor.IncludeSearchPaths = this.IncludeSearchPaths;
@@ -159,12 +199,6 @@ namespace WixToolset.Core.CommandLine
199
200 private Intermediate LibraryPhase(IEnumerable<Intermediate> intermediates, IEnumerable<Localization> localizations)
201 {
162 - // If there was an error loading localization files, then bail.
163 - if (this.Messaging.EncounteredError)
164 - {
165 - return null;
166 - }
167 -
202 var librarian = new Librarian(this.ServiceProvider);
203 librarian.BindFiles = this.BindFiles;
204 librarian.BindPaths = this.BindPaths;
@@ -173,10 +207,8 @@ namespace WixToolset.Core.CommandLine
207 return librarian.Execute();
208 }
209
176 - private Intermediate LinkPhase(IEnumerable<Intermediate> intermediates)
210 + private Intermediate LinkPhase(IEnumerable<Intermediate> intermediates, ITupleDefinitionCreator creator)
211 {
178 - var creator = this.ServiceProvider.GetService<ITupleDefinitionCreator>();
179 -
212 var libraries = this.LoadLibraries(creator);
213
214 if (this.Messaging.EncounteredError)
@@ -194,12 +226,6 @@ namespace WixToolset.Core.CommandLine
226
227 private void BindPhase(Intermediate output, IEnumerable<Localization> localizations)
228 {
197 - // If there was an error loading localization files, then bail.
198 - if (this.Messaging.EncounteredError)
199 - {
200 - return;
201 - }
202 -
229 ResolveResult resolveResult;
230 {
231 var resolver = new Resolver(this.ServiceProvider);
src/test/WixToolsetTest.CoreIntegration/WixiplFixture.cs new
+89
@@ -0,0 +1,89 @@
1 +// 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.
2 +
3 +namespace WixToolsetTest.CoreIntegration
4 +{
5 + using System.IO;
6 + using System.Linq;
7 + using WixBuildTools.TestSupport;
8 + using WixToolset.Core.TestPackage;
9 + using WixToolset.Data;
10 + using WixToolset.Data.Tuples;
11 + using Xunit;
12 +
13 + public class WixiplFixture
14 + {
15 + [Fact]
16 + public void CanBuildSingleFile()
17 + {
18 + var folder = TestData.Get(@"TestData\SingleFile");
19 +
20 + using (var fs = new DisposableFileSystem())
21 + {
22 + var baseFolder = fs.GetFolder();
23 + var intermediateFolder = Path.Combine(baseFolder, "obj");
24 +
25 + var result = WixRunner.Execute(new[]
26 + {
27 + "build",
28 + Path.Combine(folder, "Package.wxs"),
29 + Path.Combine(folder, "PackageComponents.wxs"),
30 + "-intermediateFolder", intermediateFolder,
31 + "-o", Path.Combine(intermediateFolder, @"test.wixipl")
32 + }, out var messagesCompile);
33 + Assert.Equal(0, result);
34 +
35 + result = WixRunner.Execute(new[]
36 + {
37 + "build",
38 + Path.Combine(intermediateFolder, @"test.wixipl"),
39 + "-loc", Path.Combine(folder, "Package.en-us.wxl"),
40 + "-bindpath", Path.Combine(folder, "data"),
41 + "-intermediateFolder", intermediateFolder,
42 + "-o", Path.Combine(baseFolder, @"bin\test.msi")
43 + }, out var messagesBind);
44 + Assert.Equal(0, result);
45 +
46 + var intermediate = Intermediate.Load(Path.Combine(baseFolder, @"bin\test.wir"));
47 + var section = intermediate.Sections.Single();
48 +
49 + var wixFile = section.Tuples.OfType<WixFileTuple>().Single();
50 + Assert.Equal(Path.Combine(folder, @"data\test.txt"), wixFile[WixFileTupleFields.Source].AsPath().Path);
51 + Assert.Equal(@"test.txt", wixFile[WixFileTupleFields.Source].PreviousValue.AsPath().Path);
52 + }
53 + }
54 +
55 + [Fact]
56 + public void CannotBuildWithSourceFileAndWixipl()
57 + {
58 + var folder = TestData.Get(@"TestData\SingleFile");
59 +
60 + using (var fs = new DisposableFileSystem())
61 + {
62 + var baseFolder = fs.GetFolder();
63 + var intermediateFolder = Path.Combine(baseFolder, "obj");
64 +
65 + var result = WixRunner.Execute(new[]
66 + {
67 + "build",
68 + Path.Combine(folder, "Package.wxs"),
69 + Path.Combine(folder, "PackageComponents.wxs"),
70 + "-intermediateFolder", intermediateFolder,
71 + "-o", Path.Combine(intermediateFolder, @"test.wixipl")
72 + }, out var messagesCompile);
73 + Assert.Equal(0, result);
74 +
75 + result = WixRunner.Execute(new[]
76 + {
77 + "build",
78 + Path.Combine(folder, "Package.wxs"),
79 + Path.Combine(intermediateFolder, @"test.wixipl"),
80 + "-loc", Path.Combine(folder, "Package.en-us.wxl"),
81 + "-bindpath", Path.Combine(folder, "data"),
82 + "-intermediateFolder", intermediateFolder,
83 + "-o", Path.Combine(baseFolder, @"bin\test.msi")
84 + }, out var messagesBind);
85 + Assert.Equal((int)ErrorMessages.Ids.WixiplSourceFileIsExclusive, result);
86 + }
87 + }
88 + }
89 +}