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