aboutsummaryrefslogtreecommitdiff
path: root/src/WixToolset.Core/CommandLine/BuildCommand.cs
diff options
context:
space:
mode:
Diffstat (limited to 'src/WixToolset.Core/CommandLine/BuildCommand.cs')
-rw-r--r--src/WixToolset.Core/CommandLine/BuildCommand.cs122
1 files changed, 69 insertions, 53 deletions
diff --git a/src/WixToolset.Core/CommandLine/BuildCommand.cs b/src/WixToolset.Core/CommandLine/BuildCommand.cs
index 43b75f33..92aa3343 100644
--- a/src/WixToolset.Core/CommandLine/BuildCommand.cs
+++ b/src/WixToolset.Core/CommandLine/BuildCommand.cs
@@ -7,7 +7,7 @@ namespace WixToolset.Core
7 using System.IO; 7 using System.IO;
8 using System.Linq; 8 using System.Linq;
9 using WixToolset.Data; 9 using WixToolset.Data;
10 using WixToolset.Data.Tuples; 10 using WixToolset.Data.Bind;
11 using WixToolset.Extensibility; 11 using WixToolset.Extensibility;
12 using WixToolset.Extensibility.Services; 12 using WixToolset.Extensibility.Services;
13 13
@@ -90,6 +90,12 @@ namespace WixToolset.Core
90 90
91 library?.Save(this.OutputPath); 91 library?.Save(this.OutputPath);
92 } 92 }
93 else if (this.OutputType == OutputType.Wixout)
94 {
95 var output = this.LinkPhase(intermediates);
96
97 output?.Save(this.OutputPath);
98 }
93 else 99 else
94 { 100 {
95 var output = this.LinkPhase(intermediates); 101 var output = this.LinkPhase(intermediates);
@@ -147,22 +153,20 @@ namespace WixToolset.Core
147 { 153 {
148 var localizations = this.LoadLocalizationFiles().ToList(); 154 var localizations = this.LoadLocalizationFiles().ToList();
149 155
150 // If there was an error adding localization files, then bail. 156 // If there was an error loading localization files, then bail.
151 if (this.Messaging.EncounteredError) 157 if (this.Messaging.EncounteredError)
152 { 158 {
153 return null; 159 return null;
154 } 160 }
155 161
156 var resolver = CreateWixResolverWithVariables(null, null);
157
158 var context = new LibraryContext(); 162 var context = new LibraryContext();
163 context.Messaging = this.Messaging;
159 context.BindFiles = this.BindFiles; 164 context.BindFiles = this.BindFiles;
160 context.BindPaths = this.BindPaths; 165 context.BindPaths = this.BindPaths;
161 context.Extensions = this.ExtensionManager.Create<ILibrarianExtension>(); 166 context.Extensions = this.ExtensionManager.Create<ILibrarianExtension>();
162 context.Localizations = localizations; 167 context.Localizations = localizations;
163 context.LibraryId = Guid.NewGuid().ToString("N"); 168 context.LibraryId = Guid.NewGuid().ToString("N");
164 context.Intermediates = intermediates; 169 context.Intermediates = intermediates;
165 context.WixVariableResolver = resolver;
166 170
167 var librarian = new Librarian(); 171 var librarian = new Librarian();
168 return librarian.Combine(context); 172 return librarian.Combine(context);
@@ -174,6 +178,11 @@ namespace WixToolset.Core
174 178
175 var libraries = this.LoadLibraries(creator); 179 var libraries = this.LoadLibraries(creator);
176 180
181 if (this.Messaging.EncounteredError)
182 {
183 return null;
184 }
185
177 var context = this.ServiceProvider.GetService<ILinkContext>(); 186 var context = this.ServiceProvider.GetService<ILinkContext>();
178 context.Messaging = this.Messaging; 187 context.Messaging = this.Messaging;
179 context.Extensions = this.ExtensionManager.Create<ILinkerExtension>(); 188 context.Extensions = this.ExtensionManager.Create<ILinkerExtension>();
@@ -183,48 +192,72 @@ namespace WixToolset.Core
183 context.TupleDefinitionCreator = creator; 192 context.TupleDefinitionCreator = creator;
184 193
185 var linker = new Linker(); 194 var linker = new Linker();
186 var output = linker.Link(context); 195 return linker.Link(context);
187 return output;
188 } 196 }
189 197
190 private void BindPhase(Intermediate output) 198 private void BindPhase(Intermediate output)
191 { 199 {
192 var localizations = this.LoadLocalizationFiles().ToList(); 200 var localizations = this.LoadLocalizationFiles().ToList();
193 201
194 var localizer = new Localizer(this.Messaging, localizations); 202 // If there was an error loading localization files, then bail.
203 if (this.Messaging.EncounteredError)
204 {
205 return;
206 }
195 207
196 var resolver = CreateWixResolverWithVariables(localizer, output); 208 ResolveResult resolveResult;
209 {
210 var resolver = new Resolver(this.ServiceProvider, this.BindPaths, output, this.IntermediateFolder, localizations);
211 resolveResult = resolver.Execute();
212 }
197 213
198 var intermediateFolder = this.IntermediateFolder; 214 if (this.Messaging.EncounteredError)
199 if (String.IsNullOrEmpty(intermediateFolder))
200 { 215 {
201 intermediateFolder = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 216 return;
202 } 217 }
203 218
204 var context = this.ServiceProvider.GetService<IBindContext>(); 219 BindResult bindResult;
205 context.Messaging = this.Messaging; 220 {
206 context.ExtensionManager = this.ExtensionManager; 221 var intermediateFolder = this.IntermediateFolder;
207 context.BindPaths = this.BindPaths ?? Array.Empty<BindPath>(); 222 if (String.IsNullOrEmpty(intermediateFolder))
208 //context.CabbingThreadCount = this.CabbingThreadCount; 223 {
209 context.CabCachePath = this.CabCachePath; 224 intermediateFolder = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
210 context.Codepage = localizer.Codepage; 225 }
211 //context.DefaultCompressionLevel = this.DefaultCompressionLevel; 226
212 //context.Ices = this.Ices; 227 var context = this.ServiceProvider.GetService<IBindContext>();
213 context.IntermediateFolder = intermediateFolder; 228 context.Messaging = this.Messaging;
214 context.IntermediateRepresentation = output; 229 //context.CabbingThreadCount = this.CabbingThreadCount;
215 context.OutputPath = this.OutputPath; 230 context.CabCachePath = this.CabCachePath;
216 context.OutputPdbPath = Path.ChangeExtension(this.OutputPath, ".wixpdb"); 231 context.Codepage = resolveResult.Codepage;
217 //context.SuppressIces = this.SuppressIces; 232 //context.DefaultCompressionLevel = this.DefaultCompressionLevel;
218 context.SuppressValidation = true; 233 context.DelayedFields = resolveResult.DelayedFields;
219 //context.SuppressValidation = this.SuppressValidation; 234 context.ExpectedEmbeddedFiles = resolveResult.ExpectedEmbeddedFiles;
220 context.WixVariableResolver = resolver; 235 //context.Ices = this.Ices;
221 context.ContentsFile = this.ContentsFile; 236 context.IntermediateFolder = intermediateFolder;
222 context.OutputsFile = this.OutputsFile; 237 context.IntermediateRepresentation = resolveResult.IntermediateRepresentation;
223 context.BuiltOutputsFile = this.BuiltOutputsFile; 238 context.OutputPath = this.OutputPath;
224 context.WixprojectFile = this.WixProjectFile; 239 context.OutputPdbPath = Path.ChangeExtension(this.OutputPath, ".wixpdb");
225 240 //context.SuppressIces = this.SuppressIces;
226 var binder = new Binder(); 241 context.SuppressValidation = true; // TODO: set this correctly
227 binder.Bind(context); 242 context.ContentsFile = this.ContentsFile;
243 context.OutputsFile = this.OutputsFile;
244 context.BuiltOutputsFile = this.BuiltOutputsFile;
245 context.WixprojectFile = this.WixProjectFile;
246
247 var binder = new Binder();
248 bindResult = binder.Bind(context);
249 }
250
251 if (this.Messaging.EncounteredError)
252 {
253 return;
254 }
255
256 {
257 // TODO: correctly set SuppressAclReset bool at the end.
258 var layout = new Layout(this.ServiceProvider, bindResult.FileTransfers, bindResult.ContentFilePaths, this.ContentsFile, this.OutputsFile, this.BuiltOutputsFile, false);
259 layout.Execute();
260 }
228 } 261 }
229 262
230 private IEnumerable<Intermediate> LoadLibraries(ITupleDefinitionCreator creator) 263 private IEnumerable<Intermediate> LoadLibraries(ITupleDefinitionCreator creator)
@@ -264,22 +297,5 @@ namespace WixToolset.Core
264 yield return localization; 297 yield return localization;
265 } 298 }
266 } 299 }
267
268 private WixVariableResolver CreateWixResolverWithVariables(Localizer localizer, Intermediate output)
269 {
270 var resolver = new WixVariableResolver(this.Messaging, localizer);
271
272 // Gather all the wix variables.
273 var wixVariables = output?.Sections.SelectMany(s => s.Tuples).OfType<WixVariableTuple>();
274 if (wixVariables != null)
275 {
276 foreach (var wixVariableRow in wixVariables)
277 {
278 resolver.AddVariable(wixVariableRow);
279 }
280 }
281
282 return resolver;
283 }
284 } 300 }
285} 301}