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 |