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

Side by Side Diff: tools/gyp-explain.py

Issue 15026004: Add --dot option to gyp-explain (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: use os.path.commonprefix Created 7 years, 7 months 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 #!/usr/bin/env python 1 #!/usr/bin/env python
2 # Copyright (c) 2012 The Chromium Authors. All rights reserved. 2 # Copyright (c) 2012 The Chromium Authors. All rights reserved.
3 # Use of this source code is governed by a BSD-style license that can be 3 # Use of this source code is governed by a BSD-style license that can be
4 # found in the LICENSE file. 4 # found in the LICENSE file.
5 5
6 """Prints paths between gyp targets. 6 """Prints paths between gyp targets.
7 """ 7 """
8 8
9 import json 9 import json
10 import os 10 import os
11 import sys 11 import sys
12 import time 12 import time
13 13
14 from collections import deque 14 from collections import deque
15 15
16 def usage(): 16 def usage():
17 print """\ 17 print """\
18 Usage: 18 Usage:
19 tools/gyp-explain.py chrome_dll# gtest# 19 tools/gyp-explain.py [--dot] chrome_dll# gtest#
20 """ 20 """
21 21
22 22
23 def GetPath(graph, fro, to): 23 def GetPath(graph, fro, to):
24 """Given a graph in (node -> list of successor nodes) dictionary format, 24 """Given a graph in (node -> list of successor nodes) dictionary format,
25 yields all paths from |fro| to |to|, starting with the shortest.""" 25 yields all paths from |fro| to |to|, starting with the shortest."""
26 # Storing full paths in the queue is a bit wasteful, but good enough for this. 26 # Storing full paths in the queue is a bit wasteful, but good enough for this.
27 q = deque([(fro, [])]) 27 q = deque([(fro, [])])
28 while q: 28 while q:
29 t, path = q.popleft() 29 t, path = q.popleft()
(...skipping 14 matching lines...) Expand all
44 if not candidates: 44 if not candidates:
45 print 'No targets match "%s"' % substring 45 print 'No targets match "%s"' % substring
46 sys.exit(1) 46 sys.exit(1)
47 if len(candidates) > 1: 47 if len(candidates) > 1:
48 print 'More than one target matches "%s": %s' % ( 48 print 'More than one target matches "%s": %s' % (
49 substring, ' '.join(candidates)) 49 substring, ' '.join(candidates))
50 sys.exit(1) 50 sys.exit(1)
51 return candidates[0] 51 return candidates[0]
52 52
53 53
54 def EscapeForDot(string):
55 suffix = '#target'
56 if string.endswith(suffix):
57 string = string[:-len(suffix)]
58 string = string.replace('\\', '\\\\')
59 return '"' + string + '"'
60
61
62 def GenerateDot(fro, to, paths):
Nico 2013/05/07 21:37:00 """Generates an input file for graphviz's dot prog
63 prefixes = [os.path.commonprefix(path) for path in paths]
64 prefix = os.path.commonprefix(prefixes)
65 print '// Build with "dot -Tpng -ooutput.png this_file.dot"'
66 # "strict" collapses common paths.
67 print 'strict digraph {'
68 for path in paths:
69 print (' -> '.join(EscapeForDot(item[len(prefix):]) for item in path)), ';'
70 print '}'
71
72
54 def Main(argv): 73 def Main(argv):
55 # Check that dump.json exists and that it's not too old. 74 # Check that dump.json exists and that it's not too old.
56 dump_json_dirty = False 75 dump_json_dirty = False
57 try: 76 try:
58 st = os.stat('dump.json') 77 st = os.stat('dump.json')
59 file_age_s = time.time() - st.st_mtime 78 file_age_s = time.time() - st.st_mtime
60 if file_age_s > 2 * 60 * 60: 79 if file_age_s > 2 * 60 * 60:
61 print 'dump.json is more than 2 hours old.' 80 print 'dump.json is more than 2 hours old.'
62 dump_json_dirty = True 81 dump_json_dirty = True
63 except OSError: 82 except OSError:
64 print 'dump.json not found.' 83 print 'dump.json not found.'
65 dump_json_dirty = True 84 dump_json_dirty = True
66 85
67 if dump_json_dirty: 86 if dump_json_dirty:
68 print 'Run' 87 print 'Run'
69 print ' GYP_GENERATORS=dump_dependency_json build/gyp_chromium' 88 print ' GYP_GENERATORS=dump_dependency_json build/gyp_chromium'
70 print 'first, then try again.' 89 print 'first, then try again.'
71 sys.exit(1) 90 sys.exit(1)
72 91
73 g = json.load(open('dump.json')) 92 g = json.load(open('dump.json'))
74 93
75 if len(argv) != 3: 94 if len(argv) not in (3, 4):
76 usage() 95 usage()
77 sys.exit(1) 96 sys.exit(1)
78 97
98 generate_dot = argv[1] == '--dot'
99 if generate_dot:
100 argv.pop(1)
101
79 fro = MatchNode(g, argv[1]) 102 fro = MatchNode(g, argv[1])
80 to = MatchNode(g, argv[2]) 103 to = MatchNode(g, argv[2])
81 104
82 paths = list(GetPath(g, fro, to)) 105 paths = list(GetPath(g, fro, to))
83 if len(paths) > 0: 106 if len(paths) > 0:
84 print 'These paths lead from %s to %s:' % (fro, to) 107 if generate_dot:
85 for path in paths: 108 GenerateDot(fro, to, paths)
86 print ' -> '.join(path) 109 else:
110 print 'These paths lead from %s to %s:' % (fro, to)
111 for path in paths:
112 print ' -> '.join(path)
87 else: 113 else:
88 print 'No paths found from %s to %s.' % (fro, to) 114 print 'No paths found from %s to %s.' % (fro, to)
89 115
90 116
91 if __name__ == '__main__': 117 if __name__ == '__main__':
92 Main(sys.argv) 118 Main(sys.argv)
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698