| #!/usr/bin/env python |
| # 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. |
| |
| """Produces a dot file showing dependency relationships between modules. |
| |
| The dot file contains a text-based representation of a directed graph that |
| explains why given module names were included in a trace_viewer config. |
| |
| Example usage: |
| $ ./why_imported tracing.ui.analysis.analysis_view > ~/analysis_view.dot |
| |
| This can then be converted to a graphical representation with the dot tool: |
| $ dot -Grankdir=LR -Tpng ~/analysis_view.dot -o ~/analysis_view.png |
| """ |
| |
| import os |
| import sys |
| import argparse |
| |
| |
| def Main(): |
| project = tracing_project.TracingProject() |
| |
| parser = argparse.ArgumentParser( |
| usage='%(prog)s <options> moduleNames', epilog=__doc__) |
| parser.add_argument('--config', choices=project.GetConfigNames()) |
| parser.add_argument('module_names', nargs='+') |
| args = parser.parse_args() |
| |
| if args.config: |
| names = [project.GetModuleNameForConfigName(options.config)] |
| vulcanizer = project.CreateVulcanizer() |
| load_sequence = vulcanizer.CalcLoadSequenceForModuleNames(names) |
| else: |
| parser.error('No config specified.') |
| print vulcanizer.GetDominatorGraphForModulesNamed( |
| args.module_names, load_sequence) |
| |
| |
| if __name__ == '__main__': |
| tracing_path = os.path.abspath(os.path.join(os.path.dirname(__file__), |
| os.path.pardir)) |
| sys.path.append(tracing_path) |
| import tracing_project |
| tracing_project.UpdateSysPathIfNeeded() |
| sys.exit(Main()) |