#!/usr/bin/env dart // Copyright (c) 2017, the Dart project authors. Please see the AUTHORS file // for details. All rights reserved. Use of this source code is governed by a // BSD-style license that can be found in the LICENSE file. // @dart = 2.9 import 'dart:async'; import 'dart:convert' show json; import 'dart:io'; import 'package:args/args.dart' show ArgParser; import 'package:build_integration/file_system/multi_root.dart'; import 'package:dev_compiler/src/compiler/module_builder.dart'; import 'package:dev_compiler/src/compiler/shared_command.dart' show SharedCompilerOptions; import 'package:dev_compiler/src/kernel/target.dart'; import 'package:dev_compiler/src/kernel/command.dart'; import 'package:dev_compiler/src/kernel/compiler.dart'; import 'package:front_end/src/api_unstable/ddc.dart' show CompilerOptions, DiagnosticMessage, Severity, StandardFileSystem, kernelForModule, printDiagnosticMessage; import 'package:kernel/kernel.dart'; import 'package:kernel/target/targets.dart'; import 'package:path/path.dart' as p; Future main(List args) async { var ddcPath = p.dirname(p.dirname(p.fromUri(Platform.script))); // Parse flags. var parser = ArgParser() ..addOption('output') ..addOption('libraries', defaultsTo: p.join(ddcPath, '../../sdk/lib/libraries.json')) ..addOption('packages', defaultsTo: p.join(ddcPath, '../../.packages')); var parserOptions = parser.parse(args); var outputPath = parserOptions['output'] as String; if (outputPath == null) { var sdkRoot = p.absolute(p.dirname(p.dirname(ddcPath))); var buildDir = p.join(sdkRoot, Platform.isMacOS ? 'xcodebuild' : 'out'); var genDir = p.join(buildDir, 'ReleaseX64', 'gen', 'utils', 'dartdevc'); outputPath = p.join(genDir, 'kernel', 'ddc_sdk.dill'); } var librarySpecPath = parserOptions['libraries'] as String; var packagesPath = parserOptions['packages'] as String; var target = DevCompilerTarget(TargetFlags()); void onDiagnostic(DiagnosticMessage message) { printDiagnosticMessage(message, print); if (message.severity == Severity.error || message.severity == Severity.internalProblem) { exitCode = 1; } } var customScheme = 'org-dartlang-sdk'; var fileSystem = MultiRootFileSystem( customScheme, [Uri.base], StandardFileSystem.instance); var sdkRoot = Uri.parse('$customScheme:/'); var packagesFileUri = sdkRoot .resolve(p.relative(Uri.file(packagesPath).path, from: Uri.base.path)); if (packagesFileUri.scheme != customScheme) { throw 'packagesPath has to be under ${Uri.base}'; } var librariesSpecificationUri = sdkRoot .resolve(p.relative(Uri.file(librarySpecPath).path, from: Uri.base.path)); if (librariesSpecificationUri.scheme != customScheme) { throw 'librarySpecPath has to be under ${Uri.base}'; } var options = CompilerOptions() ..compileSdk = true ..fileSystem = fileSystem ..sdkRoot = sdkRoot ..packagesFileUri = packagesFileUri ..librariesSpecificationUri = librariesSpecificationUri ..target = target ..onDiagnostic = onDiagnostic ..environmentDefines = {}; var inputs = target.extraRequiredLibraries.map(Uri.parse).toList(); var compilerResult = await kernelForModule(inputs, options); var component = compilerResult.component; var outputDir = p.dirname(outputPath); await Directory(outputDir).create(recursive: true); await writeComponentToBinary(component, outputPath); File(librarySpecPath) .copySync(p.join(p.dirname(outputDir), p.basename(librarySpecPath))); var jsModule = ProgramCompiler( component, compilerResult.classHierarchy, SharedCompilerOptions(moduleName: 'dart_sdk'), const {}, const {}).emitModule(component); var moduleFormats = { 'amd': ModuleFormat.amd, 'common': ModuleFormat.common, 'es6': ModuleFormat.es6, 'legacy': ModuleFormat.ddc, }; for (var name in moduleFormats.keys) { var format = moduleFormats[name]; var jsDir = p.join(outputDir, name); var jsPath = p.join(jsDir, 'dart_sdk.js'); var mapPath = '$jsPath.map'; await Directory(jsDir).create(); var jsCode = jsProgramToCode(jsModule, format, jsUrl: jsPath, mapUrl: mapPath, buildSourceMap: true, customScheme: customScheme, component: component); await File(jsPath).writeAsString(jsCode.code); await File(mapPath).writeAsString(json.encode(jsCode.sourceMap)); } }