Index: tools/patch_sdk.dart |
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart |
index 3ff5d4828b2bca8ce046143d8cba024b086a60f6..6b12489f0922ca6aef8a5373bc4fc4e730a64061 100644 |
--- a/tools/patch_sdk.dart |
+++ b/tools/patch_sdk.dart |
@@ -16,11 +16,18 @@ import 'package:analyzer/analyzer.dart'; |
import 'package:analyzer/src/generated/sdk.dart'; |
import 'package:path/path.dart' as path; |
-import 'package:front_end/src/fasta/fasta.dart' as fasta |
- show compile, compilePlatform, writeDepsFile; |
+import 'package:front_end/front_end.dart'; |
+import 'package:front_end/src/base/processed_options.dart'; |
+import 'package:front_end/src/kernel_generator_impl.dart'; |
+import 'package:front_end/src/fasta/util/relativize.dart' show relativizeUri; |
-import 'package:compiler/src/kernel/fasta_support.dart' as dart2js |
- show compilePlatform; |
+import 'package:front_end/src/fasta/fasta.dart' as fasta show getDependencies; |
+import 'package:front_end/src/fasta/kernel/utils.dart' show writeProgramToFile; |
+ |
+import 'package:kernel/target/targets.dart'; |
+import 'package:kernel/target/vm_fasta.dart'; |
+import 'package:kernel/target/flutter_fasta.dart'; |
+import 'package:compiler/src/kernel/dart2js_target.dart' show Dart2jsTarget; |
/// Set of input files that were read by this script to generate patched SDK. |
/// We will dump it out into the depfile for ninja to use. |
@@ -119,34 +126,32 @@ Future _main(List<String> argv) async { |
await _writeSync( |
librariesJson.toFilePath(), JSON.encode({"libraries": locations})); |
- if (forVm || forFlutter) { |
- await fasta.compilePlatform(outDirUri, platform, |
- packages: packages, |
- outlineOutput: outline, |
- backendTarget: forVm ? 'vm_fasta' : 'flutter_fasta'); |
- } else { |
- await dart2js.compilePlatform(outDirUri, platform, |
- packages: packages, outlineOutput: outline); |
- } |
+ var flags = new TargetFlags(); |
+ var target = forVm |
+ ? new VmFastaTarget(flags) |
+ : (forFlutter ? new FlutterFastaTarget(flags) : new Dart2jsTarget(flags)); |
+ var platformDeps = |
+ await compilePlatform(outDirUri, target, packages, platform, outline); |
+ deps.addAll(platformDeps); |
if (forVm) { |
+ // TODO(sigmund): add support for the flutter vmservice_sky as well. |
+ var vmserviceName = 'vmservice_io'; |
var base = path.fromUri(Platform.script); |
- Uri repositoryDir = |
+ Uri dartDir = |
new Uri.directory(path.dirname(path.dirname(path.absolute(base)))); |
- var vmserviceName = 'vmservice_io'; |
- Uri vmserviceSdk = repositoryDir.resolve('runtime/bin/vmservice_sdk/'); |
+ var program = await kernelForProgram( |
+ Uri.parse('dart:$vmserviceName'), |
+ new CompilerOptions() |
+ ..sdkSummary = outline |
+ ..dartLibraries = <String, Uri>{ |
+ '_vmservice': outDirUri.resolve('lib/vmservice/vmservice.dart'), |
+ 'vmservice_io': |
+ dartDir.resolve('runtime/bin/vmservice/vmservice_io.dart'), |
+ } |
+ ..packagesFileUri = packages); |
Uri vmserviceUri = outDirUri.resolve('$vmserviceName.dill'); |
- // TODO(sigmundch): Specify libraries.json directly instead of "--sdk" |
- // after #29882 is fixed. |
- await fasta.compile([ |
- "--sdk=$vmserviceSdk", |
- "--platform=$outline", |
- "--target=vm_fasta", |
- "--packages=$packages", |
- "dart:$vmserviceName", |
- "-o", |
- "$vmserviceUri", |
- ]); |
+ await writeProgramToFile(program, vmserviceUri); |
} |
Uri platformFinalLocation = outDirUri.resolve('platform.dill'); |
@@ -167,18 +172,8 @@ Future _main(List<String> argv) async { |
// sdk library used by this script indirectly depends on a VM-specific |
// patch file. |
// |
- // These set of files is discovered by `writeDepsFile` below, and the |
+ // These set of files is discovered by `getDependencies` below, and the |
// [platformForDeps] is always the VM-specific `platform.dill` file. |
- // |
- // TODO(sigmund): we should change this: |
- // - we should rewrite writeDepsFile: fasta could provide an API to crawl |
- // the dependencies, but anything that is GN specific, should be on |
- // this file instead. |
- // |
- // - We don't need to include sdk dependencies of the script because |
- // those are already included indirectly (either in [deps] when |
- // building the sdk for the VM, or via the .GN dependencies in the |
- // build files for dart2js and flutter). |
var platformForDeps = platform; |
var sdkDir = outDirUri; |
if (forDart2js || forFlutter) { |
@@ -188,16 +183,80 @@ Future _main(List<String> argv) async { |
platformForDeps = outDirUri.resolve('../patched_sdk/platform.dill'); |
sdkDir = outDirUri.resolve('../patched_sdk/'); |
} |
- await fasta.writeDepsFile(Platform.script, |
- Uri.base.resolveUri(new Uri.file("$outDir.d")), platformFinalLocation, |
- sdk: sdkDir, |
- packages: packages, |
- platform: platformForDeps, |
- extraDependencies: deps); |
- |
+ deps.addAll(await fasta.getDependencies(Platform.script, |
+ sdk: sdkDir, packages: packages, platform: platformForDeps)); |
+ await writeDepsFile(Uri.base.resolveUri(new Uri.file("$outDir.d")), |
+ platformFinalLocation, deps); |
await new File.fromUri(platform).rename(platformFinalLocation.toFilePath()); |
} |
+/// Generates an outline.dill and platform.dill file containing the result of |
+/// compiling a platform's SDK. |
+/// |
+/// Returns a list of dependencies read by the compiler. This list can be used |
+/// to create GN dependency files. |
+Future<List<Uri>> compilePlatform(Uri patchedSdk, Target target, Uri packages, |
+ Uri fullOutput, Uri outlineOutput) async { |
+ var options = new CompilerOptions() |
+ ..strongMode = false |
+ ..compileSdk = true |
+ ..sdkRoot = patchedSdk |
+ ..packagesFileUri = packages |
+ ..chaseDependencies = true |
+ ..target = target; |
+ |
+ var result = await generateKernel( |
+ new ProcessedOptions( |
+ options, |
+ // TODO(sigmund): pass all sdk libraries needed here, and make this |
+ // hermetic. |
+ false, |
+ [Uri.parse('dart:core')]), |
+ buildSummary: true, |
+ buildProgram: true); |
+ new File.fromUri(outlineOutput).writeAsBytesSync(result.summary); |
+ await writeProgramToFile(result.program, fullOutput); |
+ return result.deps; |
+} |
+ |
+Future writeDepsFile( |
+ Uri output, Uri depsFile, Iterable<Uri> allDependencies) async { |
+ if (allDependencies.isEmpty) return; |
+ String toRelativeFilePath(Uri uri) { |
+ // Ninja expects to find file names relative to the current working |
+ // directory. We've tried making them relative to the deps file, but that |
+ // doesn't work for downstream projects. Making them absolute also |
+ // doesn't work. |
+ // |
+ // We can test if it works by running ninja twice, for example: |
+ // |
+ // ninja -C xcodebuild/ReleaseX64 runtime_kernel -d explain |
+ // ninja -C xcodebuild/ReleaseX64 runtime_kernel -d explain |
+ // |
+ // The second time, ninja should say: |
+ // |
+ // ninja: Entering directory `xcodebuild/ReleaseX64' |
+ // ninja: no work to do. |
+ // |
+ // It's broken if it says something like this: |
+ // |
+ // ninja explain: expected depfile 'patched_sdk.d' to mention |
+ // 'patched_sdk/platform.dill', got |
+ // '/.../xcodebuild/ReleaseX64/patched_sdk/platform.dill' |
+ return Uri.parse(relativizeUri(uri, base: Uri.base)).toFilePath(); |
+ } |
+ |
+ StringBuffer sb = new StringBuffer(); |
+ sb.write(toRelativeFilePath(output)); |
+ sb.write(":"); |
+ for (Uri uri in allDependencies) { |
+ sb.write(" "); |
+ sb.write(toRelativeFilePath(uri)); |
+ } |
+ sb.writeln(); |
+ await new File.fromUri(depsFile).writeAsString("$sb"); |
+} |
+ |
/// Updates the contents of |
/// sdk/lib/_internal/sdk_library_metadata/lib/libraries.dart to include |
/// declarations for vm internal libraries. |