From 3cbfd31f9dc8d8eeb8e08f134557b56a20f1cd77 Mon Sep 17 00:00:00 2001
From: Rene Milk <rene.milk@uni-muenster.de>
Date: Tue, 28 Aug 2012 17:44:05 +0200
Subject: [PATCH] [cmake] dependency stuff cleanup

---
 cmake/DuneUtils.cmake   |  2 +-
 cmake/dependencyinfo.py | 14 +++++++++-----
 cmake/sourcetree.py     | 27 +++++++++++++++++----------
 3 files changed, 27 insertions(+), 16 deletions(-)

diff --git a/cmake/DuneUtils.cmake b/cmake/DuneUtils.cmake
index da3b28a18..7a93cf318 100644
--- a/cmake/DuneUtils.cmake
+++ b/cmake/DuneUtils.cmake
@@ -59,7 +59,7 @@ MACRO( DEPENDENCYCHECK )
         SET( TEST_NAME "dependenycheck_${fn}")
         TO_LIST_SPACES( MY_CXX_FLAGS TEST_NAME_FLAGS )
         SET(XARGS ${TEST_NAME_FLAGS} -DHAVE_CONFIG_H -H -c ${HEADER} -w)
-        ADD_CUSTOM_TARGET( ${TEST_NAME} ${CMAKE_CURRENT_SOURCE_DIR}/../dune-stuff/cmake/dependencyinfo.py ${CMAKE_CXX_COMPILER} ${XARGS} ${CMAKE_CURRENT_SOURCE_DIR} ${fn}.dep)
+        ADD_CUSTOM_TARGET( ${TEST_NAME} + ${CMAKE_CURRENT_SOURCE_DIR}/../dune-stuff/cmake/dependencyinfo.py ${CMAKE_CXX_COMPILER} ${XARGS} ${CMAKE_CURRENT_SOURCE_DIR} ${fn}.dep)
         add_dependencies( dependenycheck ${TEST_NAME} )
     ENDFOREACH( HEADER )
 ENDMACRO( DEPENDENCYCHECK )
diff --git a/cmake/dependencyinfo.py b/cmake/dependencyinfo.py
index 8ffaa962a..95e44d0cf 100755
--- a/cmake/dependencyinfo.py
+++ b/cmake/dependencyinfo.py
@@ -8,14 +8,18 @@ from pygraph.algorithms.cycles import find_cycle
 
 fn = sys.argv[-1]
 strip_base = sys.argv[-2]
+compiler_cmd = sys.argv[1:-3]
+
 with open(fn,'wb') as out:
-    p = subprocess.Popen(sys.argv[1:-3], shell=False, stdout=out, stderr=out)
+    p = subprocess.Popen(compiler_cmd, shell=False, stdout=out, stderr=out)
     errcode = p.wait()
-print('STRIP %s'%strip_base)
-graph = sourcetree.parse_file(strip_base, fn)
+    if errcode != 0:
+        sys.exit(errcode)
+
+(root,graph) = sourcetree.parse_file(strip_base, fn, maxdepth=100)
 cycle_nodes = find_cycle(graph)
 if cycle_nodes:
     with open(fn+'.cycles','wb') as out:
-       pp = pprint.PrettyPrinter()
-       pp.pprint(cycle_nodes, out)
+       pprint.pprint(cycle_nodes, out)
 
+sourcetree.render_graph(sourcetree.parse_file(strip_base, fn, maxdepth=3))
diff --git a/cmake/sourcetree.py b/cmake/sourcetree.py
index c23c634f9..09ab2f670 100644
--- a/cmake/sourcetree.py
+++ b/cmake/sourcetree.py
@@ -3,20 +3,23 @@
 import pygraph
 from pygraph.classes.graph import graph
 from pygraph.readwrite.dot import write
+from pygraph.algorithms.searching import breadth_first_search
+from pygraph.classes.digraph import digraph
 import pygraphviz as gv
 from itertools import takewhile
 
 is_dot = '.'.__eq__
 
-        
 class Node(object):
-    def __init__(self, title, graph, **attrs):
+    def __init__(self, title, graph, attrs=[]):
         self.title = title
         self.parent = None
         self.children = []
         self.graph = graph
         try:
             graph.add_node(title,attrs)
+        #gets triggered on adding an already existing node
+        #which we can ignore
         except pygraph.classes.exceptions.AdditionError:
             pass
 
@@ -51,22 +54,26 @@ class Inserter(object):
         self.node = newNode
         
 def parse_file(strip_base, outfile, maxdepth=3):
-    root = outfile[:-len('.dep')].replace(strip_base, '')
+    root = outfile[:-len('.dep')].replace(strip_base, '').strip()
     gr = graph()
-    tree = Node('ROOT__' + root, gr, color='red')
+    tree = Node(root, gr, [('color','red')])
     inserter = Inserter(tree,0)
     with open(outfile, 'rb') as gcc_out:
         for line in gcc_out:
             dots = len(list(takewhile(is_dot, line)))
-            if dots < 1 or dots > 3:
+            if dots < 1 or dots > maxdepth:
                 continue
-            fn = line[dots+1:].replace(strip_base, '')
-            #fn
-            print fn
+            fn = line[dots+1:].replace(strip_base, '').strip()
             inserter(fn, dots, gr)
-    dot = write(gr)
+    return (root, gr)
+
+def render_graph((root, gr)):
+    st, order = breadth_first_search(gr, root=root)
+    gst = digraph()
+    gst.add_spanning_tree(st)
+    dot = write(gst)
     G = gv.AGraph(dot, strict=False,directed=True)
     prog = 'dot'
     G.layout(prog=prog)
-    G.draw('%s.png'%outfile, prog=prog)
+    G.draw('include_graph_%s.png'%root, prog=prog)
     return gr
\ No newline at end of file
-- 
GitLab