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.cs92
1 files changed, 50 insertions, 42 deletions
diff --git a/src/WixToolset.Core/CommandLine/BuildCommand.cs b/src/WixToolset.Core/CommandLine/BuildCommand.cs
index 4a1fc1ed..54bf688d 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.Rows; 10 using WixToolset.Data.Tuples;
11 using WixToolset.Extensibility; 11 using WixToolset.Extensibility;
12 using WixToolset.Extensibility.Services; 12 using WixToolset.Extensibility.Services;
13 13
@@ -79,21 +79,19 @@ namespace WixToolset.Core
79 return 1; 79 return 1;
80 } 80 }
81 81
82 var tableDefinitions = new TableDefinitionCollection(WindowsInstallerStandard.GetTableDefinitions());
83
84 if (this.OutputType == OutputType.Library) 82 if (this.OutputType == OutputType.Library)
85 { 83 {
86 var library = this.LibraryPhase(intermediates, tableDefinitions); 84 var library = this.LibraryPhase(intermediates);
87 85
88 library?.Save(this.OutputPath); 86 library?.Save(this.OutputPath);
89 } 87 }
90 else 88 else
91 { 89 {
92 var output = this.LinkPhase(intermediates, tableDefinitions); 90 var output = this.LinkPhase(intermediates);
93 91
94 if (!Messaging.Instance.EncounteredError) 92 if (!Messaging.Instance.EncounteredError)
95 { 93 {
96 this.BindPhase(output, tableDefinitions); 94 this.BindPhase(output);
97 } 95 }
98 } 96 }
99 97
@@ -104,15 +102,26 @@ namespace WixToolset.Core
104 { 102 {
105 var intermediates = new List<Intermediate>(); 103 var intermediates = new List<Intermediate>();
106 104
107 var preprocessor = new Preprocessor();
108
109 var compiler = new Compiler();
110 105
111 foreach (var sourceFile in this.SourceFiles) 106 foreach (var sourceFile in this.SourceFiles)
112 { 107 {
108 //var preprocessContext = this.ServiceProvider.GetService<IPreprocessContext>();
109 //preprocessContext.SourcePath = sourceFile.SourcePath;
110 //preprocessContext.Variables = this.PreprocessorVariables;
111
112 var preprocessor = new Preprocessor();
113 var document = preprocessor.Process(sourceFile.SourcePath, this.PreprocessorVariables); 113 var document = preprocessor.Process(sourceFile.SourcePath, this.PreprocessorVariables);
114 114
115 var intermediate = compiler.Compile(document); 115 var compileContext = this.ServiceProvider.GetService<ICompileContext>();
116 compileContext.Messaging = Messaging.Instance;
117 compileContext.CompilationId = Guid.NewGuid().ToString("N");
118 compileContext.Extensions = this.ExtensionManager.Create<ICompilerExtension>();
119 compileContext.OutputPath = sourceFile.OutputPath;
120 compileContext.Platform = Platform.X86; // TODO: set this correctly
121 compileContext.Source = document;
122
123 var compiler = new Compiler();
124 var intermediate = compiler.Compile(compileContext);
116 125
117 intermediates.Add(intermediate); 126 intermediates.Add(intermediate);
118 } 127 }
@@ -120,9 +129,9 @@ namespace WixToolset.Core
120 return intermediates; 129 return intermediates;
121 } 130 }
122 131
123 private Library LibraryPhase(IEnumerable<Intermediate> intermediates, TableDefinitionCollection tableDefinitions) 132 private Intermediate LibraryPhase(IEnumerable<Intermediate> intermediates)
124 { 133 {
125 var localizations = this.LoadLocalizationFiles(tableDefinitions).ToList(); 134 var localizations = this.LoadLocalizationFiles().ToList();
126 135
127 // If there was an error adding localization files, then bail. 136 // If there was an error adding localization files, then bail.
128 if (Messaging.Instance.EncounteredError) 137 if (Messaging.Instance.EncounteredError)
@@ -137,35 +146,34 @@ namespace WixToolset.Core
137 context.BindPaths = this.BindPaths; 146 context.BindPaths = this.BindPaths;
138 context.Extensions = this.ExtensionManager.Create<ILibrarianExtension>(); 147 context.Extensions = this.ExtensionManager.Create<ILibrarianExtension>();
139 context.Localizations = localizations; 148 context.Localizations = localizations;
140 context.Sections = intermediates.SelectMany(i => i.Sections).ToList(); 149 context.LibraryId = Guid.NewGuid().ToString("N");
150 context.Intermediates = intermediates;
141 context.WixVariableResolver = resolver; 151 context.WixVariableResolver = resolver;
142 152
143 var librarian = new Librarian(context); 153 var librarian = new Librarian();
144 154 return librarian.Combine(context);
145 return librarian.Combine();
146 } 155 }
147 156
148 private Output LinkPhase(IEnumerable<Intermediate> intermediates, TableDefinitionCollection tableDefinitions) 157 private Intermediate LinkPhase(IEnumerable<Intermediate> intermediates)
149 { 158 {
150 var sections = intermediates.SelectMany(i => i.Sections).ToList(); 159 var creator = this.ServiceProvider.GetService<ITupleDefinitionCreator>();
151
152 sections.AddRange(this.SectionsFromLibraries(tableDefinitions));
153 160
154 var linker = new Linker(); 161 var libraries = this.LoadLibraries(creator);
155
156 foreach (var data in this.ExtensionManager.Create<IExtensionData>())
157 {
158 linker.AddExtensionData(data);
159 }
160 162
161 var output = linker.Link(sections, this.OutputType); 163 var context = this.ServiceProvider.GetService<ILinkContext>();
164 context.Messaging = Messaging.Instance;
165 context.Extensions = this.ExtensionManager.Create<ILinkerExtension>();
166 context.Intermediates = intermediates.Union(libraries).ToList();
167 context.ExpectedOutputType = this.OutputType;
162 168
169 var linker = new Linker();
170 var output = linker.Link(context);
163 return output; 171 return output;
164 } 172 }
165 173
166 private void BindPhase(Output output, TableDefinitionCollection tableDefinitions) 174 private void BindPhase(Intermediate output)
167 { 175 {
168 var localizations = this.LoadLocalizationFiles(tableDefinitions).ToList(); 176 var localizations = this.LoadLocalizationFiles().ToList();
169 177
170 var localizer = new Localizer(localizations); 178 var localizer = new Localizer(localizations);
171 179
@@ -199,13 +207,13 @@ namespace WixToolset.Core
199 context.BuiltOutputsFile = this.BuiltOutputsFile; 207 context.BuiltOutputsFile = this.BuiltOutputsFile;
200 context.WixprojectFile = this.WixProjectFile; 208 context.WixprojectFile = this.WixProjectFile;
201 209
202 var binder = new Binder(context); 210 var binder = new Binder();
203 binder.Bind(); 211 binder.Bind(context);
204 } 212 }
205 213
206 private IEnumerable<Section> SectionsFromLibraries(TableDefinitionCollection tableDefinitions) 214 private IEnumerable<Intermediate> LoadLibraries(ITupleDefinitionCreator creator)
207 { 215 {
208 var sections = new List<Section>(); 216 var libraries = new List<Intermediate>();
209 217
210 if (this.LibraryFiles != null) 218 if (this.LibraryFiles != null)
211 { 219 {
@@ -213,9 +221,9 @@ namespace WixToolset.Core
213 { 221 {
214 try 222 try
215 { 223 {
216 var library = Library.Load(libraryFile, tableDefinitions, false); 224 var library = Intermediate.Load(libraryFile, creator);
217 225
218 sections.AddRange(library.Sections); 226 libraries.Add(library);
219 } 227 }
220 catch (WixCorruptFileException e) 228 catch (WixCorruptFileException e)
221 { 229 {
@@ -228,28 +236,28 @@ namespace WixToolset.Core
228 } 236 }
229 } 237 }
230 238
231 return sections; 239 return libraries;
232 } 240 }
233 241
234 private IEnumerable<Localization> LoadLocalizationFiles(TableDefinitionCollection tableDefinitions) 242 private IEnumerable<Localization> LoadLocalizationFiles()
235 { 243 {
236 foreach (var loc in this.LocFiles) 244 foreach (var loc in this.LocFiles)
237 { 245 {
238 var localization = Localizer.ParseLocalizationFile(loc, tableDefinitions); 246 var localization = Localizer.ParseLocalizationFile(loc);
239 247
240 yield return localization; 248 yield return localization;
241 } 249 }
242 } 250 }
243 251
244 private static WixVariableResolver CreateWixResolverWithVariables(Localizer localizer, Output output) 252 private static WixVariableResolver CreateWixResolverWithVariables(Localizer localizer, Intermediate output)
245 { 253 {
246 var resolver = new WixVariableResolver(localizer); 254 var resolver = new WixVariableResolver(localizer);
247 255
248 // Gather all the wix variables. 256 // Gather all the wix variables.
249 Table wixVariableTable = output?.Tables["WixVariable"]; 257 var wixVariables = output?.Sections.SelectMany(s => s.Tuples).OfType<WixVariableTuple>();
250 if (null != wixVariableTable) 258 if (wixVariables != null)
251 { 259 {
252 foreach (WixVariableRow wixVariableRow in wixVariableTable.Rows) 260 foreach (var wixVariableRow in wixVariables)
253 { 261 {
254 resolver.AddVariable(wixVariableRow); 262 resolver.AddVariable(wixVariableRow);
255 } 263 }