diff options
Diffstat (limited to 'src/WixToolset.Core/CommandLine/BuildCommand.cs')
-rw-r--r-- | src/WixToolset.Core/CommandLine/BuildCommand.cs | 275 |
1 files changed, 144 insertions, 131 deletions
diff --git a/src/WixToolset.Core/CommandLine/BuildCommand.cs b/src/WixToolset.Core/CommandLine/BuildCommand.cs index fbc88f08..b83aaec4 100644 --- a/src/WixToolset.Core/CommandLine/BuildCommand.cs +++ b/src/WixToolset.Core/CommandLine/BuildCommand.cs | |||
@@ -21,7 +21,7 @@ namespace WixToolset.Core.CommandLine | |||
21 | this.ServiceProvider = serviceProvider; | 21 | this.ServiceProvider = serviceProvider; |
22 | this.Messaging = serviceProvider.GetService<IMessaging>(); | 22 | this.Messaging = serviceProvider.GetService<IMessaging>(); |
23 | this.ExtensionManager = serviceProvider.GetService<IExtensionManager>(); | 23 | this.ExtensionManager = serviceProvider.GetService<IExtensionManager>(); |
24 | this.commandLine = new CommandLine(this.Messaging); | 24 | this.commandLine = new CommandLine(this.ServiceProvider, this.Messaging); |
25 | } | 25 | } |
26 | 26 | ||
27 | public bool ShowLogo => this.commandLine.ShowLogo; | 27 | public bool ShowLogo => this.commandLine.ShowLogo; |
@@ -214,7 +214,7 @@ namespace WixToolset.Core.CommandLine | |||
214 | return intermediates; | 214 | return intermediates; |
215 | } | 215 | } |
216 | 216 | ||
217 | private Intermediate LibraryPhase(IEnumerable<Intermediate> intermediates, IEnumerable<Localization> localizations, bool bindFiles, IEnumerable<BindPath> bindPaths) | 217 | private Intermediate LibraryPhase(IEnumerable<Intermediate> intermediates, IEnumerable<Localization> localizations, bool bindFiles, IEnumerable<IBindPath> bindPaths) |
218 | { | 218 | { |
219 | var context = this.ServiceProvider.GetService<ILibraryContext>(); | 219 | var context = this.ServiceProvider.GetService<ILibraryContext>(); |
220 | context.BindFiles = bindFiles; | 220 | context.BindFiles = bindFiles; |
@@ -257,7 +257,7 @@ namespace WixToolset.Core.CommandLine | |||
257 | return linker.Link(context); | 257 | return linker.Link(context); |
258 | } | 258 | } |
259 | 259 | ||
260 | private void BindPhase(Intermediate output, IEnumerable<Localization> localizations, IEnumerable<string> filterCultures, string cabCachePath, IEnumerable<BindPath> bindPaths) | 260 | private void BindPhase(Intermediate output, IEnumerable<Localization> localizations, IEnumerable<string> filterCultures, string cabCachePath, IEnumerable<IBindPath> bindPaths) |
261 | { | 261 | { |
262 | var intermediateFolder = this.IntermediateFolder; | 262 | var intermediateFolder = this.IntermediateFolder; |
263 | if (String.IsNullOrEmpty(intermediateFolder)) | 263 | if (String.IsNullOrEmpty(intermediateFolder)) |
@@ -265,7 +265,7 @@ namespace WixToolset.Core.CommandLine | |||
265 | intermediateFolder = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); | 265 | intermediateFolder = Path.Combine(Path.GetTempPath(), Path.GetRandomFileName()); |
266 | } | 266 | } |
267 | 267 | ||
268 | ResolveResult resolveResult; | 268 | IResolveResult resolveResult; |
269 | { | 269 | { |
270 | var context = this.ServiceProvider.GetService<IResolveContext>(); | 270 | var context = this.ServiceProvider.GetService<IResolveContext>(); |
271 | context.BindPaths = bindPaths; | 271 | context.BindPaths = bindPaths; |
@@ -286,7 +286,7 @@ namespace WixToolset.Core.CommandLine | |||
286 | return; | 286 | return; |
287 | } | 287 | } |
288 | 288 | ||
289 | BindResult bindResult; | 289 | IBindResult bindResult; |
290 | { | 290 | { |
291 | var context = this.ServiceProvider.GetService<IBindContext>(); | 291 | var context = this.ServiceProvider.GetService<IBindContext>(); |
292 | //context.CabbingThreadCount = this.CabbingThreadCount; | 292 | //context.CabbingThreadCount = this.CabbingThreadCount; |
@@ -397,7 +397,7 @@ namespace WixToolset.Core.CommandLine | |||
397 | 397 | ||
398 | public bool BindFiles { get; private set; } | 398 | public bool BindFiles { get; private set; } |
399 | 399 | ||
400 | public List<BindPath> BindPaths { get; } = new List<BindPath>(); | 400 | public List<IBindPath> BindPaths { get; } = new List<IBindPath>(); |
401 | 401 | ||
402 | public string CabCachePath { get; private set; } | 402 | public string CabCachePath { get; private set; } |
403 | 403 | ||
@@ -431,11 +431,14 @@ namespace WixToolset.Core.CommandLine | |||
431 | 431 | ||
432 | public string BuiltOutputsFile { get; private set; } | 432 | public string BuiltOutputsFile { get; private set; } |
433 | 433 | ||
434 | public CommandLine(IMessaging messaging) | 434 | public CommandLine(IServiceProvider serviceProvider, IMessaging messaging) |
435 | { | 435 | { |
436 | this.ServiceProvider = serviceProvider; | ||
436 | this.Messaging = messaging; | 437 | this.Messaging = messaging; |
437 | } | 438 | } |
438 | 439 | ||
440 | private IServiceProvider ServiceProvider { get; } | ||
441 | |||
439 | private IMessaging Messaging { get; } | 442 | private IMessaging Messaging { get; } |
440 | 443 | ||
441 | public bool TryParseArgument(string arg, ICommandLineParser parser) | 444 | public bool TryParseArgument(string arg, ICommandLineParser parser) |
@@ -445,109 +448,109 @@ namespace WixToolset.Core.CommandLine | |||
445 | var parameter = arg.Substring(1); | 448 | var parameter = arg.Substring(1); |
446 | switch (parameter.ToLowerInvariant()) | 449 | switch (parameter.ToLowerInvariant()) |
447 | { | 450 | { |
448 | case "?": | 451 | case "?": |
449 | case "h": | 452 | case "h": |
450 | case "help": | 453 | case "help": |
451 | this.ShowHelp = true; | 454 | this.ShowHelp = true; |
452 | return true; | ||
453 | |||
454 | case "arch": | ||
455 | case "platform": | ||
456 | { | ||
457 | var value = parser.GetNextArgumentOrError(arg); | ||
458 | if (Enum.TryParse(value, true, out Platform platform)) | ||
459 | { | ||
460 | this.Platform = platform; | ||
461 | return true; | 455 | return true; |
462 | } | ||
463 | break; | ||
464 | } | ||
465 | |||
466 | case "bindfiles": | ||
467 | this.BindFiles = true; | ||
468 | return true; | ||
469 | 456 | ||
470 | case "bindpath": | 457 | case "arch": |
471 | { | 458 | case "platform": |
472 | var value = parser.GetNextArgumentOrError(arg); | ||
473 | if (this.TryParseBindPath(value, out var bindPath)) | ||
474 | { | 459 | { |
475 | this.BindPaths.Add(bindPath); | 460 | var value = parser.GetNextArgumentOrError(arg); |
476 | return true; | 461 | if (Enum.TryParse(value, true, out Platform platform)) |
462 | { | ||
463 | this.Platform = platform; | ||
464 | return true; | ||
465 | } | ||
466 | break; | ||
477 | } | 467 | } |
478 | break; | 468 | |
479 | } | 469 | case "bindfiles": |
480 | case "cc": | 470 | this.BindFiles = true; |
481 | this.CabCachePath = parser.GetNextArgumentOrError(arg); | 471 | return true; |
482 | return true; | 472 | |
483 | 473 | case "bindpath": | |
484 | case "culture": | ||
485 | parser.GetNextArgumentOrError(arg, this.Cultures); | ||
486 | return true; | ||
487 | |||
488 | case "contentsfile": | ||
489 | this.ContentsFile = parser.GetNextArgumentAsFilePathOrError(arg); | ||
490 | return true; | ||
491 | case "outputsfile": | ||
492 | this.OutputsFile = parser.GetNextArgumentAsFilePathOrError(arg); | ||
493 | return true; | ||
494 | case "builtoutputsfile": | ||
495 | this.BuiltOutputsFile = parser.GetNextArgumentAsFilePathOrError(arg); | ||
496 | return true; | ||
497 | |||
498 | case "d": | ||
499 | case "define": | ||
500 | parser.GetNextArgumentOrError(arg, this.Defines); | ||
501 | return true; | ||
502 | |||
503 | case "i": | ||
504 | case "includepath": | ||
505 | parser.GetNextArgumentOrError(arg, this.IncludeSearchPaths); | ||
506 | return true; | ||
507 | |||
508 | case "intermediatefolder": | ||
509 | this.IntermediateFolder = parser.GetNextArgumentAsDirectoryOrError(arg); | ||
510 | return true; | ||
511 | |||
512 | case "loc": | ||
513 | parser.GetNextArgumentAsFilePathOrError(arg, "localization files", this.LocalizationFilePaths); | ||
514 | return true; | ||
515 | |||
516 | case "lib": | ||
517 | parser.GetNextArgumentAsFilePathOrError(arg, "library files", this.LibraryFilePaths); | ||
518 | return true; | ||
519 | |||
520 | case "o": | ||
521 | case "out": | ||
522 | this.OutputFile = parser.GetNextArgumentAsFilePathOrError(arg); | ||
523 | return true; | ||
524 | |||
525 | case "outputtype": | ||
526 | this.OutputType = parser.GetNextArgumentOrError(arg); | ||
527 | return true; | ||
528 | |||
529 | case "nologo": | ||
530 | this.ShowLogo = false; | ||
531 | return true; | ||
532 | |||
533 | case "v": | ||
534 | case "verbose": | ||
535 | this.Messaging.ShowVerboseMessages = true; | ||
536 | return true; | ||
537 | |||
538 | case "sval": | ||
539 | // todo: implement | ||
540 | return true; | ||
541 | |||
542 | case "sw": | ||
543 | case "suppresswarning": | ||
544 | var warning = parser.GetNextArgumentOrError(arg); | ||
545 | if (!String.IsNullOrEmpty(warning)) | ||
546 | { | 474 | { |
547 | var warningNumber = Convert.ToInt32(warning); | 475 | var value = parser.GetNextArgumentOrError(arg); |
548 | this.Messaging.SuppressWarningMessage(warningNumber); | 476 | if (this.TryParseBindPath(value, out var bindPath)) |
477 | { | ||
478 | this.BindPaths.Add(bindPath); | ||
479 | return true; | ||
480 | } | ||
481 | break; | ||
549 | } | 482 | } |
550 | return true; | 483 | case "cc": |
484 | this.CabCachePath = parser.GetNextArgumentOrError(arg); | ||
485 | return true; | ||
486 | |||
487 | case "culture": | ||
488 | parser.GetNextArgumentOrError(arg, this.Cultures); | ||
489 | return true; | ||
490 | |||
491 | case "contentsfile": | ||
492 | this.ContentsFile = parser.GetNextArgumentAsFilePathOrError(arg); | ||
493 | return true; | ||
494 | case "outputsfile": | ||
495 | this.OutputsFile = parser.GetNextArgumentAsFilePathOrError(arg); | ||
496 | return true; | ||
497 | case "builtoutputsfile": | ||
498 | this.BuiltOutputsFile = parser.GetNextArgumentAsFilePathOrError(arg); | ||
499 | return true; | ||
500 | |||
501 | case "d": | ||
502 | case "define": | ||
503 | parser.GetNextArgumentOrError(arg, this.Defines); | ||
504 | return true; | ||
505 | |||
506 | case "i": | ||
507 | case "includepath": | ||
508 | parser.GetNextArgumentOrError(arg, this.IncludeSearchPaths); | ||
509 | return true; | ||
510 | |||
511 | case "intermediatefolder": | ||
512 | this.IntermediateFolder = parser.GetNextArgumentAsDirectoryOrError(arg); | ||
513 | return true; | ||
514 | |||
515 | case "loc": | ||
516 | parser.GetNextArgumentAsFilePathOrError(arg, "localization files", this.LocalizationFilePaths); | ||
517 | return true; | ||
518 | |||
519 | case "lib": | ||
520 | parser.GetNextArgumentAsFilePathOrError(arg, "library files", this.LibraryFilePaths); | ||
521 | return true; | ||
522 | |||
523 | case "o": | ||
524 | case "out": | ||
525 | this.OutputFile = parser.GetNextArgumentAsFilePathOrError(arg); | ||
526 | return true; | ||
527 | |||
528 | case "outputtype": | ||
529 | this.OutputType = parser.GetNextArgumentOrError(arg); | ||
530 | return true; | ||
531 | |||
532 | case "nologo": | ||
533 | this.ShowLogo = false; | ||
534 | return true; | ||
535 | |||
536 | case "v": | ||
537 | case "verbose": | ||
538 | this.Messaging.ShowVerboseMessages = true; | ||
539 | return true; | ||
540 | |||
541 | case "sval": | ||
542 | // todo: implement | ||
543 | return true; | ||
544 | |||
545 | case "sw": | ||
546 | case "suppresswarning": | ||
547 | var warning = parser.GetNextArgumentOrError(arg); | ||
548 | if (!String.IsNullOrEmpty(warning)) | ||
549 | { | ||
550 | var warningNumber = Convert.ToInt32(warning); | ||
551 | this.Messaging.SuppressWarningMessage(warningNumber); | ||
552 | } | ||
553 | return true; | ||
551 | } | 554 | } |
552 | 555 | ||
553 | return false; | 556 | return false; |
@@ -573,37 +576,37 @@ namespace WixToolset.Core.CommandLine | |||
573 | 576 | ||
574 | switch (this.OutputType.ToLowerInvariant()) | 577 | switch (this.OutputType.ToLowerInvariant()) |
575 | { | 578 | { |
576 | case "bundle": | 579 | case "bundle": |
577 | case ".exe": | 580 | case ".exe": |
578 | return Data.OutputType.Bundle; | 581 | return Data.OutputType.Bundle; |
579 | 582 | ||
580 | case "library": | 583 | case "library": |
581 | case ".wixlib": | 584 | case ".wixlib": |
582 | return Data.OutputType.Library; | 585 | return Data.OutputType.Library; |
583 | 586 | ||
584 | case "module": | 587 | case "module": |
585 | case ".msm": | 588 | case ".msm": |
586 | return Data.OutputType.Module; | 589 | return Data.OutputType.Module; |
587 | 590 | ||
588 | case "patch": | 591 | case "patch": |
589 | case ".msp": | 592 | case ".msp": |
590 | return Data.OutputType.Patch; | 593 | return Data.OutputType.Patch; |
591 | 594 | ||
592 | case ".pcp": | 595 | case ".pcp": |
593 | return Data.OutputType.PatchCreation; | 596 | return Data.OutputType.PatchCreation; |
594 | 597 | ||
595 | case "product": | 598 | case "product": |
596 | case "package": | 599 | case "package": |
597 | case ".msi": | 600 | case ".msi": |
598 | return Data.OutputType.Product; | 601 | return Data.OutputType.Product; |
599 | 602 | ||
600 | case "transform": | 603 | case "transform": |
601 | case ".mst": | 604 | case ".mst": |
602 | return Data.OutputType.Transform; | 605 | return Data.OutputType.Transform; |
603 | 606 | ||
604 | case "intermediatepostlink": | 607 | case "intermediatepostlink": |
605 | case ".wixipl": | 608 | case ".wixipl": |
606 | return Data.OutputType.IntermediatePostLink; | 609 | return Data.OutputType.IntermediatePostLink; |
607 | } | 610 | } |
608 | 611 | ||
609 | return Data.OutputType.Unknown; | 612 | return Data.OutputType.Unknown; |
@@ -656,7 +659,6 @@ namespace WixToolset.Core.CommandLine | |||
656 | return variables; | 659 | return variables; |
657 | } | 660 | } |
658 | 661 | ||
659 | |||
660 | public IEnumerable<SourceFile> GatherSourceFiles(string intermediateDirectory) | 662 | public IEnumerable<SourceFile> GatherSourceFiles(string intermediateDirectory) |
661 | { | 663 | { |
662 | var files = new List<SourceFile>(); | 664 | var files = new List<SourceFile>(); |
@@ -672,10 +674,21 @@ namespace WixToolset.Core.CommandLine | |||
672 | return files; | 674 | return files; |
673 | } | 675 | } |
674 | 676 | ||
675 | private bool TryParseBindPath(string bindPath, out BindPath bp) | 677 | private bool TryParseBindPath(string bindPath, out IBindPath bp) |
676 | { | 678 | { |
677 | var namedPath = bindPath.Split(BindPathSplit, 2); | 679 | var namedPath = bindPath.Split(BindPathSplit, 2); |
678 | bp = (1 == namedPath.Length) ? new BindPath(namedPath[0]) : new BindPath(namedPath[0], namedPath[1]); | 680 | |
681 | bp = this.ServiceProvider.GetService<IBindPath>(); | ||
682 | |||
683 | if (1 == namedPath.Length) | ||
684 | { | ||
685 | bp.Path = namedPath[0]; | ||
686 | } | ||
687 | else | ||
688 | { | ||
689 | bp.Name = namedPath[0]; | ||
690 | bp.Path = namedPath[1]; | ||
691 | } | ||
679 | 692 | ||
680 | if (File.Exists(bp.Path)) | 693 | if (File.Exists(bp.Path)) |
681 | { | 694 | { |