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

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: docstring 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):
63 """Generates an input file for graphviz's dot program."""
64 prefixes = [os.path.commonprefix(path) for path in paths]
65 prefix = os.path.commonprefix(prefixes)
66 print '// Build with "dot -Tpng -ooutput.png this_file.dot"'
67 # "strict" collapses common paths.
68 print 'strict digraph {'
69 for path in paths:
70 print (' -> '.join(EscapeForDot(item[len(prefix):]) for item in path)), ';'
71 print '}'
72
73
54 def Main(argv): 74 def Main(argv):
55 # Check that dump.json exists and that it's not too old. 75 # Check that dump.json exists and that it's not too old.
56 dump_json_dirty = False 76 dump_json_dirty = False
57 try: 77 try:
58 st = os.stat('dump.json') 78 st = os.stat('dump.json')
59 file_age_s = time.time() - st.st_mtime 79 file_age_s = time.time() - st.st_mtime
60 if file_age_s > 2 * 60 * 60: 80 if file_age_s > 2 * 60 * 60:
61 print 'dump.json is more than 2 hours old.' 81 print 'dump.json is more than 2 hours old.'
62 dump_json_dirty = True 82 dump_json_dirty = True
63 except OSError: 83 except OSError:
64 print 'dump.json not found.' 84 print 'dump.json not found.'
65 dump_json_dirty = True 85 dump_json_dirty = True
66 86
67 if dump_json_dirty: 87 if dump_json_dirty:
68 print 'Run' 88 print 'Run'
69 print ' GYP_GENERATORS=dump_dependency_json build/gyp_chromium' 89 print ' GYP_GENERATORS=dump_dependency_json build/gyp_chromium'
70 print 'first, then try again.' 90 print 'first, then try again.'
71 sys.exit(1) 91 sys.exit(1)
72 92
73 g = json.load(open('dump.json')) 93 g = json.load(open('dump.json'))
74 94
75 if len(argv) != 3: 95 if len(argv) not in (3, 4):
76 usage() 96 usage()
77 sys.exit(1) 97 sys.exit(1)
78 98
99 generate_dot = argv[1] == '--dot'
100 if generate_dot:
101 argv.pop(1)
102
79 fro = MatchNode(g, argv[1]) 103 fro = MatchNode(g, argv[1])
80 to = MatchNode(g, argv[2]) 104 to = MatchNode(g, argv[2])
81 105
82 paths = list(GetPath(g, fro, to)) 106 paths = list(GetPath(g, fro, to))
83 if len(paths) > 0: 107 if len(paths) > 0:
84 print 'These paths lead from %s to %s:' % (fro, to) 108 if generate_dot:
85 for path in paths: 109 GenerateDot(fro, to, paths)
86 print ' -> '.join(path) 110 else:
111 print 'These paths lead from %s to %s:' % (fro, to)
112 for path in paths:
113 print ' -> '.join(path)
87 else: 114 else:
88 print 'No paths found from %s to %s.' % (fro, to) 115 print 'No paths found from %s to %s.' % (fro, to)
89 116
90 117
91 if __name__ == '__main__': 118 if __name__ == '__main__':
92 Main(sys.argv) 119 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