Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(61)

Side by Side Diff: mojo/dart/packages/mojom/lib/src/generate.dart

Issue 1449203002: Check in generated Dart bindings and add presubmit script (Closed) Base URL: git@github.com:domokit/mojo.git@master
Patch Set: Created 5 years, 1 month ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « mojo/dart/packages/mojom/.gitignore ('k') | mojo/dart/tools/presubmit/check_mojom_dart.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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 }
OLDNEW
« no previous file with comments | « mojo/dart/packages/mojom/.gitignore ('k') | mojo/dart/tools/presubmit/check_mojom_dart.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698