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
4 # found in the LICENSE file.
6 """Prints paths between gyp targets.
14 from collections
import deque
19 tools/gyp-explain.py chrome_dll gtest#
23 def GetPath(graph
, fro
, to
):
24 """Given a graph in (node -> list of successor nodes) dictionary format,
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.
27 q
= deque([(fro
, [])])
33 q
.append((d
, path
+ [t
]))
36 def MatchNode(graph
, substring
):
37 """Given a dictionary, returns the key that matches |substring| best. Exits
38 if there's not one single best match."""
41 if substring
in target
:
42 candidates
.append(target
)
45 print 'No targets match "%s"' % substring
47 if len(candidates
) > 1:
48 print 'More than one target matches "%s": %s' % (
49 substring
, ' '.join(candidates
))
55 if sys
.platform
in ['win32', 'cygwin']:
56 print 'The dump_dependency_json gyp generator required for gyp-explain.py'
57 print 'does not support Windows.'
60 # Check that dump.json exists and that it's not too old.
61 dump_json_dirty
= False
63 st
= os
.stat('dump.json')
64 file_age_s
= time
.time() - st
.st_mtime
65 if file_age_s
> 2 * 60 * 60:
66 print 'dump.json is more than 2 hours old.'
67 dump_json_dirty
= True
69 print 'dump.json not found.'
70 dump_json_dirty
= True
74 print ' GYP_GENERATORS=dump_dependency_json build/gyp_chromium'
75 print 'first, then try again.'
78 g
= json
.load(open('dump.json'))
84 fro
= MatchNode(g
, argv
[1])
85 to
= MatchNode(g
, argv
[2])
87 paths
= list(GetPath(g
, fro
, to
))
89 print 'These paths lead from %s to %s:' % (fro
, to
)
91 print ' -> '.join(path
)
93 print 'No paths found from %s to %s.' % (fro
, to
)
96 if __name__
== '__main__':