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 +++++++++++------------- src/WixToolset.Core/CommandLine/CommandLine.cs | 22 +++- 2 files changed, 88 insertions(+), 76 deletions(-) (limited to 'src/WixToolset.Core/CommandLine') 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; } } } diff --git a/src/WixToolset.Core/CommandLine/CommandLine.cs b/src/WixToolset.Core/CommandLine/CommandLine.cs index a3a6831c..2f203ecb 100644 --- a/src/WixToolset.Core/CommandLine/CommandLine.cs +++ b/src/WixToolset.Core/CommandLine/CommandLine.cs @@ -6,6 +6,7 @@ namespace WixToolset.Core using System.Collections.Generic; using System.IO; using System.Linq; + using System.Reflection; using System.Text; using System.Text.RegularExpressions; using WixToolset.Data; @@ -71,6 +72,7 @@ namespace WixToolset.Core var intermediateFolder = String.Empty; + var cabCachePath = String.Empty; var cultures = new List(); var contentsFile = String.Empty; var outputsFile = String.Empty; @@ -98,6 +100,10 @@ namespace WixToolset.Core cmdline.GetNextArgumentOrError(bindPaths); return true; + case "cc": + cmdline.GetNextArgumentOrError(ref cabCachePath); + return true; + case "cultures": cmdline.GetNextArgumentOrError(cultures); return true; @@ -190,12 +196,14 @@ namespace WixToolset.Core { case Commands.Build: { + LoadStandardBackends(cli.ExtensionManager); + var sourceFiles = GatherSourceFiles(files, outputFolder); var variables = GatherPreprocessorVariables(defines); var bindPathList = GatherBindPaths(bindPaths); var extensions = cli.ExtensionManager; var type = CalculateOutputType(outputType, outputFile); - return new BuildCommand(extensions, sourceFiles, variables, locFiles, libraryFiles, outputFile, type, cultures, bindFiles, bindPathList, intermediateFolder, contentsFile, outputsFile, builtOutputsFile, wixProjectFile); + return new BuildCommand(extensions, sourceFiles, variables, locFiles, libraryFiles, outputFile, type, cabCachePath, cultures, bindFiles, bindPathList, intermediateFolder, contentsFile, outputsFile, builtOutputsFile, wixProjectFile); } case Commands.Compile: @@ -209,6 +217,18 @@ namespace WixToolset.Core return null; } + private static void LoadStandardBackends(ExtensionManager extensionManager) + { + var folder = Path.GetDirectoryName(new Uri(Assembly.GetExecutingAssembly().CodeBase).LocalPath); + + foreach (var backendAssemblyName in new[] { "WixToolset.Core.Burn.dll", "WixToolset.Core.WindowsInstaller.dll" }) + { + var path = Path.Combine(folder, backendAssemblyName); + + extensionManager.Load(path); + } + } + private static OutputType CalculateOutputType(string outputType, string outputFile) { if (String.IsNullOrEmpty(outputType)) -- cgit v1.2.3-55-g6feb