mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			123 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
			
		
		
	
	
			123 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			Python
		
	
	
		
			Executable File
		
	
	
| #! /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)
 | |
| 
 | |
| 
 |