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.cs194
1 files changed, 117 insertions, 77 deletions
diff --git a/src/WixToolset.Core/CommandLine/BuildCommand.cs b/src/WixToolset.Core/CommandLine/BuildCommand.cs
index 76502bb0..6052d979 100644
--- a/src/WixToolset.Core/CommandLine/BuildCommand.cs
+++ b/src/WixToolset.Core/CommandLine/BuildCommand.cs
@@ -8,6 +8,7 @@ namespace WixToolset.Core.CommandLine
8 using System.Linq; 8 using System.Linq;
9 using System.Xml.Linq; 9 using System.Xml.Linq;
10 using WixToolset.Data; 10 using WixToolset.Data;
11 using WixToolset.Extensibility;
11 using WixToolset.Extensibility.Data; 12 using WixToolset.Extensibility.Data;
12 using WixToolset.Extensibility.Services; 13 using WixToolset.Extensibility.Services;
13 14
@@ -172,16 +173,24 @@ namespace WixToolset.Core.CommandLine
172 173
173 foreach (var sourceFile in sourceFiles) 174 foreach (var sourceFile in sourceFiles)
174 { 175 {
175 var preprocessor = new Preprocessor(this.ServiceProvider); 176 var document = this.Preprocess(sourceFile.SourcePath);
176 preprocessor.IncludeSearchPaths = this.IncludeSearchPaths;
177 preprocessor.Platform = this.Platform;
178 preprocessor.SourcePath = sourceFile.SourcePath;
179 preprocessor.Variables = this.PreprocessorVariables;
180 177
181 XDocument document = null; 178 if (this.Messaging.EncounteredError)
179 {
180 continue;
181 }
182
183 var context = this.ServiceProvider.GetService<ICompileContext>();
184 context.Extensions = this.ExtensionManager.Create<ICompilerExtension>();
185 context.OutputPath = sourceFile.OutputPath;
186 context.Platform = this.Platform;
187 context.Source = document;
188
189 Intermediate intermediate = null;
182 try 190 try
183 { 191 {
184 document = preprocessor.Execute(); 192 var compiler = this.ServiceProvider.GetService<ICompiler>();
193 intermediate = compiler.Compile(context);
185 } 194 }
186 catch (WixException e) 195 catch (WixException e)
187 { 196 {
@@ -193,17 +202,6 @@ namespace WixToolset.Core.CommandLine
193 continue; 202 continue;
194 } 203 }
195 204
196 var compiler = new Compiler(this.ServiceProvider);
197 compiler.OutputPath = sourceFile.OutputPath;
198 compiler.Platform = this.Platform;
199 compiler.SourceDocument = document;
200 var intermediate = compiler.Execute();
201
202 if (this.Messaging.EncounteredError)
203 {
204 continue;
205 }
206
207 intermediates.Add(intermediate); 205 intermediates.Add(intermediate);
208 } 206 }
209 207
@@ -212,14 +210,27 @@ namespace WixToolset.Core.CommandLine
212 210
213 private Intermediate LibraryPhase(IEnumerable<Intermediate> intermediates, IEnumerable<Localization> localizations) 211 private Intermediate LibraryPhase(IEnumerable<Intermediate> intermediates, IEnumerable<Localization> localizations)
214 { 212 {
215 var librarian = new Librarian(this.ServiceProvider); 213 var context = this.ServiceProvider.GetService<ILibraryContext>();
216 librarian.BindFiles = this.BindFiles; 214 context.BindFiles = this.BindFiles;
217 librarian.BindPaths = this.BindPaths; 215 context.BindPaths = this.BindPaths;
218 librarian.Intermediates = intermediates; 216 context.Extensions = this.ExtensionManager.Create<ILibrarianExtension>();
219 librarian.Localizations = localizations; 217 context.Localizations = localizations;
220 return librarian.Execute(); 218 context.Intermediates = intermediates;
221 } 219
220 Intermediate library = null;
221 try
222 {
223 var librarian = this.ServiceProvider.GetService<ILibrarian>();
224 library = librarian.Combine(context);
225 }
226 catch (WixException e)
227 {
228 this.Messaging.Write(e.Error);
229 }
222 230
231 return library;
232 }
233
223 private Intermediate LinkPhase(IEnumerable<Intermediate> intermediates, ITupleDefinitionCreator creator) 234 private Intermediate LinkPhase(IEnumerable<Intermediate> intermediates, ITupleDefinitionCreator creator)
224 { 235 {
225 var libraries = this.LoadLibraries(creator); 236 var libraries = this.LoadLibraries(creator);
@@ -229,26 +240,39 @@ namespace WixToolset.Core.CommandLine
229 return null; 240 return null;
230 } 241 }
231 242
232 var linker = new Linker(this.ServiceProvider); 243 var context = this.ServiceProvider.GetService<ILinkContext>();
233 linker.OutputType = this.OutputType; 244 context.Extensions = this.ExtensionManager.Create<ILinkerExtension>();
234 linker.Intermediates = intermediates; 245 context.ExtensionData = this.ExtensionManager.Create<IExtensionData>();
235 linker.Libraries = libraries; 246 context.ExpectedOutputType = this.OutputType;
236 linker.TupleDefinitionCreator = creator; 247 context.Intermediates = intermediates.Concat(libraries).ToList();
237 return linker.Execute(); 248 context.TupleDefinitionCreator = creator;
249
250 var linker = this.ServiceProvider.GetService<ILinker>();
251 return linker.Link(context);
238 } 252 }
239 253
240 private void BindPhase(Intermediate output, IEnumerable<Localization> localizations) 254 private void BindPhase(Intermediate output, IEnumerable<Localization> localizations)
241 { 255 {
256 var intermediateFolder = this.IntermediateFolder;
257 if (String.IsNullOrEmpty(intermediateFolder))
258 {
259 intermediateFolder = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName());
260 }
261
242 ResolveResult resolveResult; 262 ResolveResult resolveResult;
243 { 263 {
244 var resolver = new Resolver(this.ServiceProvider); 264 var context = this.ServiceProvider.GetService<IResolveContext>();
245 resolver.BindPaths = this.BindPaths; 265 context.BindPaths = this.BindPaths;
246 resolver.FilterCultures = this.FilterCultures; 266 context.Extensions = this.ExtensionManager.Create<IResolverExtension>();
247 resolver.IntermediateFolder = this.IntermediateFolder; 267 context.ExtensionData = this.ExtensionManager.Create<IExtensionData>();
248 resolver.IntermediateRepresentation = output; 268 context.FilterCultures = this.FilterCultures;
249 resolver.Localizations = localizations; 269 context.IntermediateFolder = intermediateFolder;
250 270 context.IntermediateRepresentation = output;
251 resolveResult = resolver.Execute(); 271 context.Localizations = localizations;
272 context.VariableResolver = new WixVariableResolver(this.Messaging);
273
274 var resolver = this.ServiceProvider.GetService<IResolver>();
275 resolveResult = resolver.Resolve(context);
252 } 276 }
253 277
254 if (this.Messaging.EncounteredError) 278 if (this.Messaging.EncounteredError)
@@ -258,28 +282,24 @@ namespace WixToolset.Core.CommandLine
258 282
259 BindResult bindResult; 283 BindResult bindResult;
260 { 284 {
261 var intermediateFolder = this.IntermediateFolder; 285 var context = this.ServiceProvider.GetService<IBindContext>();
262 if (String.IsNullOrEmpty(intermediateFolder)) 286 //context.CabbingThreadCount = this.CabbingThreadCount;
263 { 287 context.CabCachePath = this.CabCachePath;
264 intermediateFolder = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); 288 context.Codepage = resolveResult.Codepage;
265 } 289 //context.DefaultCompressionLevel = this.DefaultCompressionLevel;
266 290 context.DelayedFields = resolveResult.DelayedFields;
267 var binder = new Binder(this.ServiceProvider); 291 context.ExpectedEmbeddedFiles = resolveResult.ExpectedEmbeddedFiles;
268 //binder.CabbingThreadCount = this.CabbingThreadCount; 292 context.Extensions = this.ExtensionManager.Create<IBinderExtension>();
269 binder.CabCachePath = this.CabCachePath; 293 context.Ices = Array.Empty<string>(); // TODO: set this correctly
270 binder.Codepage = resolveResult.Codepage; 294 context.IntermediateFolder = intermediateFolder;
271 //binder.DefaultCompressionLevel = this.DefaultCompressionLevel; 295 context.IntermediateRepresentation = resolveResult.IntermediateRepresentation;
272 binder.DelayedFields = resolveResult.DelayedFields; 296 context.OutputPath = this.OutputPath;
273 binder.ExpectedEmbeddedFiles = resolveResult.ExpectedEmbeddedFiles; 297 context.OutputPdbPath = Path.ChangeExtension(this.OutputPath, ".wixpdb");
274 binder.Ices = Array.Empty<string>(); // TODO: set this correctly 298 context.SuppressIces = Array.Empty<string>(); // TODO: set this correctly
275 binder.IntermediateFolder = intermediateFolder; 299 context.SuppressValidation = true; // TODO: set this correctly
276 binder.IntermediateRepresentation = resolveResult.IntermediateRepresentation; 300
277 binder.OutputPath = this.OutputPath; 301 var binder = this.ServiceProvider.GetService<IBinder>();
278 binder.OutputPdbPath = Path.ChangeExtension(this.OutputPath, ".wixpdb"); 302 bindResult = binder.Bind(context);
279 binder.SuppressIces = Array.Empty<string>(); // TODO: set this correctly
280 binder.SuppressValidation = true; // TODO: set this correctly
281
282 bindResult = binder.Execute();
283 } 303 }
284 304
285 if (this.Messaging.EncounteredError) 305 if (this.Messaging.EncounteredError)
@@ -288,16 +308,18 @@ namespace WixToolset.Core.CommandLine
288 } 308 }
289 309
290 { 310 {
291 var layout = new Layout(this.ServiceProvider); 311 var context = this.ServiceProvider.GetService<ILayoutContext>();
292 layout.TrackedFiles = bindResult.TrackedFiles; 312 context.Extensions = this.ExtensionManager.Create<ILayoutExtension>();
293 layout.FileTransfers = bindResult.FileTransfers; 313 context.TrackedFiles = bindResult.TrackedFiles;
294 layout.IntermediateFolder = this.IntermediateFolder; 314 context.FileTransfers = bindResult.FileTransfers;
295 layout.ContentsFile = this.ContentsFile; 315 context.IntermediateFolder = intermediateFolder;
296 layout.OutputsFile = this.OutputsFile; 316 context.ContentsFile = this.ContentsFile;
297 layout.BuiltOutputsFile = this.BuiltOutputsFile; 317 context.OutputsFile = this.OutputsFile;
298 layout.SuppressAclReset = false; // TODO: correctly set SuppressAclReset 318 context.BuiltOutputsFile = this.BuiltOutputsFile;
299 319 context.SuppressAclReset = false; // TODO: correctly set SuppressAclReset
300 layout.Execute(); 320
321 var layout = this.ServiceProvider.GetService<ILayoutCreator>();
322 layout.Layout(context);
301 } 323 }
302 } 324 }
303 325
@@ -335,12 +357,7 @@ namespace WixToolset.Core.CommandLine
335 357
336 foreach (var loc in this.LocFiles) 358 foreach (var loc in this.LocFiles)
337 { 359 {
338 var preprocessor = new Preprocessor(this.ServiceProvider); 360 var document = this.Preprocess(loc);
339 preprocessor.IncludeSearchPaths = this.IncludeSearchPaths;
340 preprocessor.Platform = Platform.X86; // TODO: set this correctly
341 preprocessor.SourcePath = loc;
342 preprocessor.Variables = this.PreprocessorVariables;
343 var document = preprocessor.Execute();
344 361
345 if (this.Messaging.EncounteredError) 362 if (this.Messaging.EncounteredError)
346 { 363 {
@@ -351,5 +368,28 @@ namespace WixToolset.Core.CommandLine
351 yield return localization; 368 yield return localization;
352 } 369 }
353 } 370 }
371
372 private XDocument Preprocess(string sourcePath)
373 {
374 var context = this.ServiceProvider.GetService<IPreprocessContext>();
375 context.Extensions = this.ExtensionManager.Create<IPreprocessorExtension>();
376 context.Platform = this.Platform;
377 context.IncludeSearchPaths = this.IncludeSearchPaths;
378 context.SourcePath = sourcePath;
379 context.Variables = this.PreprocessorVariables;
380
381 XDocument document = null;
382 try
383 {
384 var preprocessor = this.ServiceProvider.GetService<IPreprocessor>();
385 document = preprocessor.Preprocess(context);
386 }
387 catch (WixException e)
388 {
389 this.Messaging.Write(e.Error);
390 }
391
392 return document;
393 }
354 } 394 }
355} 395}