github.com/hwaf/hwaf@v0.0.0-20140814122253-5465f73b20f1/py-hwaftools/orch/dot.py (about) 1 #!/usr/bin/env python 2 ''' 3 Write a dot file which shows the waf dependency graph. 4 ''' 5 from .graph import Graph 6 import waflib.Logs as msg 7 8 def make(bld): 9 ''' 10 Return a graph of the task dependencies 11 ''' 12 13 # Explicit posting of the top level task generators, which are 14 # features, is needed so they can run an produce their (sub) task 15 # generators 16 #for tg in bld.get_all_task_gen(): 17 # tg.post() 18 19 for tg in bld.get_all_task_gen(): 20 msg.debug('dot: tg = %s, "%s"' % (tg, '", "'.join(sorted(tg.__dict__.keys())))) 21 msg.debug('dot: name:%s - source:%s -> target:%s, depends_on:%s' % \ 22 (tg.name, tg.source, tg.target, 23 getattr(tg, 'depends_on', 'none'))) 24 25 26 maingraph = Graph('worch', rankdir='LR') 27 28 tsk2graph = dict() 29 pkg2features = dict() 30 for igroup, group in enumerate(bld.groups): 31 number = 1 + igroup 32 group_name = 'Group%d' % number 33 group_graph = maingraph.add_subgraph(group_name, label=group_name) 34 msg.debug('dot: Group %s:%d' % (group_name, id(group_graph))) 35 for thing in group: 36 if hasattr(thing, 'package_name'): 37 msg.debug('dot: skipping: %s %s %s' % (thing.name, thing.package_name, thing.features)) 38 pkg, feats = thing.name.split('_',1) 39 pkg2features[pkg] = feats 40 continue 41 42 name = thing.name 43 already = tsk2graph.get(name) 44 if already: 45 assert already == group_graph, (name, already, group_graph) 46 else: 47 tsk2graph[name] = group_graph 48 msg.debug('dot: node %s -> group %s' % (name, group_name)) 49 50 for tg in bld.get_all_task_gen(): 51 52 # this is a feature 53 if hasattr(tg, 'package_name'): 54 # ignore this 55 continue 56 57 package_name = tg.name.split('_',1)[0] 58 package_files_name = package_name + 'files' 59 60 group_graph = tsk2graph[tg.name] 61 pkg_graph = group_graph.add_subgraph(package_name, label = package_name) 62 file_graph = group_graph.add_subgraph(package_files_name, label = package_name + ' files') 63 64 pkg_graph.add_node(tg.name, shape='ellipse') 65 66 if hasattr(tg,'depends_on') and tg.depends_on: 67 deps = tg.depends_on 68 if isinstance(deps, type('')): 69 deps = [tg.depends_on] 70 for dep in deps: 71 maingraph.add_edge(dep, tg.name, style='bold') 72 73 if hasattr(tg, 'source') and tg.source: 74 fnames = tg.source 75 msg.debug('dot: source: %s' % str(fnames)) 76 if not isinstance(fnames, list): 77 fnames = [fnames] 78 for fname in fnames: 79 fname = fname.nice_path() 80 file_graph.add_node(fname, shape='box') 81 maingraph.add_edge(fname, tg.name) 82 83 if hasattr(tg, 'target') and tg.target: 84 fnames = tg.target 85 msg.debug('dot: target: %s' % str(fnames)) 86 if not isinstance(fnames, list): 87 fnames = [fnames] 88 for fname in fnames: 89 fname = fname.nice_path() 90 file_graph.add_node(fname, package_files_name, shape='box') 91 maingraph.add_edge(tg.name, fname) 92 continue 93 94 # loop over groups 95 return maingraph 96 97 98 def write(bld, fname): 99 graph = make(bld) 100 with open(fname, 'w') as fp: 101 fp.write(str(graph)) 102