Mercurial > hg > CbC > CbC_gcc
diff contrib/header-tools/graph-include-web @ 111:04ced10e8804
gcc 7
author | kono |
---|---|
date | Fri, 27 Oct 2017 22:46:09 +0900 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/contrib/header-tools/graph-include-web Fri Oct 27 22:46:09 2017 +0900 @@ -0,0 +1,122 @@ +#! /usr/bin/python2 +import os.path +import sys +import shlex +import re + +from headerutils import * + +def pretty_name (name): + return name.replace(".","_").replace("-","_").replace("/","_").replace("+","_"); + + +include_files = list() +edges = 0 +one_c = False +clink = list() +noterm = False + +def build_inclist (output, filen): + global edges + global one_c + global clink + global noterm + inc = build_include_list (filen) + if one_c and filen[-2:] == ".c": + pn = "all_c" + else: + pn = pretty_name(filen) + for nm in inc: + if pn == "all_c": + if nm not in clink: + if len(build_include_list(nm)) != 0 or not noterm: + output.write (pretty_name(nm) + " -> " + pn + ";\n") + edges = edges + 1 + if nm not in include_files: + include_files.append(nm) + clink.append (nm) + else: + output.write (pretty_name(nm) + " -> " + pn + ";\n") + edges = edges + 1 + if nm not in include_files: + include_files.append(nm) + return len(inc) == 0 + +dotname = "graph.dot" +graphname = "graph.png" + +def build_dot_file (file_list): + global one_c + output = open(dotname, "w") + output.write ("digraph incweb {\n"); + if one_c: + output.write ("all_c [shape=box];\n"); + for x in file_list: + if x[-2:] == ".h": + include_files.append (x) + elif os.path.exists (x): + build_inclist (output, x) + if not one_c: + output.write (pretty_name (x) + "[shape=box];\n") + + for x in include_files: + term = build_inclist (output, x) + if term: + output.write (pretty_name(x) + " [style=filled];\n") + + output.write ("}\n"); + + +files = list() +dohelp = False +edge_thresh = 0 +for arg in sys.argv[1:]: + if arg[0:2] == "-o": + dotname = arg[2:]+".dot" + graphname = arg[2:]+".png" + elif arg[0:2] == "-h": + dohelp = True + elif arg[0:2] == "-a": + one_c = True + if arg[0:3] == "-at": + noterm = True + elif arg[0:2] == "-f": + if not os.path.exists (arg[2:]): + print "Option " + arg +" doesn't specify a proper file" + dohelp = True + else: + sfile = open (arg[2:], "r") + srcdata = sfile.readlines() + sfile.close() + for x in srcdata: + files.append(x.rstrip()) + elif arg[0:2] == "-n": + edge_thresh = int (arg[2:]) + elif arg[0:1] == "-": + print "Unrecognized option " + arg + dohelp = True + else: + files.append (arg) + +if len(sys.argv) == 1: + dohelp = True + +if dohelp: + print "Generates a graph of the include web for specified files." + print "Usage: [-finput_file] [-h] [-ooutput] [file1 ... [filen]]" + print " -finput_file : Input file containing a list of files to process." + print " -ooutput : Specifies output to output.dot and output.png." + print " defaults to graph.dot and graph.png." + print " -nnum : Specifies the # of edges beyond which sfdp is invoked. def=0." + print " -a : Aggregate all .c files to 1 file. Shows only include web." + print " -at : Aggregate, but don't include terminal.h to .c links." + print " -h : Print this help." +else: + print files + build_dot_file (files) + if edges > edge_thresh: + os.system ("sfdp -Tpng " + dotname + " -o" + graphname) + else: + os.system ("dot -Tpng " + dotname + " -o" + graphname) + +