| 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'; |
| 11 import 'dart:developer' as dev; | 11 import 'dart:developer' as dev; |
| 12 import 'dart:io'; | 12 import 'dart:io'; |
| 13 | 13 |
| 14 import 'package:mojom/src/utils.dart'; | 14 import 'package:mojom/src/utils.dart'; |
| 15 import 'package:path/path.dart' as path; | 15 import 'package:path/path.dart' as path; |
| 16 | 16 |
| 17 part 'mojom_finder.dart'; | 17 part 'mojom_finder.dart'; |
| 18 | 18 |
| 19 const String mojoTestPackage = '_mojo_for_test_only'; |
| 20 |
| 19 class MojomGenerator { | 21 class MojomGenerator { |
| 20 static dev.Counter _genMs; | 22 static dev.Counter _genMs; |
| 21 final bool _errorOnDuplicate; | 23 final bool _errorOnDuplicate; |
| 22 final bool _dryRun; | 24 final bool _dryRun; |
| 23 final bool _force; | 25 final bool _force; |
| 24 final Directory _mojoSdk; | 26 final Directory _mojoSdk; |
| 25 | 27 |
| 26 Map<String, String> _duplicateDetection; | 28 Map<String, String> _duplicateDetection; |
| 27 int _generationMs; | 29 int _generationMs; |
| 28 | 30 |
| (...skipping 125 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 154 | 156 |
| 155 final script = path.join( | 157 final script = path.join( |
| 156 _mojoSdk.path, 'tools', 'bindings', 'mojom_bindings_generator.py'); | 158 _mojoSdk.path, 'tools', 'bindings', 'mojom_bindings_generator.py'); |
| 157 final sdkInc = path.normalize(path.join(_mojoSdk.path, '..', '..')); | 159 final sdkInc = path.normalize(path.join(_mojoSdk.path, '..', '..')); |
| 158 final outputDir = await Directory.systemTemp.createTemp(); | 160 final outputDir = await Directory.systemTemp.createTemp(); |
| 159 try { | 161 try { |
| 160 final output = outputDir.path; | 162 final output = outputDir.path; |
| 161 | 163 |
| 162 final servicesPath = _sniffForMojoServicesInclude(mojom.path); | 164 final servicesPath = _sniffForMojoServicesInclude(mojom.path); |
| 163 | 165 |
| 166 // Force type information to be generated for the test package. |
| 167 // TODO(afandria): Is there a better way to accomplish this goal? |
| 168 // https://github.com/domokit/mojo/issues/641 |
| 169 final generateTypeInfoFlag = packageName == mojoTestPackage ? |
| 170 '--generate-type-info' : '--no-generate-type-info'; |
| 171 |
| 164 final arguments = [ | 172 final arguments = [ |
| 165 '--use_bundled_pylibs', | 173 '--use_bundled_pylibs', |
| 166 '-g', | 174 '-g', |
| 167 'dart', | 175 'dart', |
| 168 '-o', | 176 '-o', |
| 169 output, | 177 output, |
| 170 '-I', | 178 '-I', |
| 171 sdkInc, | 179 sdkInc, |
| 172 '-I', | 180 '-I', |
| 173 importDir.path, | 181 importDir.path, |
| 174 '--no-gen-imports' | 182 '--no-gen-imports', |
| 183 generateTypeInfoFlag |
| 175 ]; | 184 ]; |
| 176 if (servicesPath != null) { | 185 if (servicesPath != null) { |
| 177 arguments.add('-I'); | 186 arguments.add('-I'); |
| 178 arguments.add(servicesPath); | 187 arguments.add(servicesPath); |
| 179 } | 188 } |
| 180 arguments.add(mojom.path); | 189 arguments.add(mojom.path); |
| 181 | 190 |
| 182 log.info('Generating $mojom'); | 191 log.info('Generating $mojom'); |
| 183 log.info('$script ${arguments.join(" ")}'); | 192 log.info('$script ${arguments.join(" ")}'); |
| 184 log.info('dryRun = $_dryRun'); | 193 log.info('dryRun = $_dryRun'); |
| 185 if (!_dryRun) { | 194 if (!_dryRun) { |
| 186 final result = await _runBindingsGeneration(script, arguments); | 195 final result = await _runBindingsGeneration(script, arguments); |
| 187 if (result.exitCode != 0) { | 196 if (result.exitCode != 0) { |
| 188 log.info("bindings generation result = ${result.exitCode}"); | 197 log.info("bindings generation result = ${result.exitCode}"); |
| 189 await outputDir.delete(recursive: true); | 198 await outputDir.delete(recursive: true); |
| 190 throw new GenerationError("$script failed:\n" | 199 throw new GenerationError("$script failed:\n" |
| 191 "code: ${result.exitCode}\n" | 200 "code: ${result.exitCode}\n" |
| 192 "stderr: ${result.stderr}\n" | 201 "stderr: ${result.stderr}\n" |
| 193 "stdout: ${result.stdout}"); | 202 "stdout: ${result.stdout}"); |
| 194 } else { | 203 } else { |
| 195 log.info("bindings generation result = 0"); | 204 log.info("bindings generation result = 0"); |
| 196 } | 205 } |
| 197 | 206 |
| 198 // Generated .mojom.dart is under $output/dart-gen/$PACKAGE/lib/$X | 207 // Generated .mojom.dart is under $output/dart-gen/$PACKAGE/lib/$X |
| 199 // Move $X to |destination|/lib/$X. | 208 // Move $X to |destination|/lib/$X. |
| 200 // Throw an exception if $PACKGE != [packageName]. | 209 // Throw an exception if $PACKAGE != [packageName]. |
| 201 final generatedDirName = path.join(output, 'dart-gen'); | 210 final generatedDirName = path.join(output, 'dart-gen'); |
| 202 final generatedDir = new Directory(generatedDirName); | 211 final generatedDir = new Directory(generatedDirName); |
| 203 log.info("generatedDir= $generatedDir"); | 212 log.info("generatedDir= $generatedDir"); |
| 204 assert(await generatedDir.exists()); | 213 assert(await generatedDir.exists()); |
| 205 await for (var genpack in generatedDir.list()) { | 214 await for (var genpack in generatedDir.list()) { |
| 206 if (genpack is! Directory) continue; | 215 if (genpack is! Directory) continue; |
| 207 log.info("genpack = $genpack"); | 216 log.info("genpack = $genpack"); |
| 208 var libDir = new Directory(path.join(genpack.path, 'lib')); | 217 var libDir = new Directory(path.join(genpack.path, 'lib')); |
| 209 var name = path.relative(genpack.path, from: generatedDirName); | 218 var name = path.relative(genpack.path, from: generatedDirName); |
| 210 log.info("Found generated lib dir: $libDir"); | 219 log.info("Found generated lib dir: $libDir"); |
| (...skipping 226 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 437 '\t$dart $packRoot $scriptPath single -m $mojoSdk -r $root ' | 446 '\t$dart $packRoot $scriptPath single -m $mojoSdk -r $root ' |
| 438 '-p $packagePath $skips'); | 447 '-p $packagePath $skips'); |
| 439 _errors++; | 448 _errors++; |
| 440 return; | 449 return; |
| 441 } | 450 } |
| 442 } | 451 } |
| 443 } | 452 } |
| 444 | 453 |
| 445 bool _shouldSkip(File f) => containsPrefix(f.path, _skip); | 454 bool _shouldSkip(File f) => containsPrefix(f.path, _skip); |
| 446 } | 455 } |
| OLD | NEW |