| OLD | NEW |
| 1 #!/usr/bin/env dart | 1 #!/usr/bin/env dart |
| 2 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file | 2 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file |
| 3 // for details. All rights reserved. Use of this source code is governed by a | 3 // for details. All rights reserved. Use of this source code is governed by a |
| 4 // BSD-style license that can be found in the LICENSE file. | 4 // BSD-style license that can be found in the LICENSE file. |
| 5 | 5 |
| 6 /// Command line tool to merge the SDK libraries and our patch files. | 6 /// Command line tool to merge the SDK libraries and our patch files. |
| 7 /// This is currently designed as an offline tool, but we could automate it. | 7 /// This is currently designed as an offline tool, but we could automate it. |
| 8 | 8 |
| 9 import 'dart:io'; | 9 import 'dart:io'; |
| 10 import 'dart:isolate' show RawReceivePort; | 10 import 'dart:isolate' show RawReceivePort; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 101 var outDirUri = Uri.base.resolveUri(new Uri.directory(outDir)); | 101 var outDirUri = Uri.base.resolveUri(new Uri.directory(outDir)); |
| 102 var sdkOut = path.join(outDir, 'lib'); | 102 var sdkOut = path.join(outDir, 'lib'); |
| 103 var packagesFile = argv[4]; | 103 var packagesFile = argv[4]; |
| 104 | 104 |
| 105 // Parse libraries.dart | 105 // Parse libraries.dart |
| 106 var libContents = readInputFile(path.join( | 106 var libContents = readInputFile(path.join( |
| 107 sdkLibIn, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart')); | 107 sdkLibIn, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart')); |
| 108 libContents = _updateLibraryMetadata(sdkOut, libContents); | 108 libContents = _updateLibraryMetadata(sdkOut, libContents); |
| 109 var sdkLibraries = _getSdkLibraries(libContents); | 109 var sdkLibraries = _getSdkLibraries(libContents); |
| 110 | 110 |
| 111 Map<String, String> locations = <String, String>{}; | 111 var locations = <String, Map<String, String>>{}; |
| 112 | 112 |
| 113 // Enumerate core libraries and apply patches | 113 // Enumerate core libraries and apply patches |
| 114 for (SdkLibrary library in sdkLibraries) { | 114 for (SdkLibrary library in sdkLibraries) { |
| 115 if (forDart2js && library.isVmLibrary) continue; | 115 if (forDart2js && library.isVmLibrary) continue; |
| 116 if (!forDart2js && library.isDart2JsLibrary) continue; | 116 if (!forDart2js && library.isDart2JsLibrary) continue; |
| 117 _applyPatch(library, sdkLibIn, patchIn, sdkOut, locations); | 117 _applyPatch(library, sdkLibIn, patchIn, sdkOut, locations); |
| 118 } | 118 } |
| 119 | 119 |
| 120 _copyExtraLibraries(sdkOut, locations); | 120 _copyExtraLibraries(sdkOut, locations); |
| 121 | 121 |
| 122 Uri platform = outDirUri.resolve('platform.dill.tmp'); | 122 Uri platform = outDirUri.resolve('platform.dill.tmp'); |
| 123 Uri outline = outDirUri.resolve('outline.dill'); | 123 Uri outline = outDirUri.resolve('outline.dill'); |
| 124 Uri librariesJson = outDirUri.resolve("lib/libraries.json"); | 124 Uri librariesJson = outDirUri.resolve("lib/libraries.json"); |
| 125 Uri packages = Uri.base.resolveUri(new Uri.file(packagesFile)); | 125 Uri packages = Uri.base.resolveUri(new Uri.file(packagesFile)); |
| 126 | 126 |
| 127 await _writeSync( | 127 await _writeSync( |
| 128 librariesJson.toFilePath(), JSON.encode({"libraries": locations})); | 128 librariesJson.toFilePath(), |
| 129 JSON.encode({ |
| 130 mode: {"libraries": locations} |
| 131 })); |
| 129 | 132 |
| 130 var flags = new TargetFlags(); | 133 var flags = new TargetFlags(); |
| 131 var target = forVm | 134 var target = forVm |
| 132 ? new VmFastaTarget(flags) | 135 ? new VmFastaTarget(flags) |
| 133 : (forFlutter ? new FlutterFastaTarget(flags) : new Dart2jsTarget(flags)); | 136 : (forFlutter ? new FlutterFastaTarget(flags) : new Dart2jsTarget(flags)); |
| 134 var platformDeps = | 137 var platformDeps = |
| 135 await compilePlatform(outDirUri, target, packages, platform, outline); | 138 await compilePlatform(outDirUri, target, packages, platform, outline); |
| 136 deps.addAll(platformDeps); | 139 deps.addAll(platformDeps); |
| 137 | 140 |
| 138 if (forVm) { | 141 if (forVm) { |
| 139 // TODO(sigmund): add support for the flutter vmservice_sky as well. | 142 // TODO(sigmund): add support for the flutter vmservice_sky as well. |
| 140 var vmserviceName = 'vmservice_io'; | 143 var vmserviceName = 'vmservice_io'; |
| 141 var base = path.fromUri(Platform.script); | 144 var base = path.fromUri(Platform.script); |
| 142 Uri dartDir = | 145 Uri dartDir = |
| 143 new Uri.directory(path.dirname(path.dirname(path.absolute(base)))); | 146 new Uri.directory(path.dirname(path.dirname(path.absolute(base)))); |
| 147 |
| 148 String vmserviceJson = JSON.encode({ |
| 149 'vm': { |
| 150 "libraries": { |
| 151 '_vmservice': { |
| 152 'path': dartDir.resolve('sdk/lib/vmservice/vmservice.dart').path |
| 153 }, |
| 154 'vmservice_io': { |
| 155 'path': |
| 156 dartDir.resolve('runtime/bin/vmservice/vmservice_io.dart').path |
| 157 }, |
| 158 } |
| 159 } |
| 160 }); |
| 161 Uri vmserviceJsonUri = outDirUri.resolve("lib/vmservice_libraries.json"); |
| 162 await _writeSync(vmserviceJsonUri.toFilePath(), vmserviceJson); |
| 144 var program = await kernelForProgram( | 163 var program = await kernelForProgram( |
| 145 Uri.parse('dart:$vmserviceName'), | 164 Uri.parse('dart:$vmserviceName'), |
| 146 new CompilerOptions() | 165 new CompilerOptions() |
| 147 ..setExitCodeOnProblem = true | 166 ..setExitCodeOnProblem = true |
| 148 // TODO(sigmund): investigate. This should be outline, but it breaks | 167 // TODO(sigmund): investigate. This should be outline, but it breaks |
| 149 // vm-debug tests. Issue #30111 | 168 // vm-debug tests. Issue #30111 |
| 150 ..sdkSummary = platform | 169 ..sdkSummary = platform |
| 151 ..dartLibraries = <String, Uri>{ | 170 ..librariesSpecUri = vmserviceJsonUri |
| 152 '_vmservice': dartDir.resolve('sdk/lib/vmservice/vmservice.dart'), | |
| 153 'vmservice_io': | |
| 154 dartDir.resolve('runtime/bin/vmservice/vmservice_io.dart'), | |
| 155 } | |
| 156 ..packagesFileUri = packages); | 171 ..packagesFileUri = packages); |
| 157 Uri vmserviceUri = outDirUri.resolve('$vmserviceName.dill'); | 172 Uri vmserviceUri = outDirUri.resolve('$vmserviceName.dill'); |
| 158 // TODO(sigmund): remove. This is a workaround because in the VM | 173 // TODO(sigmund): remove. This is a workaround because in the VM |
| 159 // doesn't support loading vmservice if it contains external libraries | 174 // doesn't support loading vmservice if it contains external libraries |
| 160 // (there is an assertion that only fails in debug builds). Issue #30111 | 175 // (there is an assertion that only fails in debug builds). Issue #30111 |
| 161 program.libraries.forEach((l) => l.isExternal = false); | 176 program.libraries.forEach((l) => l.isExternal = false); |
| 162 await writeProgramToFile(program, vmserviceUri); | 177 await writeProgramToFile(program, vmserviceUri); |
| 163 } | 178 } |
| 164 | 179 |
| 165 Uri platformFinalLocation = outDirUri.resolve('platform.dill'); | 180 Uri platformFinalLocation = outDirUri.resolve('platform.dill'); |
| (...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 326 _writeSync( | 341 _writeSync( |
| 327 path.join( | 342 path.join( |
| 328 sdkOut, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'), | 343 sdkOut, '_internal', 'sdk_library_metadata', 'lib', 'libraries.dart'), |
| 329 libContents); | 344 libContents); |
| 330 return libContents; | 345 return libContents; |
| 331 } | 346 } |
| 332 | 347 |
| 333 /// Copy internal libraries that are developed outside the sdk folder into the | 348 /// Copy internal libraries that are developed outside the sdk folder into the |
| 334 /// patched_sdk folder. For the VM< this includes files under 'runtime/bin/', | 349 /// patched_sdk folder. For the VM< this includes files under 'runtime/bin/', |
| 335 /// for flutter, this is includes also the ui library. | 350 /// for flutter, this is includes also the ui library. |
| 336 _copyExtraLibraries(String sdkOut, Map<String, String> locations) { | 351 _copyExtraLibraries(String sdkOut, Map<String, Map<String, String>> locations) { |
| 337 if (forDart2js) return; | 352 if (forDart2js) return; |
| 338 var base = path.fromUri(Platform.script); | 353 var base = path.fromUri(Platform.script); |
| 339 var dartDir = path.dirname(path.dirname(path.absolute(base))); | 354 var dartDir = path.dirname(path.dirname(path.absolute(base))); |
| 340 | 355 |
| 341 var builtinLibraryIn = path.join(dartDir, 'runtime', 'bin', 'builtin.dart'); | 356 var builtinLibraryIn = path.join(dartDir, 'runtime', 'bin', 'builtin.dart'); |
| 342 var builtinLibraryOut = path.join(sdkOut, '_builtin', '_builtin.dart'); | 357 var builtinLibraryOut = path.join(sdkOut, '_builtin', '_builtin.dart'); |
| 343 _writeSync(builtinLibraryOut, readInputFile(builtinLibraryIn)); | 358 _writeSync(builtinLibraryOut, readInputFile(builtinLibraryIn)); |
| 344 locations['_builtin'] = path.join('_builtin', '_builtin.dart'); | 359 addLocation(locations, '_builtin', path.join('_builtin', '_builtin.dart')); |
| 345 | 360 |
| 346 if (forFlutter) { | 361 if (forFlutter) { |
| 347 // Flutter repo has this layout: | 362 // Flutter repo has this layout: |
| 348 // engine/src/ | 363 // engine/src/ |
| 349 // dart/ | 364 // dart/ |
| 350 // flutter/ | 365 // flutter/ |
| 351 var srcDir = path.dirname(path.dirname(path.dirname(path.absolute(base)))); | 366 var srcDir = path.dirname(path.dirname(path.dirname(path.absolute(base)))); |
| 352 var uiLibraryInDir = path.join(srcDir, 'flutter', 'lib', 'ui'); | 367 var uiLibraryInDir = path.join(srcDir, 'flutter', 'lib', 'ui'); |
| 353 for (var file in new Directory(uiLibraryInDir).listSync()) { | 368 for (var file in new Directory(uiLibraryInDir).listSync()) { |
| 354 if (!file.path.endsWith('.dart')) continue; | 369 if (!file.path.endsWith('.dart')) continue; |
| 355 var name = path.basename(file.path); | 370 var name = path.basename(file.path); |
| 356 var uiLibraryOut = path.join(sdkOut, 'ui', name); | 371 var uiLibraryOut = path.join(sdkOut, 'ui', name); |
| 357 _writeSync(uiLibraryOut, readInputFile(file.path)); | 372 _writeSync(uiLibraryOut, readInputFile(file.path)); |
| 358 } | 373 } |
| 359 locations['ui'] = 'ui/ui.dart'; | 374 addLocation(locations, 'ui', path.join('ui', 'ui.dart')); |
| 360 | 375 |
| 361 if (!forFlutterRelease) { | 376 if (!forFlutterRelease) { |
| 362 // vmservice should be present unless we build release flavor of Flutter. | 377 // vmservice should be present unless we build release flavor of Flutter. |
| 363 // | 378 // |
| 364 // TODO(dartbug.com/30158): Consider producing separate Flutter | 379 // TODO(dartbug.com/30158): Consider producing separate Flutter |
| 365 // vmservice.dill with these vmservice libraries. | 380 // vmservice.dill with these vmservice libraries. |
| 366 for (var file in ['loader.dart', 'server.dart', 'vmservice_io.dart']) { | 381 for (var file in ['loader.dart', 'server.dart', 'vmservice_io.dart']) { |
| 367 var libraryIn = path.join(dartDir, 'runtime', 'bin', 'vmservice', file); | 382 var libraryIn = path.join(dartDir, 'runtime', 'bin', 'vmservice', file); |
| 368 var libraryOut = path.join(sdkOut, 'vmservice_io', file); | 383 var libraryOut = path.join(sdkOut, 'vmservice_io', file); |
| 369 _writeSync(libraryOut, readInputFile(libraryIn)); | 384 _writeSync(libraryOut, readInputFile(libraryIn)); |
| 370 } | 385 } |
| 371 locations['vmservice_sky'] = | 386 addLocation(locations, 'vmservice_sky', |
| 372 path.join('vmservice_io', 'vmservice_io.dart'); | 387 path.join('vmservice_io', 'vmservice_io.dart')); |
| 373 locations['_vmservice'] = path.join('vmservice', 'vmservice.dart'); | 388 addLocation( |
| 389 locations, '_vmservice', path.join('vmservice', 'vmservice.dart')); |
| 374 } | 390 } |
| 375 } | 391 } |
| 376 } | 392 } |
| 377 | 393 |
| 378 _applyPatch(SdkLibrary library, String sdkLibIn, String patchIn, String sdkOut, | 394 _applyPatch(SdkLibrary library, String sdkLibIn, String patchIn, String sdkOut, |
| 379 Map<String, String> locations) { | 395 Map<String, Map<String, String>> locations) { |
| 380 var libraryOut = path.join(sdkLibIn, library.path); | 396 var libraryOut = path.join(sdkLibIn, library.path); |
| 381 var libraryIn = libraryOut; | 397 var libraryIn = libraryOut; |
| 382 | 398 |
| 383 var libraryFile = getInputFile(libraryIn, canBeMissing: true); | 399 var libraryFile = getInputFile(libraryIn, canBeMissing: true); |
| 384 if (libraryFile != null) { | 400 if (libraryFile != null) { |
| 385 locations[Uri.parse(library.shortName).path] = | 401 addLocation(locations, Uri.parse(library.shortName).path, |
| 386 path.relative(libraryOut, from: sdkLibIn); | 402 path.relative(libraryOut, from: sdkLibIn)); |
| 387 var outPaths = <String>[libraryOut]; | 403 var outPaths = <String>[libraryOut]; |
| 388 var libraryContents = libraryFile.readAsStringSync(); | 404 var libraryContents = libraryFile.readAsStringSync(); |
| 389 | 405 |
| 390 int inputModifyTime = libraryFile.lastModifiedSync().millisecondsSinceEpoch; | 406 int inputModifyTime = libraryFile.lastModifiedSync().millisecondsSinceEpoch; |
| 391 var partFiles = <File>[]; | 407 var partFiles = <File>[]; |
| 392 for (var part in parseDirectives(libraryContents).directives) { | 408 for (var part in parseDirectives(libraryContents).directives) { |
| 393 if (part is PartDirective) { | 409 if (part is PartDirective) { |
| 394 var partPath = part.uri.stringValue; | 410 var partPath = part.uri.stringValue; |
| 395 outPaths.add(path.join(path.dirname(libraryOut), partPath)); | 411 outPaths.add(path.join(path.dirname(libraryOut), partPath)); |
| 396 | 412 |
| (...skipping 402 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 799 if (diff != 0) return diff; | 815 if (diff != 0) return diff; |
| 800 return end - other.end; | 816 return end - other.end; |
| 801 } | 817 } |
| 802 } | 818 } |
| 803 | 819 |
| 804 List<SdkLibrary> _getSdkLibraries(String contents) { | 820 List<SdkLibrary> _getSdkLibraries(String contents) { |
| 805 var libraryBuilder = new SdkLibrariesReader_LibraryBuilder(forDart2js); | 821 var libraryBuilder = new SdkLibrariesReader_LibraryBuilder(forDart2js); |
| 806 parseCompilationUnit(contents).accept(libraryBuilder); | 822 parseCompilationUnit(contents).accept(libraryBuilder); |
| 807 return libraryBuilder.librariesMap.sdkLibraries; | 823 return libraryBuilder.librariesMap.sdkLibraries; |
| 808 } | 824 } |
| 825 |
| 826 void addLocation(Map<String, Map<String, String>> locations, String libraryName, |
| 827 String path) { |
| 828 assert(locations[libraryName] == null); |
| 829 locations[libraryName] = {'path': path}; |
| 830 } |
| OLD | NEW |