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 |