Index: tools/win/split_link/graph_dependencies.py |
diff --git a/tools/win/split_link/graph_dependencies.py b/tools/win/split_link/graph_dependencies.py |
new file mode 100644 |
index 0000000000000000000000000000000000000000..f95e076d392fe39d51122f4ef0ed8c7b3803c6c7 |
--- /dev/null |
+++ b/tools/win/split_link/graph_dependencies.py |
@@ -0,0 +1,89 @@ |
+# Copyright 2013 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. |
+ |
+import os |
+import shutil |
+import subprocess |
+import sys |
+ |
+ |
+BASE_DIR = os.path.dirname(os.path.abspath(__file__)) |
+ |
+ |
+def main(): |
+ if len(sys.argv) != 2: |
+ print 'usage: %s <output.html>' % sys.argv[0] |
+ return 1 |
+ env = os.environ.copy() |
+ env['GYP_GENERATORS'] = 'dump_dependency_json' |
+ print 'Dumping dependencies...' |
+ popen = subprocess.Popen( |
+ ['python', 'build/gyp_chromium'], |
+ shell=True, env=env) |
+ popen.communicate() |
+ if popen.returncode != 0: |
+ return popen.returncode |
+ print 'Finding problems...' |
+ popen = subprocess.Popen( |
+ ['python', 'tools/gyp-explain.py', '--dot', |
+ 'chrome.gyp:browser#', 'core.gyp:webcore#'], |
+ stdout=subprocess.PIPE, |
+ shell=True) |
+ out, _ = popen.communicate() |
+ if popen.returncode != 0: |
+ return popen.returncode |
+ |
+ # Break into pairs to uniq to make graph less of a mess. |
+ print 'Simplifying...' |
+ deduplicated = set() |
+ lines = out.splitlines()[2:-1] |
+ for line in lines: |
+ line = line.strip('\r\n ;') |
+ pairs = line.split(' -> ') |
+ for i in range(len(pairs) - 1): |
+ deduplicated.add('%s -> %s;' % (pairs[i], pairs[i + 1])) |
+ graph = 'strict digraph {\n' + '\n'.join(sorted(deduplicated)) + '\n}' |
+ |
+ print 'Writing report to %s...' % sys.argv[1] |
+ path_count = len(out.splitlines()) |
+ with open(os.path.join(BASE_DIR, 'viz.js', 'viz.js')) as f: |
+ viz_js = f.read() |
+ with open(sys.argv[1], 'w') as f: |
+ f.write(PREFIX % path_count) |
+ f.write(graph) |
+ f.write(SUFFIX % viz_js) |
+ print 'Done.' |
+ |
+ |
+PREFIX = r'''<!DOCTYPE html> |
+<html> |
+ <head> |
+ <meta charset="utf-8"> |
+ <title>Undesirable Dependencies</title> |
+ </head> |
+ <body> |
+ <h1>Undesirable Dependencies</h1> |
+<h2>browser → webcore</h2> |
+<h3>%d paths</h3> |
+ <script type="text/vnd.graphviz" id="graph"> |
+''' |
+ |
+ |
+SUFFIX = r''' |
+ </script> |
+ <script>%s</script> |
+ <div id="output">Rendering...</div> |
+ <script> |
+ setTimeout(function() { |
+ document.getElementById("output").innerHTML = |
+ Viz(document.getElementById("graph").innerHTML, "svg"); |
+ }, 1); |
+ </script> |
+ </body> |
+</html> |
+''' |
+ |
+ |
+if __name__ == '__main__': |
+ sys.exit(main()) |