From dbde9e7104b907bbbaea17e21247d8cafc8b3a4c Mon Sep 17 00:00:00 2001 From: Rob Mensching Date: Sat, 14 Oct 2017 16:12:07 -0700 Subject: Massive refactoring to introduce the concept of IBackend --- src/WixToolset.Core/CommandLine/BuildCommand.cs | 142 +++++++++++------------- 1 file changed, 67 insertions(+), 75 deletions(-) (limited to 'src/WixToolset.Core/CommandLine/BuildCommand.cs') diff --git a/src/WixToolset.Core/CommandLine/BuildCommand.cs b/src/WixToolset.Core/CommandLine/BuildCommand.cs index afb9e829..32da5bcf 100644 --- a/src/WixToolset.Core/CommandLine/BuildCommand.cs +++ b/src/WixToolset.Core/CommandLine/BuildCommand.cs @@ -7,13 +7,14 @@ namespace WixToolset.Core using System.IO; using System.Linq; using WixToolset.Data; + using WixToolset.Data.Rows; using WixToolset.Extensibility; internal class BuildCommand : ICommandLineCommand { - public BuildCommand(ExtensionManager extensions, IEnumerable sources, IDictionary preprocessorVariables, IEnumerable locFiles, IEnumerable libraryFiles, string outputPath, OutputType outputType, IEnumerable cultures, bool bindFiles, IEnumerable bindPaths, string intermediateFolder, string contentsFile, string outputsFile, string builtOutputsFile, string wixProjectFile) + public BuildCommand(ExtensionManager extensions, IEnumerable sources, IDictionary preprocessorVariables, IEnumerable locFiles, IEnumerable libraryFiles, string outputPath, OutputType outputType, string cabCachePath, IEnumerable cultures, bool bindFiles, IEnumerable bindPaths, string intermediateFolder, string contentsFile, string outputsFile, string builtOutputsFile, string wixProjectFile) { - this.Extensions = extensions; + this.ExtensionManager = extensions; this.LocFiles = locFiles; this.LibraryFiles = libraryFiles; this.PreprocessorVariables = preprocessorVariables; @@ -21,6 +22,7 @@ namespace WixToolset.Core this.OutputPath = outputPath; this.OutputType = outputType; + this.CabCachePath = cabCachePath; this.Cultures = cultures; this.BindFiles = bindFiles; this.BindPaths = bindPaths; @@ -32,7 +34,7 @@ namespace WixToolset.Core this.WixProjectFile = wixProjectFile; } - public ExtensionManager Extensions { get; } + public ExtensionManager ExtensionManager { get; } public IEnumerable LocFiles { get; } @@ -46,6 +48,8 @@ namespace WixToolset.Core private OutputType OutputType { get; } + public string CabCachePath { get; } + public IEnumerable Cultures { get; } public bool BindFiles { get; } @@ -70,7 +74,9 @@ namespace WixToolset.Core if (this.OutputType == OutputType.Library) { - this.LibraryPhase(intermediates, tableDefinitions); + var library = this.LibraryPhase(intermediates, tableDefinitions); + + library?.Save(this.OutputPath); } else { @@ -105,51 +111,40 @@ namespace WixToolset.Core return intermediates; } - private void LibraryPhase(IEnumerable intermediates, TableDefinitionCollection tableDefinitions) + private Library LibraryPhase(IEnumerable intermediates, TableDefinitionCollection tableDefinitions) { var localizations = this.LoadLocalizationFiles(tableDefinitions).ToList(); // If there was an error adding localization files, then bail. if (Messaging.Instance.EncounteredError) { - return; + return null; } - var sections = intermediates.SelectMany(i => i.Sections).ToList(); - - LibraryBinaryFileResolver resolver = null; - - if (this.BindFiles) - { - resolver = new LibraryBinaryFileResolver(); - resolver.FileManagers = new List { new BinderFileManager() }; ; - resolver.VariableResolver = new WixVariableResolver(); - - BinderFileManagerCore core = new BinderFileManagerCore(); - core.AddBindPaths(this.BindPaths, BindStage.Normal); - - foreach (var fileManager in resolver.FileManagers) - { - fileManager.Core = core; - } - } + var resolver = CreateWixResolverWithVariables(null, null); - var librarian = new Librarian(); + var context = new LibraryContext(); + context.BindFiles = this.BindFiles; + context.BindPaths = this.BindPaths; + context.Extensions = this.ExtensionManager.Create(); + context.Localizations = localizations; + context.Sections = intermediates.SelectMany(i => i.Sections).ToList(); + context.WixVariableResolver = resolver; - var library = librarian.Combine(sections, localizations, resolver); + var librarian = new Librarian(context); - library?.Save(this.OutputPath); + return librarian.Combine(); } private Output LinkPhase(IEnumerable intermediates, TableDefinitionCollection tableDefinitions) { var sections = intermediates.SelectMany(i => i.Sections).ToList(); - sections.AddRange(SectionsFromLibraries(tableDefinitions)); + sections.AddRange(this.SectionsFromLibraries(tableDefinitions)); var linker = new Linker(); - foreach (var data in this.Extensions.Create()) + foreach (var data in this.ExtensionManager.Create()) { linker.AddExtensionData(data); } @@ -159,6 +154,40 @@ namespace WixToolset.Core return output; } + private void BindPhase(Output output, TableDefinitionCollection tableDefinitions) + { + var localizations = this.LoadLocalizationFiles(tableDefinitions).ToList(); + + var localizer = new Localizer(localizations); + + var resolver = CreateWixResolverWithVariables(localizer, output); + + var context = new BindContext(); + context.Messaging = Messaging.Instance; + context.ExtensionManager = this.ExtensionManager; + context.BindPaths = this.BindPaths ?? Array.Empty(); + //context.CabbingThreadCount = this.CabbingThreadCount; + context.CabCachePath = this.CabCachePath; + context.Codepage = localizer.Codepage; + //context.DefaultCompressionLevel = this.DefaultCompressionLevel; + //context.Ices = this.Ices; + context.IntermediateFolder = this.IntermediateFolder; + context.IntermediateRepresentation = output; + context.OutputPath = this.OutputPath; + context.OutputPdbPath = Path.ChangeExtension(this.OutputPath, ".wixpdb"); + //context.SuppressIces = this.SuppressIces; + context.SuppressValidation = true; + //context.SuppressValidation = this.SuppressValidation; + context.WixVariableResolver = resolver; + context.ContentsFile = this.ContentsFile; + context.OutputsFile = this.OutputsFile; + context.BuiltOutputsFile = this.BuiltOutputsFile; + context.WixprojectFile = this.WixProjectFile; + + var binder = new Binder(context); + binder.Bind(); + } + private IEnumerable
SectionsFromLibraries(TableDefinitionCollection tableDefinitions) { var sections = new List
(); @@ -187,34 +216,6 @@ namespace WixToolset.Core return sections; } - private void BindPhase(Output output, TableDefinitionCollection tableDefinitions) - { - var localizations = this.LoadLocalizationFiles(tableDefinitions).ToList(); - - var localizer = new Localizer(localizations); - - var resolver = new WixVariableResolver(localizer); - - var binder = new Binder(); - binder.TempFilesLocation = this.IntermediateFolder; - binder.WixVariableResolver = resolver; - binder.SuppressValidation = true; - - binder.ContentsFile = this.ContentsFile; - binder.OutputsFile = this.OutputsFile; - binder.BuiltOutputsFile = this.BuiltOutputsFile; - binder.WixprojectFile = this.WixProjectFile; - - if (this.BindPaths != null) - { - binder.BindPaths.AddRange(this.BindPaths); - } - - binder.AddExtension(new BinderFileManager()); - - binder.Bind(output, this.OutputPath); - } - private IEnumerable LoadLocalizationFiles(TableDefinitionCollection tableDefinitions) { foreach (var loc in this.LocFiles) @@ -225,30 +226,21 @@ namespace WixToolset.Core } } - /// - /// File resolution mechanism to create binary library. - /// - private class LibraryBinaryFileResolver : ILibraryBinaryFileResolver + private static WixVariableResolver CreateWixResolverWithVariables(Localizer localizer, Output output) { - public IEnumerable FileManagers { get; set; } - - public WixVariableResolver VariableResolver { get; set; } + var resolver = new WixVariableResolver(localizer); - public string Resolve(SourceLineNumber sourceLineNumber, string table, string path) + // Gather all the wix variables. + Table wixVariableTable = output?.Tables["WixVariable"]; + if (null != wixVariableTable) { - string resolvedPath = this.VariableResolver.ResolveVariables(sourceLineNumber, path, false); - - foreach (IBinderFileManager fileManager in this.FileManagers) + foreach (WixVariableRow wixVariableRow in wixVariableTable.Rows) { - string finalPath = fileManager.ResolveFile(resolvedPath, table, sourceLineNumber, BindStage.Normal); - if (!String.IsNullOrEmpty(finalPath)) - { - return finalPath; - } + resolver.AddVariable(wixVariableRow); } - - return null; } + + return resolver; } } } -- cgit v1.2.3-55-g6feb