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