Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(84)

Unified Diff: tools/patch_sdk.dart

Issue 2742333006: Move patch file generation to fasta. (Closed)
Patch Set: Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « pkg/front_end/lib/src/fasta/vm.dart ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: tools/patch_sdk.dart
diff --git a/tools/patch_sdk.dart b/tools/patch_sdk.dart
index 5aa3c53332c443174a69ec481633535b39a5a52d..7faa05714e4a6bf7a77d15e4c1f155be0ac519fe 100644
--- a/tools/patch_sdk.dart
+++ b/tools/patch_sdk.dart
@@ -7,22 +7,16 @@
/// This is currently designed as an offline tool, but we could automate it.
import 'dart:io';
+import 'dart:isolate' show RawReceivePort;
import 'dart:async';
import 'dart:math' as math;
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/compile_platform.dart' as compile_platform;
-import 'package:front_end/src/fasta/fasta.dart' show CompileTask;
-
-import 'package:front_end/src/fasta/compiler_command_line.dart'
- show CompilerCommandLine;
-
-import 'package:front_end/src/fasta/compiler_context.dart' show CompilerContext;
-
-import 'package:front_end/src/fasta/ticker.dart' show Ticker;
+import 'package:front_end/src/fasta/fasta.dart'
+ show compilePlatform, writeDepsFile;
/// 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.
@@ -31,7 +25,7 @@ import 'package:front_end/src/fasta/ticker.dart' show Ticker;
/// https://chromium.googlesource.com/chromium/src/+/56807c6cb383140af0c03da8f6731d77785d7160/tools/gn/docs/reference.md#depfile_string_File-name-for-input-dependencies-for-actions
/// https://ninja-build.org/manual.html#_depfile
///
-final deps = new Set<String>();
+final deps = new Set<Uri>();
/// Create [File] object from the given path and register it as a dependency.
File getInputFile(String path, {canBeMissing: false}) {
@@ -40,7 +34,7 @@ File getInputFile(String path, {canBeMissing: false}) {
if (!canBeMissing) throw "patch_sdk.dart expects all inputs to exist";
return null;
}
- deps.add(file.absolute.path);
+ deps.add(Uri.base.resolveUri(file.uri));
return file;
}
@@ -50,40 +44,42 @@ String readInputFile(String path, {canBeMissing: false}) =>
getInputFile(path, canBeMissing: canBeMissing)?.readAsStringSync();
Future main(List<String> argv) async {
- var base = path.fromUri(Platform.script);
- var dartDir = path.dirname(path.dirname(path.absolute(base)));
-
- if (argv.length != 5 || argv.first != 'vm') {
- final self = path.relative(base);
- print('Usage: $self vm SDK_DIR PATCH_DIR OUTPUT_DIR PACKAGES');
-
- final repositoryDir = path.relative(path.dirname(path.dirname(base)));
- final sdkExample = path.relative(path.join(repositoryDir, 'sdk'));
- final patchExample = path.relative(
- path.join(repositoryDir, 'out', 'DebugX64', 'obj', 'gen', 'patch'));
- final outExample = path.relative(path.join(
- repositoryDir, 'out', 'DebugX64', 'obj', 'gen', 'patched_sdk'));
- print('For example:');
- print('\$ $self vm $sdkExample $patchExample $outExample');
-
- exit(1);
- }
+ var port = new RawReceivePort();
+ try {
Vyacheslav Egorov (Google) 2017/03/15 13:43:59 With such a gigantic try { } finally { } it might
ahe 2017/03/31 15:05:02 Done.
+ var base = path.fromUri(Platform.script);
+ var dartDir = path.dirname(path.dirname(path.absolute(base)));
+
+ if (argv.length != 5 || argv.first != 'vm') {
+ final self = path.relative(base);
+ print('Usage: $self vm SDK_DIR PATCH_DIR OUTPUT_DIR PACKAGES');
+
+ final repositoryDir = path.relative(path.dirname(path.dirname(base)));
+ final sdkExample = path.relative(path.join(repositoryDir, 'sdk'));
+ final patchExample = path.relative(
+ path.join(repositoryDir, 'out', 'DebugX64', 'obj', 'gen', 'patch'));
+ final outExample = path.relative(path.join(
+ repositoryDir, 'out', 'DebugX64', 'obj', 'gen', 'patched_sdk'));
+ print('For example:');
+ print('\$ $self vm $sdkExample $patchExample $outExample');
+
+ exit(1);
+ }
- var mode = argv[0];
- assert(mode == "vm");
- var input = argv[1];
- var sdkLibIn = path.join(input, 'lib');
- var patchIn = argv[2];
- var outDir = argv[3];
- var sdkOut = path.join(outDir, 'lib');
- var packagesFile = argv[4];
-
- // Copy and patch libraries.dart and version
- var libContents = readInputFile(path.join(
- sdkLibIn, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'));
- libContents = libContents.replaceAll(
- ' libraries = const {',
- ''' libraries = const {
+ var mode = argv[0];
+ assert(mode == "vm");
+ var input = argv[1];
+ var sdkLibIn = path.join(input, 'lib');
+ var patchIn = argv[2];
+ var outDir = argv[3];
+ var sdkOut = path.join(outDir, 'lib');
+ var packagesFile = argv[4];
+
+ // Copy and patch libraries.dart and version
+ var libContents = readInputFile(path.join(sdkLibIn, '_internal',
+ 'sdk_library_metadata', 'lib', 'libraries.dart'));
+ libContents = libContents.replaceAll(
+ ' libraries = const {',
+ ''' libraries = const {
"_builtin": const LibraryInfo(
"_builtin/_builtin.dart",
@@ -110,161 +106,124 @@ Future main(List<String> argv) async {
platforms: VM_PLATFORM),
''');
- _writeSync(
- path.join(
- sdkOut, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'),
- libContents);
-
- // Parse libraries.dart
- var sdkLibraries = _getSdkLibraries(libContents);
-
- // Enumerate core libraries and apply patches
- for (SdkLibrary library in sdkLibraries) {
- if (library.isDart2JsLibrary) {
- continue;
- }
-
- var libraryOut = path.join(sdkLibIn, library.path);
- var libraryIn = libraryOut;
-
- var libraryFile = getInputFile(libraryIn, canBeMissing: true);
- if (libraryFile != null) {
- var outPaths = <String>[libraryOut];
- var libraryContents = libraryFile.readAsStringSync();
-
- int inputModifyTime =
- libraryFile.lastModifiedSync().millisecondsSinceEpoch;
- var partFiles = <File>[];
- for (var part in parseDirectives(libraryContents).directives) {
- if (part is PartDirective) {
- var partPath = part.uri.stringValue;
- outPaths.add(path.join(path.dirname(libraryOut), partPath));
-
- var partFile =
- getInputFile(path.join(path.dirname(libraryIn), partPath));
- partFiles.add(partFile);
- inputModifyTime = math.max(inputModifyTime,
- partFile.lastModifiedSync().millisecondsSinceEpoch);
- }
+ _writeSync(
+ path.join(sdkOut, '_internal', 'sdk_library_metadata', 'lib',
+ 'libraries.dart'),
+ libContents);
+
+ // Parse libraries.dart
+ var sdkLibraries = _getSdkLibraries(libContents);
+
+ // Enumerate core libraries and apply patches
+ for (SdkLibrary library in sdkLibraries) {
+ if (library.isDart2JsLibrary) {
+ continue;
}
- // See if we can find a patch file.
- var patchPath = path.join(
- patchIn, path.basenameWithoutExtension(libraryIn) + '_patch.dart');
+ var libraryOut = path.join(sdkLibIn, library.path);
+ var libraryIn = libraryOut;
+
+ var libraryFile = getInputFile(libraryIn, canBeMissing: true);
+ if (libraryFile != null) {
+ var outPaths = <String>[libraryOut];
+ var libraryContents = libraryFile.readAsStringSync();
+
+ int inputModifyTime =
+ libraryFile.lastModifiedSync().millisecondsSinceEpoch;
+ var partFiles = <File>[];
+ for (var part in parseDirectives(libraryContents).directives) {
+ if (part is PartDirective) {
+ var partPath = part.uri.stringValue;
+ outPaths.add(path.join(path.dirname(libraryOut), partPath));
+
+ var partFile =
+ getInputFile(path.join(path.dirname(libraryIn), partPath));
+ partFiles.add(partFile);
+ inputModifyTime = math.max(inputModifyTime,
+ partFile.lastModifiedSync().millisecondsSinceEpoch);
+ }
+ }
- var patchFile = getInputFile(patchPath, canBeMissing: true);
- if (patchFile != null) {
- inputModifyTime = math.max(inputModifyTime,
- patchFile.lastModifiedSync().millisecondsSinceEpoch);
- }
+ // See if we can find a patch file.
+ var patchPath = path.join(
+ patchIn, path.basenameWithoutExtension(libraryIn) + '_patch.dart');
- // Compute output paths
- outPaths = outPaths
- .map((p) => path.join(sdkOut, path.relative(p, from: sdkLibIn)))
- .toList();
-
- // Compare output modify time with input modify time.
- bool needsUpdate = false;
- for (var outPath in outPaths) {
- var outFile = new File(outPath);
- if (!outFile.existsSync() ||
- outFile.lastModifiedSync().millisecondsSinceEpoch <
- inputModifyTime) {
- needsUpdate = true;
- break;
+ var patchFile = getInputFile(patchPath, canBeMissing: true);
+ if (patchFile != null) {
+ inputModifyTime = math.max(inputModifyTime,
+ patchFile.lastModifiedSync().millisecondsSinceEpoch);
}
- }
- if (needsUpdate) {
- var contents = <String>[libraryContents];
- contents.addAll(partFiles.map((f) => f.readAsStringSync()));
- if (patchFile != null) {
- var patchContents = patchFile.readAsStringSync();
- contents = _patchLibrary(patchFile.path, contents, patchContents);
+ // Compute output paths
+ outPaths = outPaths
+ .map((p) => path.join(sdkOut, path.relative(p, from: sdkLibIn)))
+ .toList();
+
+ // Compare output modify time with input modify time.
+ bool needsUpdate = false;
+ for (var outPath in outPaths) {
+ var outFile = new File(outPath);
+ if (!outFile.existsSync() ||
+ outFile.lastModifiedSync().millisecondsSinceEpoch <
+ inputModifyTime) {
+ needsUpdate = true;
+ break;
+ }
}
- for (var i = 0; i < outPaths.length; i++) {
- _writeSync(outPaths[i], contents[i]);
+ if (needsUpdate) {
+ var contents = <String>[libraryContents];
+ contents.addAll(partFiles.map((f) => f.readAsStringSync()));
+ if (patchFile != null) {
+ var patchContents = patchFile.readAsStringSync();
+ contents = _patchLibrary(patchFile.path, contents, patchContents);
+ }
+
+ for (var i = 0; i < outPaths.length; i++) {
+ _writeSync(outPaths[i], contents[i]);
+ }
}
}
}
- }
-
- for (var tuple in [
- ['_builtin', 'builtin.dart']
- ]) {
- var vmLibrary = tuple[0];
- var dartFile = tuple[1];
-
- // The "dart:_builtin" library is only available for the DartVM.
- var builtinLibraryIn = path.join(dartDir, 'runtime', 'bin', dartFile);
- var builtinLibraryOut = path.join(sdkOut, vmLibrary, '${vmLibrary}.dart');
- _writeSync(builtinLibraryOut, readInputFile(builtinLibraryIn));
- }
-
- for (var file in ['loader.dart', 'server.dart', 'vmservice_io.dart']) {
- var libraryIn = path.join(dartDir, 'runtime', 'bin', 'vmservice', file);
- var libraryOut = path.join(sdkOut, 'vmservice_io', file);
- _writeSync(libraryOut, readInputFile(libraryIn));
- }
- final platform = path.join(outDir, 'platform.dill');
+ for (var tuple in [
+ ['_builtin', 'builtin.dart']
+ ]) {
+ var vmLibrary = tuple[0];
+ var dartFile = tuple[1];
- await compile_platform.mainEntryPoint(<String>[
- '--packages',
- new Uri.file(packagesFile).toString(),
- new Uri.directory(outDir).toString(),
- platform,
- ]);
+ // The "dart:_builtin" library is only available for the DartVM.
+ var builtinLibraryIn = path.join(dartDir, 'runtime', 'bin', dartFile);
+ var builtinLibraryOut = path.join(sdkOut, vmLibrary, '${vmLibrary}.dart');
+ _writeSync(builtinLibraryOut, readInputFile(builtinLibraryIn));
+ }
- // TODO(kustermann): We suppress compiler hints/warnings/errors temporarily
- // because everyone building the `runtime` target will get these now.
- // We should remove the suppression again once the underlying issues have
- // been fixed (either in fasta or the dart files in the patched_sdk).
- final capturedLines = <String>[];
- try {
- await runZoned(() async {
- // platform.dill was generated, now generate platform.dill.d depfile
- // that captures all dependencies that participated in the generation.
- // There are two types of dependencies:
- // (1) all Dart sources that constitute this tool itself
- // (2) Dart SDK and patch sources.
- // We already collected all inputs from the second category in the deps
- // set. To collect inputs from the first category we actually use Fasta:
- // we ask Fasta to outline patch_sdk.dart and generate a depfile which
- // would list all the sources.
- final depfile = "${outDir}.d";
- await CompilerCommandLine.withGlobalOptions("outline", [
- '--packages',
- new Uri.file(packagesFile).toString(),
- '--platform',
- new Uri.file(platform).toString(), // platform.dill
- Platform.script.toString() // patch_sdk.dart
- ], (CompilerContext c) async {
- CompileTask task =
- new CompileTask(c, new Ticker(isVerbose: c.options.verbose));
- final kernelTarget = await task.buildOutline(null);
- await kernelTarget.writeDepsFile(
- new Uri.file(platform), new Uri.file(depfile));
- });
-
- // Read depfile generated by Fasta and append deps that we have collected
- // during generation of patched_sdk to it.
- // Note: we are splitting by ': ' because Windows paths can start with
- // drive letter followed by a colon.
- final list = new File(depfile).readAsStringSync().split(': ');
- assert(list.length == 2);
- deps.addAll(list[1].split(' ').where((str) => str.isNotEmpty));
- assert(list[0] == path.join('patched_sdk', 'platform.dill'));
- new File(depfile).writeAsStringSync("${list[0]}: ${deps.join(' ')}\n");
- }, zoneSpecification: new ZoneSpecification(print: (_, _2, _3, line) {
- capturedLines.add(line);
- }));
- } catch (_) {
- for (final line in capturedLines) {
- print(line);
+ for (var file in ['loader.dart', 'server.dart', 'vmservice_io.dart']) {
+ var libraryIn = path.join(dartDir, 'runtime', 'bin', 'vmservice', file);
+ var libraryOut = path.join(sdkOut, 'vmservice_io', file);
+ _writeSync(libraryOut, readInputFile(libraryIn));
}
- rethrow;
+
+ Uri platform = Uri.base
+ .resolveUri(new Uri.directory(outDir).resolve('platform.dill.tmp'));
+ Uri packages = Uri.base.resolveUri(new Uri.file(packagesFile));
+ await compilePlatform(
+ Uri.base.resolveUri(new Uri.directory(outDir)), platform,
+ packages: packages, verbose: false);
+
+ Uri platformFinalLocation =
+ Uri.base.resolveUri(new Uri.directory(outDir).resolve('platform.dill'));
+
+ await writeDepsFile(Platform.script,
+ Uri.base.resolveUri(new Uri.file("$outDir.d")), platformFinalLocation,
+ packages: packages,
+ platform: platform,
+ extraDependencies: deps,
+ verbose: false);
+
+ await new File.fromUri(platform).rename(platformFinalLocation.toFilePath());
+ } finally {
+ port.close();
}
}
« no previous file with comments | « pkg/front_end/lib/src/fasta/vm.dart ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698