OLD | NEW |
1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2014, the Dart project authors. Please see the AUTHORS file |
2 // for details. All rights reserved. Use of this source code is governed by a | 2 // for details. All rights reserved. Use of this source code is governed by a |
3 // BSD-style license that can be found in the LICENSE file. | 3 // BSD-style license that can be found in the LICENSE file. |
4 | 4 |
5 library compiler_configuration; | 5 library compiler_configuration; |
6 | 6 |
7 import 'dart:io' show Platform; | 7 import 'dart:io' show Platform; |
8 | 8 |
9 import 'runtime_configuration.dart' show RuntimeConfiguration; | 9 import 'runtime_configuration.dart' show RuntimeConfiguration; |
10 | 10 |
(...skipping 71 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
82 case 'dart2app': | 82 case 'dart2app': |
83 return new Dart2AppSnapshotCompilerConfiguration( | 83 return new Dart2AppSnapshotCompilerConfiguration( |
84 isDebug: isDebug, isChecked: isChecked, useBlobs: useBlobs); | 84 isDebug: isDebug, isChecked: isChecked, useBlobs: useBlobs); |
85 case 'precompiler': | 85 case 'precompiler': |
86 return new PrecompilerCompilerConfiguration( | 86 return new PrecompilerCompilerConfiguration( |
87 isDebug: isDebug, | 87 isDebug: isDebug, |
88 isChecked: isChecked, | 88 isChecked: isChecked, |
89 arch: configuration['arch'], | 89 arch: configuration['arch'], |
90 useBlobs: useBlobs, | 90 useBlobs: useBlobs, |
91 isAndroid: configuration['system'] == 'android'); | 91 isAndroid: configuration['system'] == 'android'); |
| 92 case 'dartk': |
| 93 return ComposedCompilerConfiguration.createDartKConfiguration( |
| 94 isHostChecked: isHostChecked, |
| 95 kernel_transformers: configuration['kernel_transformers'], |
| 96 useSdk: useSdk); |
| 97 case 'dartkp': |
| 98 return ComposedCompilerConfiguration.createDartKPConfiguration( |
| 99 isHostChecked: isHostChecked, |
| 100 arch: configuration['arch'], |
| 101 useBlobs: useBlobs, |
| 102 isAndroid: configuration['system'] == 'android', |
| 103 kernel_transformers: configuration['kernel_transformers'], |
| 104 useSdk: useSdk); |
92 case 'none': | 105 case 'none': |
93 return new NoneCompilerConfiguration( | 106 return new NoneCompilerConfiguration( |
94 isDebug: isDebug, | 107 isDebug: isDebug, |
95 isChecked: isChecked, | 108 isChecked: isChecked, |
96 isHostChecked: isHostChecked, | 109 isHostChecked: isHostChecked, |
97 useSdk: useSdk, | 110 useSdk: useSdk, |
98 hotReload: hotReload, | 111 hotReload: hotReload, |
99 hotReloadRollback: hotReloadRollback); | 112 hotReloadRollback: hotReloadRollback); |
100 default: | 113 default: |
101 throw "Unknown compiler '$compiler'"; | 114 throw "Unknown compiler '$compiler'"; |
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
192 } else if (hotReloadRollback) { | 205 } else if (hotReloadRollback) { |
193 args.add('--hot-reload-rollback-test-mode'); | 206 args.add('--hot-reload-rollback-test-mode'); |
194 } | 207 } |
195 return args | 208 return args |
196 ..addAll(vmOptions) | 209 ..addAll(vmOptions) |
197 ..addAll(sharedOptions) | 210 ..addAll(sharedOptions) |
198 ..addAll(originalArguments); | 211 ..addAll(originalArguments); |
199 } | 212 } |
200 } | 213 } |
201 | 214 |
| 215 /// The "dartk" compiler. |
| 216 class DartKCompilerConfiguration extends CompilerConfiguration { |
| 217 DartKCompilerConfiguration({bool isHostChecked, bool useSdk}) |
| 218 : super._subclass(isHostChecked: isHostChecked, useSdk: useSdk); |
| 219 |
| 220 @override |
| 221 String computeCompilerPath(String buildDir) { |
| 222 return 'third_party/pkg/kernel/bin/dartk.dart'; |
| 223 } |
| 224 |
| 225 CompilationCommand computeCompilationCommand( |
| 226 String outputFileName, |
| 227 String buildDir, |
| 228 CommandBuilder commandBuilder, |
| 229 List arguments, |
| 230 Map<String, String> environmentOverrides) { |
| 231 var extraArguments = [ |
| 232 '--sdk', |
| 233 '$buildDir/obj/gen/patched_sdk', |
| 234 '--link', |
| 235 '--target=vm', |
| 236 '--out', |
| 237 outputFileName |
| 238 ]; |
| 239 return commandBuilder.getKernelCompilationCommand( |
| 240 'dartk', |
| 241 outputFileName, |
| 242 true, |
| 243 bootstrapDependencies(buildDir), |
| 244 computeCompilerPath(buildDir), |
| 245 []..addAll(arguments)..addAll(extraArguments), |
| 246 environmentOverrides); |
| 247 } |
| 248 |
| 249 CommandArtifact computeCompilationArtifact( |
| 250 String buildDir, |
| 251 String tempDir, |
| 252 CommandBuilder commandBuilder, |
| 253 List arguments, |
| 254 Map<String, String> environmentOverrides) { |
| 255 return new CommandArtifact(<Command>[ |
| 256 this.computeCompilationCommand('$tempDir/out.dill', buildDir, |
| 257 CommandBuilder.instance, arguments, environmentOverrides) |
| 258 ], '$tempDir/out.dill', 'application/dart'); |
| 259 } |
| 260 } |
| 261 |
| 262 typedef List<String> CompilerArgumentsFunction( |
| 263 List<String> globalArguments, |
| 264 String previousCompilerOutput); |
| 265 |
| 266 class PipelineCommand { |
| 267 final CompilerConfiguration compilerConfiguration; |
| 268 final CompilerArgumentsFunction _argumentsFunction; |
| 269 |
| 270 PipelineCommand._(this.compilerConfiguration, this._argumentsFunction); |
| 271 |
| 272 factory PipelineCommand.runWithGlobalArguments(CompilerConfiguration conf) { |
| 273 return new PipelineCommand._(conf, (List<String> globalArguments, |
| 274 String previousOutput) { |
| 275 assert(previousOutput == null); |
| 276 return globalArguments; |
| 277 }); |
| 278 } |
| 279 |
| 280 factory PipelineCommand.runWithDartOrKernelFile(CompilerConfiguration conf) { |
| 281 return new PipelineCommand._(conf, (List<String> globalArguments, |
| 282 String previousOutput) { |
| 283 var filtered = globalArguments |
| 284 .where((String name) => name.endsWith('.dart') || |
| 285 name.endsWith('.dill')) |
| 286 .toList(); |
| 287 assert(filtered.length == 1); |
| 288 return filtered; |
| 289 }); |
| 290 } |
| 291 |
| 292 factory PipelineCommand.runWithPreviousKernelOutput( |
| 293 CompilerConfiguration conf) { |
| 294 return new PipelineCommand._(conf, (List<String> globalArguments, |
| 295 String previousOutput) { |
| 296 assert(previousOutput.endsWith('.dill')); |
| 297 return [previousOutput]; |
| 298 }); |
| 299 } |
| 300 |
| 301 List<String> extractArguments(List<String> globalArguments, |
| 302 String previousOutput) { |
| 303 return _argumentsFunction(globalArguments, previousOutput); |
| 304 } |
| 305 } |
| 306 |
| 307 class ComposedCompilerConfiguration extends CompilerConfiguration { |
| 308 final List<PipelineCommand> pipelineCommands; |
| 309 |
| 310 ComposedCompilerConfiguration(this.pipelineCommands) |
| 311 : super._subclass(); |
| 312 |
| 313 CommandArtifact computeCompilationArtifact( |
| 314 String buildDir, |
| 315 String tempDir, |
| 316 CommandBuilder commandBuilder, |
| 317 List globalArguments, |
| 318 Map<String, String> environmentOverrides) { |
| 319 |
| 320 List<Command> allCommands = []; |
| 321 |
| 322 // The first compilation command is as usual. |
| 323 var arguments = pipelineCommands[0].extractArguments(globalArguments, null); |
| 324 CommandArtifact artifact = |
| 325 pipelineCommands[0].compilerConfiguration.computeCompilationArtifact( |
| 326 buildDir, tempDir, commandBuilder, arguments, environmentOverrides); |
| 327 allCommands.addAll(artifact.commands); |
| 328 |
| 329 // The following compilation commands are based on the output of the |
| 330 // previous one. |
| 331 for (int i = 1; i < pipelineCommands.length; i++) { |
| 332 PipelineCommand pc = pipelineCommands[i]; |
| 333 |
| 334 arguments = pc.extractArguments(globalArguments, artifact.filename); |
| 335 artifact = pc.compilerConfiguration.computeCompilationArtifact( |
| 336 buildDir, tempDir, commandBuilder, arguments, environmentOverrides); |
| 337 |
| 338 allCommands.addAll(artifact.commands); |
| 339 } |
| 340 |
| 341 return new CommandArtifact( |
| 342 allCommands, artifact.filename, artifact.mimeType); |
| 343 } |
| 344 |
| 345 List<String> computeCompilerArguments(vmOptions, sharedOptions, args) { |
| 346 // The result will be passed as an input to [extractArguments] |
| 347 // (i.e. the arguments to the [PipelineCommand]). |
| 348 return new List<String>.from(sharedOptions)..addAll(args); |
| 349 } |
| 350 |
| 351 List<String> computeRuntimeArguments( |
| 352 RuntimeConfiguration runtimeConfiguration, |
| 353 String buildDir, |
| 354 TestInformation info, |
| 355 List<String> vmOptions, |
| 356 List<String> sharedOptions, |
| 357 List<String> originalArguments, |
| 358 CommandArtifact artifact) { |
| 359 return <String>[artifact.filename]; |
| 360 } |
| 361 |
| 362 static ComposedCompilerConfiguration createDartKPConfiguration( |
| 363 {bool isHostChecked, String arch, bool useBlobs, bool isAndroid, |
| 364 String kernel_transformers, bool useSdk}) { |
| 365 var nested = []; |
| 366 |
| 367 // Compile with dartk. |
| 368 nested.add(new PipelineCommand.runWithGlobalArguments( |
| 369 new DartKCompilerConfiguration(isHostChecked: isHostChecked, |
| 370 useSdk: useSdk))); |
| 371 |
| 372 // Run zero or more transformations. |
| 373 addKernelTransformations(nested, kernel_transformers); |
| 374 |
| 375 // Run the normal precompiler. |
| 376 nested.add(new PipelineCommand.runWithPreviousKernelOutput( |
| 377 new PrecompilerCompilerConfiguration( |
| 378 arch: arch, useBlobs: useBlobs, isAndroid: isAndroid))); |
| 379 |
| 380 return new ComposedCompilerConfiguration(nested); |
| 381 } |
| 382 |
| 383 static ComposedCompilerConfiguration createDartKConfiguration( |
| 384 {bool isHostChecked, bool useSdk, String kernel_transformers}) { |
| 385 var nested = []; |
| 386 |
| 387 // Compile with dartk. |
| 388 nested.add(new PipelineCommand.runWithGlobalArguments( |
| 389 new DartKCompilerConfiguration(isHostChecked: isHostChecked, |
| 390 useSdk: useSdk))); |
| 391 |
| 392 // Run zero or more transformations. |
| 393 addKernelTransformations(nested, kernel_transformers); |
| 394 |
| 395 return new ComposedCompilerConfiguration(nested); |
| 396 } |
| 397 |
| 398 static void addKernelTransformations(List<PipelineCommand> nested, |
| 399 String kernel_transformers) { |
| 400 if (kernel_transformers != null && kernel_transformers.length > 0) { |
| 401 List<String> names = kernel_transformers.split(','); |
| 402 for (var name in names) { |
| 403 var transformation = new KernelTransformation(name); |
| 404 nested.add(nested.isEmpty |
| 405 ? new PipelineCommand.runWithDartOrKernelFile(transformation) |
| 406 : new PipelineCommand.runWithPreviousKernelOutput(transformation)); |
| 407 } |
| 408 } |
| 409 } |
| 410 } |
| 411 |
| 412 class KernelTransformation extends CompilerConfiguration { |
| 413 final String transformation; |
| 414 |
| 415 KernelTransformation(this.transformation) : super._subclass(); |
| 416 |
| 417 CommandArtifact computeCompilationArtifact( |
| 418 String buildDir, |
| 419 String tempDir, |
| 420 CommandBuilder commandBuilder, |
| 421 List arguments, |
| 422 Map<String, String> environmentOverrides) { |
| 423 assert(arguments.length == 1); |
| 424 assert(arguments.last.contains('/')); |
| 425 assert(arguments.last.endsWith('.dill')); |
| 426 |
| 427 // The --kernel-transformers=a,b can be specified as |
| 428 // a = <name> |
| 429 // a = <name>:<path-to-transformer-executable> |
| 430 int colonIndex = transformation.indexOf(':'); |
| 431 String transformationName = transformation; |
| 432 String executable; |
| 433 if (colonIndex > 0) { |
| 434 executable = transformation.substring(colonIndex + 1); |
| 435 transformationName = transformation.substring(0, colonIndex); |
| 436 } |
| 437 |
| 438 // The transformed output will be always written to a new file in the |
| 439 // test-specific temporary directory. |
| 440 var inputFile = arguments.last; |
| 441 var baseInputFilename = inputFile.substring( |
| 442 inputFile.lastIndexOf('/') + 1, inputFile.length - '.dill'.length); |
| 443 var outputFile = '$tempDir/$baseInputFilename.$transformationName.dill'; |
| 444 |
| 445 // Use the user-supplied transformer or fall back to `transformer.dart`. |
| 446 List<String> transformerArguments; |
| 447 bool useBatchMode = false; |
| 448 if (executable == null) { |
| 449 executable = 'third_party/pkg/kernel/bin/transform.dart'; |
| 450 transformerArguments = |
| 451 ['-f', 'bin', '-t', transformation, '-o', outputFile, inputFile]; |
| 452 useBatchMode = true; |
| 453 } else { |
| 454 transformerArguments = [inputFile, outputFile]; |
| 455 } |
| 456 |
| 457 var command = commandBuilder.getKernelTransformationCommand( |
| 458 transformationName, executable, transformerArguments, outputFile, |
| 459 environmentOverrides, useBatchMode); |
| 460 |
| 461 return new CommandArtifact( |
| 462 <Command>[ command ], outputFile, 'application/dart'); |
| 463 } |
| 464 } |
| 465 |
202 /// Common configuration for dart2js-based tools, such as, dart2js | 466 /// Common configuration for dart2js-based tools, such as, dart2js |
203 class Dart2xCompilerConfiguration extends CompilerConfiguration { | 467 class Dart2xCompilerConfiguration extends CompilerConfiguration { |
204 final String moniker; | 468 final String moniker; |
205 static Map<String, List<Uri>> _bootstrapDependenciesCache = | 469 static Map<String, List<Uri>> _bootstrapDependenciesCache = |
206 new Map<String, List<Uri>>(); | 470 new Map<String, List<Uri>>(); |
207 | 471 |
208 Dart2xCompilerConfiguration(this.moniker, | 472 Dart2xCompilerConfiguration(this.moniker, |
209 {bool isDebug, bool isChecked, bool isHostChecked, bool useSdk}) | 473 {bool isDebug, bool isChecked, bool isHostChecked, bool useSdk}) |
210 : super._subclass( | 474 : super._subclass( |
211 isDebug: isDebug, | 475 isDebug: isDebug, |
(...skipping 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
639 RuntimeConfiguration runtimeConfiguration, | 903 RuntimeConfiguration runtimeConfiguration, |
640 String buildDir, | 904 String buildDir, |
641 TestInformation info, | 905 TestInformation info, |
642 List<String> vmOptions, | 906 List<String> vmOptions, |
643 List<String> sharedOptions, | 907 List<String> sharedOptions, |
644 List<String> originalArguments, | 908 List<String> originalArguments, |
645 CommandArtifact artifact) { | 909 CommandArtifact artifact) { |
646 return <String>[]; | 910 return <String>[]; |
647 } | 911 } |
648 } | 912 } |
OLD | NEW |