annotate contrib/header-tools/graph-include-web @ 111:04ced10e8804

gcc 7
author kono
date Fri, 27 Oct 2017 22:46:09 +0900
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
111
kono
parents:
diff changeset
1 #! /usr/bin/python2
kono
parents:
diff changeset
2 import os.path
kono
parents:
diff changeset
3 import sys
kono
parents:
diff changeset
4 import shlex
kono
parents:
diff changeset
5 import re
kono
parents:
diff changeset
6
kono
parents:
diff changeset
7 from headerutils import *
kono
parents:
diff changeset
8
kono
parents:
diff changeset
9 def pretty_name (name):
kono
parents:
diff changeset
10 return name.replace(".","_").replace("-","_").replace("/","_").replace("+","_");
kono
parents:
diff changeset
11
kono
parents:
diff changeset
12
kono
parents:
diff changeset
13 include_files = list()
kono
parents:
diff changeset
14 edges = 0
kono
parents:
diff changeset
15 one_c = False
kono
parents:
diff changeset
16 clink = list()
kono
parents:
diff changeset
17 noterm = False
kono
parents:
diff changeset
18
kono
parents:
diff changeset
19 def build_inclist (output, filen):
kono
parents:
diff changeset
20 global edges
kono
parents:
diff changeset
21 global one_c
kono
parents:
diff changeset
22 global clink
kono
parents:
diff changeset
23 global noterm
kono
parents:
diff changeset
24 inc = build_include_list (filen)
kono
parents:
diff changeset
25 if one_c and filen[-2:] == ".c":
kono
parents:
diff changeset
26 pn = "all_c"
kono
parents:
diff changeset
27 else:
kono
parents:
diff changeset
28 pn = pretty_name(filen)
kono
parents:
diff changeset
29 for nm in inc:
kono
parents:
diff changeset
30 if pn == "all_c":
kono
parents:
diff changeset
31 if nm not in clink:
kono
parents:
diff changeset
32 if len(build_include_list(nm)) != 0 or not noterm:
kono
parents:
diff changeset
33 output.write (pretty_name(nm) + " -> " + pn + ";\n")
kono
parents:
diff changeset
34 edges = edges + 1
kono
parents:
diff changeset
35 if nm not in include_files:
kono
parents:
diff changeset
36 include_files.append(nm)
kono
parents:
diff changeset
37 clink.append (nm)
kono
parents:
diff changeset
38 else:
kono
parents:
diff changeset
39 output.write (pretty_name(nm) + " -> " + pn + ";\n")
kono
parents:
diff changeset
40 edges = edges + 1
kono
parents:
diff changeset
41 if nm not in include_files:
kono
parents:
diff changeset
42 include_files.append(nm)
kono
parents:
diff changeset
43 return len(inc) == 0
kono
parents:
diff changeset
44
kono
parents:
diff changeset
45 dotname = "graph.dot"
kono
parents:
diff changeset
46 graphname = "graph.png"
kono
parents:
diff changeset
47
kono
parents:
diff changeset
48 def build_dot_file (file_list):
kono
parents:
diff changeset
49 global one_c
kono
parents:
diff changeset
50 output = open(dotname, "w")
kono
parents:
diff changeset
51 output.write ("digraph incweb {\n");
kono
parents:
diff changeset
52 if one_c:
kono
parents:
diff changeset
53 output.write ("all_c [shape=box];\n");
kono
parents:
diff changeset
54 for x in file_list:
kono
parents:
diff changeset
55 if x[-2:] == ".h":
kono
parents:
diff changeset
56 include_files.append (x)
kono
parents:
diff changeset
57 elif os.path.exists (x):
kono
parents:
diff changeset
58 build_inclist (output, x)
kono
parents:
diff changeset
59 if not one_c:
kono
parents:
diff changeset
60 output.write (pretty_name (x) + "[shape=box];\n")
kono
parents:
diff changeset
61
kono
parents:
diff changeset
62 for x in include_files:
kono
parents:
diff changeset
63 term = build_inclist (output, x)
kono
parents:
diff changeset
64 if term:
kono
parents:
diff changeset
65 output.write (pretty_name(x) + " [style=filled];\n")
kono
parents:
diff changeset
66
kono
parents:
diff changeset
67 output.write ("}\n");
kono
parents:
diff changeset
68
kono
parents:
diff changeset
69
kono
parents:
diff changeset
70 files = list()
kono
parents:
diff changeset
71 dohelp = False
kono
parents:
diff changeset
72 edge_thresh = 0
kono
parents:
diff changeset
73 for arg in sys.argv[1:]:
kono
parents:
diff changeset
74 if arg[0:2] == "-o":
kono
parents:
diff changeset
75 dotname = arg[2:]+".dot"
kono
parents:
diff changeset
76 graphname = arg[2:]+".png"
kono
parents:
diff changeset
77 elif arg[0:2] == "-h":
kono
parents:
diff changeset
78 dohelp = True
kono
parents:
diff changeset
79 elif arg[0:2] == "-a":
kono
parents:
diff changeset
80 one_c = True
kono
parents:
diff changeset
81 if arg[0:3] == "-at":
kono
parents:
diff changeset
82 noterm = True
kono
parents:
diff changeset
83 elif arg[0:2] == "-f":
kono
parents:
diff changeset
84 if not os.path.exists (arg[2:]):
kono
parents:
diff changeset
85 print "Option " + arg +" doesn't specify a proper file"
kono
parents:
diff changeset
86 dohelp = True
kono
parents:
diff changeset
87 else:
kono
parents:
diff changeset
88 sfile = open (arg[2:], "r")
kono
parents:
diff changeset
89 srcdata = sfile.readlines()
kono
parents:
diff changeset
90 sfile.close()
kono
parents:
diff changeset
91 for x in srcdata:
kono
parents:
diff changeset
92 files.append(x.rstrip())
kono
parents:
diff changeset
93 elif arg[0:2] == "-n":
kono
parents:
diff changeset
94 edge_thresh = int (arg[2:])
kono
parents:
diff changeset
95 elif arg[0:1] == "-":
kono
parents:
diff changeset
96 print "Unrecognized option " + arg
kono
parents:
diff changeset
97 dohelp = True
kono
parents:
diff changeset
98 else:
kono
parents:
diff changeset
99 files.append (arg)
kono
parents:
diff changeset
100
kono
parents:
diff changeset
101 if len(sys.argv) == 1:
kono
parents:
diff changeset
102 dohelp = True
kono
parents:
diff changeset
103
kono
parents:
diff changeset
104 if dohelp:
kono
parents:
diff changeset
105 print "Generates a graph of the include web for specified files."
kono
parents:
diff changeset
106 print "Usage: [-finput_file] [-h] [-ooutput] [file1 ... [filen]]"
kono
parents:
diff changeset
107 print " -finput_file : Input file containing a list of files to process."
kono
parents:
diff changeset
108 print " -ooutput : Specifies output to output.dot and output.png."
kono
parents:
diff changeset
109 print " defaults to graph.dot and graph.png."
kono
parents:
diff changeset
110 print " -nnum : Specifies the # of edges beyond which sfdp is invoked. def=0."
kono
parents:
diff changeset
111 print " -a : Aggregate all .c files to 1 file. Shows only include web."
kono
parents:
diff changeset
112 print " -at : Aggregate, but don't include terminal.h to .c links."
kono
parents:
diff changeset
113 print " -h : Print this help."
kono
parents:
diff changeset
114 else:
kono
parents:
diff changeset
115 print files
kono
parents:
diff changeset
116 build_dot_file (files)
kono
parents:
diff changeset
117 if edges > edge_thresh:
kono
parents:
diff changeset
118 os.system ("sfdp -Tpng " + dotname + " -o" + graphname)
kono
parents:
diff changeset
119 else:
kono
parents:
diff changeset
120 os.system ("dot -Tpng " + dotname + " -o" + graphname)
kono
parents:
diff changeset
121
kono
parents:
diff changeset
122