| OLD | NEW |
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 /// This library generates Mojo bindings for a Dart package. | 5 /// This library generates Mojo bindings for a Dart package. |
| 6 | 6 |
| 7 library generate; | 7 library generate; |
| 8 | 8 |
| 9 import 'dart:async'; | 9 import 'dart:async'; |
| 10 import 'dart:convert'; | 10 import 'dart:convert'; |
| (...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 88 oldestModTime = modTime; | 88 oldestModTime = modTime; |
| 89 } | 89 } |
| 90 mojomDartCount++; | 90 mojomDartCount++; |
| 91 } | 91 } |
| 92 return [oldestModTime, mojomDartCount]; | 92 return [oldestModTime, mojomDartCount]; |
| 93 } | 93 } |
| 94 | 94 |
| 95 // Delete .mojom.dart files under [package] that are [olderThanThis]. | 95 // Delete .mojom.dart files under [package] that are [olderThanThis]. |
| 96 _deleteOldMojomDart(Directory package, DateTime olderThanThis) async { | 96 _deleteOldMojomDart(Directory package, DateTime olderThanThis) async { |
| 97 Directory libDir = new Directory(path.join(package.path, 'lib')); | 97 Directory libDir = new Directory(path.join(package.path, 'lib')); |
| 98 assert(await libDir.exists()); | 98 if (!await libDir.exists()) { |
| 99 return; |
| 100 } |
| 99 await for (var file in libDir.list(recursive: true, followLinks: false)) { | 101 await for (var file in libDir.list(recursive: true, followLinks: false)) { |
| 100 if (file is! File) continue; | 102 if (file is! File) continue; |
| 101 if (!isMojomDart(file.path)) continue; | 103 if (!isMojomDart(file.path)) continue; |
| 102 DateTime modTime = (await file.stat()).modified; | 104 DateTime modTime = (await file.stat()).modified; |
| 103 if (modTime.isBefore(olderThanThis)) { | 105 if (modTime.isBefore(olderThanThis)) { |
| 104 log.warning("Deleting stale .mojom.dart: $file"); | 106 log.warning("Deleting stale .mojom.dart: $file"); |
| 105 await file.delete(); | 107 await file.delete(); |
| 106 } | 108 } |
| 107 } | 109 } |
| 108 } | 110 } |
| 109 | 111 |
| 110 /// If the .mojoms file or the newest .mojom is newer than the oldest | 112 /// If the .mojoms file or the newest .mojom is newer than the oldest |
| 111 /// .mojom.dart, then regenerate everything. | 113 /// .mojom.dart, then regenerate everything. |
| 112 bool _shouldRegenerate(DateTime mojomTime, DateTime mojomDartTime) { | 114 bool _shouldRegenerate(DateTime mojomTime, DateTime mojomDartTime) { |
| 113 return (mojomTime == null) || | 115 return (mojomTime == null) || |
| 114 (mojomDartTime == null) || | 116 (mojomDartTime == null) || |
| 115 mojomTime.isAfter(mojomDartTime); | 117 mojomTime.isAfter(mojomDartTime); |
| 116 } | 118 } |
| 117 | 119 |
| 118 _runBindingsGeneration(String script, List<String> arguments) async { | 120 _runBindingsGeneration(String script, List<String> arguments) async { |
| 119 var result; | 121 var result; |
| 120 var stopwatch = new Stopwatch()..start(); | 122 var stopwatch = new Stopwatch()..start(); |
| 121 result = await Process.run(script, arguments); | 123 result = await Process.run(script, arguments); |
| 122 stopwatch.stop(); | 124 stopwatch.stop(); |
| 123 _genMs.value += stopwatch.elapsedMilliseconds; | 125 _genMs.value += stopwatch.elapsedMilliseconds; |
| 124 return result; | 126 return result; |
| 125 } | 127 } |
| 126 | 128 |
| 129 // This is a hack until we can express import paths in .mojom files. |
| 130 // This checks the mojom path for '/mojo/services/' and if found assumes |
| 131 // this mojom needs //mojo/services as an import path when generating |
| 132 // bindings. |
| 133 String _sniffForMojoServicesInclude(String mojomPath) { |
| 134 List<String> pathComponents = path.split(mojomPath); |
| 135 while (pathComponents.length > 2) { |
| 136 int last = pathComponents.length; |
| 137 if ((pathComponents[last - 1] == 'services') && |
| 138 (pathComponents[last - 2] == 'mojo')) { |
| 139 return path.joinAll(pathComponents); |
| 140 } |
| 141 // Remove the last element and try again. |
| 142 pathComponents.removeLast(); |
| 143 } |
| 144 return null; |
| 145 } |
| 146 |
| 127 _generateForMojom(File mojom, Directory importDir, Directory destination, | 147 _generateForMojom(File mojom, Directory importDir, Directory destination, |
| 128 String packageName) async { | 148 String packageName) async { |
| 129 if (!isMojom(mojom.path)) return; | 149 if (!isMojom(mojom.path)) return; |
| 130 log.info("_generateForMojom($mojom)"); | 150 log.info("_generateForMojom($mojom)"); |
| 131 | 151 |
| 132 final script = path.join( | 152 final script = path.join( |
| 133 _mojoSdk.path, 'tools', 'bindings', 'mojom_bindings_generator.py'); | 153 _mojoSdk.path, 'tools', 'bindings', 'mojom_bindings_generator.py'); |
| 134 final sdkInc = path.normalize(path.join(_mojoSdk.path, '..', '..')); | 154 final sdkInc = path.normalize(path.join(_mojoSdk.path, '..', '..')); |
| 135 final outputDir = await destination.createTemp(); | 155 final outputDir = await destination.createTemp(); |
| 136 final output = outputDir.path; | 156 final output = outputDir.path; |
| 157 |
| 158 final servicesPath = _sniffForMojoServicesInclude(mojom.path); |
| 159 |
| 137 final arguments = [ | 160 final arguments = [ |
| 138 '--use_bundled_pylibs', | 161 '--use_bundled_pylibs', |
| 139 '-g', | 162 '-g', |
| 140 'dart', | 163 'dart', |
| 141 '-o', | 164 '-o', |
| 142 output, | 165 output, |
| 143 // TODO(zra): Are other include paths needed? | |
| 144 '-I', | 166 '-I', |
| 145 sdkInc, | 167 sdkInc, |
| 146 '-I', | 168 '-I', |
| 147 importDir.path, | 169 importDir.path |
| 148 mojom.path | |
| 149 ]; | 170 ]; |
| 171 if (servicesPath != null) { |
| 172 arguments.add('-I'); |
| 173 arguments.add(servicesPath); |
| 174 } |
| 175 arguments.add(mojom.path); |
| 150 | 176 |
| 151 log.info('Generating $mojom'); | 177 log.info('Generating $mojom'); |
| 152 log.info('$script ${arguments.join(" ")}'); | 178 log.info('$script ${arguments.join(" ")}'); |
| 153 log.info('dryRun = $_dryRun'); | 179 log.info('dryRun = $_dryRun'); |
| 154 if (!_dryRun) { | 180 if (!_dryRun) { |
| 155 final result = await _runBindingsGeneration(script, arguments); | 181 final result = await _runBindingsGeneration(script, arguments); |
| 156 if (result.exitCode != 0) { | 182 if (result.exitCode != 0) { |
| 157 log.info("bindings generation result = ${result.exitCode}"); | 183 log.info("bindings generation result = ${result.exitCode}"); |
| 158 await outputDir.delete(recursive: true); | 184 await outputDir.delete(recursive: true); |
| 159 throw new GenerationError("$script failed:\n" | 185 throw new GenerationError("$script failed:\n" |
| 160 "code: ${result.exitCode}\n" | 186 "code: ${result.exitCode}\n" |
| 161 "stderr: ${result.stderr}\n" | 187 "stderr: ${result.stderr}\n" |
| 162 "stdout: ${result.stdout}"); | 188 "stdout: ${result.stdout}"); |
| 163 } else { | 189 } else { |
| 164 log.info("bindings generation result = 0"); | 190 log.info("bindings generation result = 0"); |
| 165 } | 191 } |
| 166 | 192 |
| 167 // Generated .mojom.dart is under $output/dart-pkg/$PACKAGE/lib/$X | 193 // Generated .mojom.dart is under $output/dart-gen/$PACKAGE/lib/$X |
| 168 // Move $X to |destination|/lib/$X. | 194 // Move $X to |destination|/lib/$X. |
| 169 // Throw an exception if $PACKGE != [packageName]. | 195 // Throw an exception if $PACKGE != [packageName]. |
| 170 final generatedDirName = path.join(output, 'dart-pkg'); | 196 final generatedDirName = path.join(output, 'dart-gen'); |
| 171 final generatedDir = new Directory(generatedDirName); | 197 final generatedDir = new Directory(generatedDirName); |
| 172 log.info("generatedDir= $generatedDir"); | 198 log.info("generatedDir= $generatedDir"); |
| 173 assert(await generatedDir.exists()); | 199 assert(await generatedDir.exists()); |
| 174 await for (var genpack in generatedDir.list()) { | 200 await for (var genpack in generatedDir.list()) { |
| 175 if (genpack is! Directory) continue; | 201 if (genpack is! Directory) continue; |
| 176 log.info("genpack = $genpack"); | 202 log.info("genpack = $genpack"); |
| 177 var libDir = new Directory(path.join(genpack.path, 'lib')); | 203 var libDir = new Directory(path.join(genpack.path, 'lib')); |
| 178 var name = path.relative(genpack.path, from: generatedDirName); | 204 var name = path.relative(genpack.path, from: generatedDirName); |
| 179 log.info("Found generated lib dir: $libDir"); | 205 log.info("Found generated lib dir: $libDir"); |
| 180 | 206 |
| (...skipping 224 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 405 '\t$dart $packRoot $scriptPath single -m $mojoSdk -r $root ' | 431 '\t$dart $packRoot $scriptPath single -m $mojoSdk -r $root ' |
| 406 '-p $packagePath $skips'); | 432 '-p $packagePath $skips'); |
| 407 _errors++; | 433 _errors++; |
| 408 return; | 434 return; |
| 409 } | 435 } |
| 410 } | 436 } |
| 411 } | 437 } |
| 412 | 438 |
| 413 bool _shouldSkip(File f) => containsPrefix(f.path, _skip); | 439 bool _shouldSkip(File f) => containsPrefix(f.path, _skip); |
| 414 } | 440 } |
| OLD | NEW |