| Index: mojo/public/dart/mojom/lib/src/generate.dart
|
| diff --git a/mojo/public/dart/mojom/lib/src/generate.dart b/mojo/public/dart/mojom/lib/src/generate.dart
|
| deleted file mode 100644
|
| index 5657bd9fe5f8372245c20bfef7165620bb5313e8..0000000000000000000000000000000000000000
|
| --- a/mojo/public/dart/mojom/lib/src/generate.dart
|
| +++ /dev/null
|
| @@ -1,414 +0,0 @@
|
| -// Copyright 2015 The Chromium Authors. All rights reserved.
|
| -// Use of this source code is governed by a BSD-style license that can be
|
| -// found in the LICENSE file.
|
| -
|
| -/// This library generates Mojo bindings for a Dart package.
|
| -
|
| -library generate;
|
| -
|
| -import 'dart:async';
|
| -import 'dart:convert';
|
| -import 'dart:developer' as dev;
|
| -import 'dart:io';
|
| -
|
| -import 'package:mojom/src/utils.dart';
|
| -import 'package:path/path.dart' as path;
|
| -
|
| -part 'mojom_finder.dart';
|
| -
|
| -class MojomGenerator {
|
| - static dev.Counter _genMs;
|
| - final bool _errorOnDuplicate;
|
| - final bool _dryRun;
|
| - final Directory _mojoSdk;
|
| -
|
| - Map<String, String> _duplicateDetection;
|
| - int _generationMs;
|
| -
|
| - MojomGenerator(this._mojoSdk,
|
| - {bool errorOnDuplicate: true, bool profile: false, bool dryRun: false})
|
| - : _errorOnDuplicate = errorOnDuplicate,
|
| - _dryRun = dryRun,
|
| - _generationMs = 0,
|
| - _duplicateDetection = new Map<String, String>() {
|
| - if (_genMs == null) {
|
| - _genMs = new dev.Counter("mojom generation",
|
| - "Time spent waiting for bindings generation script in ms.");
|
| - dev.Metrics.register(_genMs);
|
| - }
|
| - }
|
| -
|
| - generate(PackageInfo info) async {
|
| - // Count the .mojom files, and find the modification time of the most
|
| - // recently modified one.
|
| - int mojomCount = info.mojomFiles.length;
|
| - DateTime newestMojomTime;
|
| - for (File mojom in info.mojomFiles) {
|
| - DateTime mojomTime = await getModificationTime(mojom);
|
| - if ((newestMojomTime == null) || newestMojomTime.isBefore(mojomTime)) {
|
| - newestMojomTime = mojomTime;
|
| - }
|
| - }
|
| -
|
| - // Count the .mojom.dart files, and find the modification time of the
|
| - // least recently modified one.
|
| - List mojomDartInfo = await _findOldestMojomDart(info.packageDir);
|
| - DateTime oldestMojomDartTime = null;
|
| - int mojomDartCount = 0;
|
| - if (mojomDartInfo != null) {
|
| - oldestMojomDartTime = mojomDartInfo[0];
|
| - mojomDartCount = mojomDartInfo[1];
|
| - }
|
| -
|
| - // If we don't have enough .mojom.dart files, or if a .mojom file is
|
| - // newer than the oldest .mojom.dart file, then regenerate.
|
| - if ((mojomDartCount < mojomCount) ||
|
| - _shouldRegenerate(newestMojomTime, oldestMojomDartTime)) {
|
| - for (File mojom in info.mojomFiles) {
|
| - await _generateForMojom(
|
| - mojom, info.importDir, info.packageDir, info.name);
|
| - }
|
| - // Delete any .mojom.dart files that are still older than mojomTime.
|
| - await _deleteOldMojomDart(info.packageDir, newestMojomTime);
|
| - }
|
| - }
|
| -
|
| - /// Under [package]/lib, returns the oldest modification time for a
|
| - /// .mojom.dart file.
|
| - _findOldestMojomDart(Directory package) async {
|
| - int mojomDartCount = 0;
|
| - DateTime oldestModTime;
|
| - Directory libDir = new Directory(path.join(package.path, 'lib'));
|
| - if (!await libDir.exists()) return null;
|
| - await for (var file in libDir.list(recursive: true, followLinks: false)) {
|
| - if (file is! File) continue;
|
| - if (!isMojomDart(file.path)) continue;
|
| - DateTime modTime = (await file.stat()).modified;
|
| - if ((oldestModTime == null) || oldestModTime.isAfter(modTime)) {
|
| - oldestModTime = modTime;
|
| - }
|
| - mojomDartCount++;
|
| - }
|
| - return [oldestModTime, mojomDartCount];
|
| - }
|
| -
|
| - // Delete .mojom.dart files under [package] that are [olderThanThis].
|
| - _deleteOldMojomDart(Directory package, DateTime olderThanThis) async {
|
| - Directory libDir = new Directory(path.join(package.path, 'lib'));
|
| - assert(await libDir.exists());
|
| - await for (var file in libDir.list(recursive: true, followLinks: false)) {
|
| - if (file is! File) continue;
|
| - if (!isMojomDart(file.path)) continue;
|
| - DateTime modTime = (await file.stat()).modified;
|
| - if (modTime.isBefore(olderThanThis)) {
|
| - log.warning("Deleting stale .mojom.dart: $file");
|
| - await file.delete();
|
| - }
|
| - }
|
| - }
|
| -
|
| - /// If the .mojoms file or the newest .mojom is newer than the oldest
|
| - /// .mojom.dart, then regenerate everything.
|
| - bool _shouldRegenerate(DateTime mojomTime, DateTime mojomDartTime) {
|
| - return (mojomTime == null) ||
|
| - (mojomDartTime == null) ||
|
| - mojomTime.isAfter(mojomDartTime);
|
| - }
|
| -
|
| - _runBindingsGeneration(String script, List<String> arguments) async {
|
| - var result;
|
| - var stopwatch = new Stopwatch()..start();
|
| - result = await Process.run(script, arguments);
|
| - stopwatch.stop();
|
| - _genMs.value += stopwatch.elapsedMilliseconds;
|
| - return result;
|
| - }
|
| -
|
| - _generateForMojom(File mojom, Directory importDir, Directory destination,
|
| - String packageName) async {
|
| - if (!isMojom(mojom.path)) return;
|
| - log.info("_generateForMojom($mojom)");
|
| -
|
| - final script = path.join(
|
| - _mojoSdk.path, 'tools', 'bindings', 'mojom_bindings_generator.py');
|
| - final sdkInc = path.normalize(path.join(_mojoSdk.path, '..', '..'));
|
| - final outputDir = await destination.createTemp();
|
| - final output = outputDir.path;
|
| - final arguments = [
|
| - '--use_bundled_pylibs',
|
| - '-g',
|
| - 'dart',
|
| - '-o',
|
| - output,
|
| - // TODO(zra): Are other include paths needed?
|
| - '-I',
|
| - sdkInc,
|
| - '-I',
|
| - importDir.path,
|
| - mojom.path
|
| - ];
|
| -
|
| - log.info('Generating $mojom');
|
| - log.info('$script ${arguments.join(" ")}');
|
| - log.info('dryRun = $_dryRun');
|
| - if (!_dryRun) {
|
| - final result = await _runBindingsGeneration(script, arguments);
|
| - if (result.exitCode != 0) {
|
| - log.info("bindings generation result = ${result.exitCode}");
|
| - await outputDir.delete(recursive: true);
|
| - throw new GenerationError("$script failed:\n"
|
| - "code: ${result.exitCode}\n"
|
| - "stderr: ${result.stderr}\n"
|
| - "stdout: ${result.stdout}");
|
| - } else {
|
| - log.info("bindings generation result = 0");
|
| - }
|
| -
|
| - // Generated .mojom.dart is under $output/dart-pkg/$PACKAGE/lib/$X
|
| - // Move $X to |destination|/lib/$X.
|
| - // Throw an exception if $PACKGE != [packageName].
|
| - final generatedDirName = path.join(output, 'dart-pkg');
|
| - final generatedDir = new Directory(generatedDirName);
|
| - log.info("generatedDir= $generatedDir");
|
| - assert(await generatedDir.exists());
|
| - await for (var genpack in generatedDir.list()) {
|
| - if (genpack is! Directory) continue;
|
| - log.info("genpack = $genpack");
|
| - var libDir = new Directory(path.join(genpack.path, 'lib'));
|
| - var name = path.relative(genpack.path, from: generatedDirName);
|
| - log.info("Found generated lib dir: $libDir");
|
| -
|
| - if (packageName != name) {
|
| - await outputDir.delete(recursive: true);
|
| - throw new GenerationError(
|
| - "Tried to generate for package $name in package $packageName");
|
| - }
|
| -
|
| - var copyDest = new Directory(path.join(destination.path, 'lib'));
|
| - log.info("Copy $libDir to $copyDest");
|
| - await _copyBindings(copyDest, libDir);
|
| - }
|
| -
|
| - await outputDir.delete(recursive: true);
|
| - }
|
| - }
|
| -
|
| - /// Searches for .mojom.dart files under [sourceDir] and copies them to
|
| - /// [destDir].
|
| - _copyBindings(Directory destDir, Directory sourceDir) async {
|
| - var sourceList = sourceDir.list(recursive: true, followLinks: false);
|
| - await for (var mojom in sourceList) {
|
| - if (mojom is! File) continue;
|
| - if (!isMojomDart(mojom.path)) continue;
|
| - log.info("Found $mojom");
|
| -
|
| - final relative = path.relative(mojom.path, from: sourceDir.path);
|
| - final dest = path.join(destDir.path, relative);
|
| - final destDirectory = new Directory(path.dirname(dest));
|
| -
|
| - if (_errorOnDuplicate && _duplicateDetection.containsKey(dest)) {
|
| - String original = _duplicateDetection[dest];
|
| - throw new GenerationError(
|
| - 'Conflict: Both ${original} and ${mojom.path} supply ${dest}');
|
| - }
|
| - _duplicateDetection[dest] = mojom.path;
|
| -
|
| - log.info('Copying $mojom to $dest');
|
| - if (!_dryRun) {
|
| - final File source = new File(mojom.path);
|
| - final File destFile = new File(dest);
|
| - if (await destFile.exists()) {
|
| - await destFile.delete();
|
| - }
|
| - log.info("Ensuring $destDirectory exists");
|
| - await destDirectory.create(recursive: true);
|
| - await source.copy(dest);
|
| - await markFileReadOnly(dest);
|
| - }
|
| - }
|
| - }
|
| -}
|
| -
|
| -/// Given the location of the Mojo SDK and a root directory from which to begin
|
| -/// a search. Find .mojom files, and generate bindings for the relevant
|
| -/// packages.
|
| -class TreeGenerator {
|
| - final MojomGenerator _generator;
|
| - final Directory _mojoSdk;
|
| - final Directory _mojomRootDir;
|
| - final Directory _dartRootDir;
|
| - final List<String> _skip;
|
| - final bool _dryRun;
|
| -
|
| - Set<String> _processedPackages;
|
| -
|
| - int errors;
|
| -
|
| - TreeGenerator(
|
| - Directory mojoSdk, this._mojomRootDir, this._dartRootDir, this._skip,
|
| - {bool dryRun: false})
|
| - : _mojoSdk = mojoSdk,
|
| - _dryRun = dryRun,
|
| - _generator = new MojomGenerator(mojoSdk, dryRun: dryRun),
|
| - _processedPackages = new Set<String>(),
|
| - errors = 0;
|
| -
|
| - generate() async {
|
| - var mojomFinder = new MojomFinder(_mojomRootDir, _dartRootDir, _skip);
|
| - List<PackageInfo> packageInfos = await mojomFinder.find();
|
| - for (PackageInfo info in packageInfos) {
|
| - await _runGenerate(info);
|
| - }
|
| - }
|
| -
|
| - _runGenerate(PackageInfo info) async {
|
| - try {
|
| - log.info('Generating bindings for ${info.name}');
|
| - await _generator.generate(info);
|
| - log.info('Done generating bindings for ${info.name}');
|
| - } on GenerationError catch (e) {
|
| - log.severe('Bindings generation failed for package ${info.name}: $e');
|
| - errors += 1;
|
| - }
|
| - }
|
| -
|
| - bool _shouldSkip(File f) => containsPrefix(f.path, _skip);
|
| -}
|
| -
|
| -/// Given the root of a directory tree to check, and the root of a directory
|
| -/// tree containing the canonical generated bindings, checks that the files
|
| -/// match, and recommends actions to take in case they don't. The canonical
|
| -/// directory should contain a subdirectory for each package that might be
|
| -/// encountered while traversing the directory tree being checked.
|
| -class TreeChecker {
|
| - final Directory _mojoSdk;
|
| - final Directory _mojomRootDir;
|
| - final Directory _dartRootDir;
|
| - final Directory _canonical;
|
| - final List<String> _skip;
|
| - int _errors;
|
| -
|
| - TreeChecker(this._mojoSdk, this._mojomRootDir, this._dartRootDir,
|
| - this._canonical, this._skip)
|
| - : _errors = 0;
|
| -
|
| - check() async {
|
| - // Generate missing .mojoms files if needed.
|
| - var mojomFinder = new MojomFinder(_mojomRootDir, _dartRootDir, _skip);
|
| - List<PackageInfo> packageInfos = await mojomFinder.find();
|
| -
|
| - for (PackageInfo info in packageInfos) {
|
| - log.info("Checking package at ${info.packageDir}");
|
| - await _checkAll(info.packageDir);
|
| - await _checkSame(info.packageDir);
|
| - }
|
| -
|
| - // If there were multiple mismatches, explain how to regenerate the bindings
|
| - // for the whole tree.
|
| - if (_errors > 1) {
|
| - String dart = makeRelative(Platform.executable);
|
| - String packRoot = (Platform.packageRoot == "")
|
| - ? ""
|
| - : "-p " + makeRelative(Platform.packageRoot);
|
| - String scriptPath = makeRelative(path.fromUri(Platform.script));
|
| - String mojoSdk = makeRelative(_mojoSdk.path);
|
| - String root = makeRelative(_mojomRootDir.path);
|
| - String dartRoot = makeRelative(_dartRootDir.path);
|
| - String skips = _skip.map((s) => "-s " + makeRelative(s)).join(" ");
|
| - stderr.writeln('It looks like there were multiple problems. '
|
| - 'You can run the following command to regenerate bindings for your '
|
| - 'whole tree:\n'
|
| - '\t$dart $packRoot $scriptPath gen -m $mojoSdk -r $root -o $dartRoot '
|
| - '$skips');
|
| - }
|
| - }
|
| -
|
| - int get errors => _errors;
|
| -
|
| - // Check that the files are the same.
|
| - _checkSame(Directory package) async {
|
| - Directory libDir = new Directory(path.join(package.path, 'lib'));
|
| - await for (var entry in libDir.list(recursive: true, followLinks: false)) {
|
| - if (entry is! File) continue;
|
| - if (!isMojomDart(entry.path)) continue;
|
| -
|
| - String relPath = path.relative(entry.path, from: package.parent.path);
|
| - File canonicalFile = new File(path.join(_canonical.path, relPath));
|
| - if (!await canonicalFile.exists()) {
|
| - log.info("No canonical file for $entry");
|
| - continue;
|
| - }
|
| -
|
| - log.info("Comparing $entry with $canonicalFile");
|
| - int fileComparison = await compareFiles(entry, canonicalFile);
|
| - if (fileComparison != 0) {
|
| - String entryPath = makeRelative(entry.path);
|
| - String canonicalPath = makeRelative(canonicalFile.path);
|
| - if (fileComparison > 0) {
|
| - stderr.writeln('The generated file:\n\t$entryPath\n'
|
| - 'is newer thanthe canonical file\n\t$canonicalPath\n,'
|
| - 'and they are different. Regenerate canonical files?');
|
| - } else {
|
| - String dart = makeRelative(Platform.executable);
|
| - String packRoot = (Platform.packageRoot == "")
|
| - ? ""
|
| - : "-p " + makeRelative(Platform.packageRoot);
|
| - String root = makeRelative(_mojomRootDir.path);
|
| - String packagePath = makeRelative(package.path);
|
| - String scriptPath = makeRelative(path.fromUri(Platform.script));
|
| - String mojoSdk = makeRelative(_mojoSdk.path);
|
| - String skips = _skip.map((s) => "-s " + makeRelative(s)).join(" ");
|
| - stderr.writeln('For the package: $packagePath\n'
|
| - 'The generated file:\n\t$entryPath\n'
|
| - 'is older than the canonical file:\n\t$canonicalPath\n'
|
| - 'and they are different. Regenerate by running:\n'
|
| - '\t$dart $packRoot $scriptPath single -m $mojoSdk -r $root '
|
| - '-p $packagePath $skips');
|
| - }
|
| - _errors++;
|
| - return;
|
| - }
|
| - }
|
| - }
|
| -
|
| - // Check that every .mojom.dart in the canonical package is also in the
|
| - // package we are checking.
|
| - _checkAll(Directory package) async {
|
| - String packageName = path.relative(package.path, from: package.parent.path);
|
| - String canonicalPackagePath =
|
| - path.join(_canonical.path, packageName, 'lib');
|
| - Directory canonicalPackage = new Directory(canonicalPackagePath);
|
| - if (!await canonicalPackage.exists()) return;
|
| -
|
| - var canonicalPackages =
|
| - canonicalPackage.list(recursive: true, followLinks: false);
|
| - await for (var entry in canonicalPackages) {
|
| - if (entry is! File) continue;
|
| - if (!isMojomDart(entry.path)) continue;
|
| -
|
| - String relPath = path.relative(entry.path, from: canonicalPackage.path);
|
| - File genFile = new File(path.join(package.path, 'lib', relPath));
|
| - log.info("Checking that $genFile exists");
|
| - if (!await genFile.exists()) {
|
| - String dart = makeRelative(Platform.executable);
|
| - String packRoot = (Platform.packageRoot == "")
|
| - ? ""
|
| - : "-p " + makeRelative(Platform.packageRoot);
|
| - String root = makeRelative(_mojomRootDir.path);
|
| - String genFilePath = makeRelative(genFile.path);
|
| - String packagePath = makeRelative(package.path);
|
| - String scriptPath = makeRelative(path.fromUri(Platform.script));
|
| - String mojoSdk = makeRelative(_mojoSdk.path);
|
| - String skips = _skip.map((s) => "-s " + makeRelative(s)).join(" ");
|
| - stderr.writeln('The generated file:\n\t$genFilePath\n'
|
| - 'is needed but does not exist. Run the command\n'
|
| - '\t$dart $packRoot $scriptPath single -m $mojoSdk -r $root '
|
| - '-p $packagePath $skips');
|
| - _errors++;
|
| - return;
|
| - }
|
| - }
|
| - }
|
| -
|
| - bool _shouldSkip(File f) => containsPrefix(f.path, _skip);
|
| -}
|
|
|