1// Copyright 2013 The Flutter Authors. All rights reserved. 2// Use of this source code is governed by a BSD-style license that can be 3// found in the LICENSE file. 4 5// These packages exist in the third_party/dart .package, but not locally 6// which confuses the analyzer. 7// ignore_for_file: uri_does_not_exist 8import 'dart:async'; 9import 'dart:convert' show json; 10import 'dart:io'; 11import 'package:args/args.dart' show ArgParser; 12import 'package:dev_compiler/src/compiler/module_builder.dart'; 13import 'package:dev_compiler/src/compiler/shared_command.dart' 14 show SharedCompilerOptions; 15import 'package:dev_compiler/src/kernel/target.dart'; 16import 'package:dev_compiler/src/kernel/command.dart'; 17import 'package:dev_compiler/src/kernel/compiler.dart'; 18import 'package:front_end/src/api_unstable/ddc.dart' 19 show 20 CompilerOptions, 21 kernelForModule, 22 DiagnosticMessage, 23 printDiagnosticMessage, 24 Severity; 25import 'package:kernel/kernel.dart'; 26import 'package:kernel/target/targets.dart'; 27import 'package:path/path.dart' as path; 28 29// This script is forked from https://github.com/dart-lang/sdk/blob/master/pkg/dev_compiler/tool/kernel_sdk.dart 30// and produces the precompiled sdk for dartdevc. This has been modified to include a dart:ui target. 31Future main(List<String> args) async { 32 var ddcPath = path.dirname(path.dirname(path.fromUri(Platform.script))); 33 34 // Parse flags. 35 var parser = ArgParser() 36 ..addOption('output') 37 ..addOption('libraries', 38 defaultsTo: path.join(ddcPath, '../../sdk/lib/libraries.json')); 39 var parserOptions = parser.parse(args); 40 var outputPath = parserOptions['output'] as String; 41 if (outputPath == null) { 42 var sdkRoot = path.absolute(path.dirname(path.dirname(ddcPath))); 43 var buildDir = path.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out'); 44 var genDir = path.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc'); 45 outputPath = path.join(genDir, 'kernel', 'ddc_sdk.dill'); 46 } 47 48 var librarySpecPath = parserOptions['libraries'] as String; 49 var packagesPath = path.join(ddcPath, '../third_party/dart/.packages'); 50 void onDiagnostic(DiagnosticMessage message) { 51 printDiagnosticMessage(message, print); 52 if (message.severity == Severity.error || 53 message.severity == Severity.internalProblem) { 54 exitCode = 1; 55 } 56 } 57 58 var target = FlutterDevCompilerTarget(); 59 var options = CompilerOptions() 60 ..compileSdk = true 61 // TODO(sigmund): remove this unnecessary option when possible. 62 ..sdkRoot = Uri.base 63 ..packagesFileUri = Uri.base.resolveUri(Uri.file(packagesPath)) 64 ..librariesSpecificationUri = Uri.base.resolveUri(Uri.file(librarySpecPath)) 65 ..target = target 66 ..onDiagnostic = onDiagnostic 67 ..environmentDefines = {}; 68 69 var inputs = target.extraRequiredLibraries.map(Uri.parse).toList(); 70 var compilerResult = await kernelForModule(inputs, options); 71 var component = compilerResult.component; 72 73 var outputDir = path.dirname(outputPath); 74 await Directory(outputDir).create(recursive: true); 75 await writeComponentToBinary(component, outputPath); 76 77 var jsModule = ProgramCompiler( 78 component, 79 compilerResult.classHierarchy, 80 SharedCompilerOptions(moduleName: 'dart_sdk'), 81 {}).emitModule(component, [], [], {}); 82 var moduleFormats = { 83 'amd': ModuleFormat.amd, 84 }; 85 86 for (var name in moduleFormats.keys) { 87 var format = moduleFormats[name]; 88 var jsDir = path.join(outputDir, name); 89 var jsPath = path.join(jsDir, 'dart_sdk.js'); 90 await Directory(jsDir).create(); 91 var jsCode = jsProgramToCode(jsModule, format); 92 await File(jsPath).writeAsString(jsCode.code); 93 await File('$jsPath.map').writeAsString(json.encode(jsCode.sourceMap)); 94 } 95} 96 97class FlutterDevCompilerTarget extends DevCompilerTarget { 98 FlutterDevCompilerTarget() : super(TargetFlags()); 99 100 @override 101 List<String> get extraRequiredLibraries => const [ 102 'dart:_runtime', 103 'dart:_debugger', 104 'dart:_foreign_helper', 105 'dart:_interceptors', 106 'dart:_internal', 107 'dart:_isolate_helper', 108 'dart:_js_helper', 109 'dart:_js_mirrors', 110 'dart:_js_primitives', 111 'dart:_metadata', 112 'dart:_native_typed_data', 113 'dart:async', 114 'dart:collection', 115 'dart:convert', 116 'dart:developer', 117 'dart:io', 118 'dart:isolate', 119 'dart:js', 120 'dart:js_util', 121 'dart:math', 122 'dart:mirrors', 123 'dart:typed_data', 124 'dart:indexed_db', 125 'dart:html', 126 'dart:html_common', 127 'dart:svg', 128 'dart:web_audio', 129 'dart:web_gl', 130 'dart:web_sql', 131 'dart:ui', 132 'dart:_engine', 133 ]; 134} 135