Home | History | Annotate | Line # | Download | only in header-tools
      1  1.1  mrg #! /usr/bin/python2
      2  1.1  mrg import os.path
      3  1.1  mrg import sys
      4  1.1  mrg import shlex
      5  1.1  mrg import re
      6  1.1  mrg 
      7  1.1  mrg from headerutils import *
      8  1.1  mrg 
      9  1.1  mrg 
     10  1.1  mrg tabstop = 2
     11  1.1  mrg padding = "                                                                  "
     12  1.1  mrg seen = { }
     13  1.1  mrg output = list()
     14  1.1  mrg summary = list()
     15  1.1  mrg sawcore = False
     16  1.1  mrg 
     17  1.1  mrg # list of headers to emphasize
     18  1.1  mrg highlight = list ()
     19  1.1  mrg 
     20  1.1  mrg bld_dir = ""
     21  1.1  mrg # search path for headers
     22  1.1  mrg incl_dirs = ["../include", "../libcpp/include", "common", "c-family", "c", "cp", "config" ]
     23  1.1  mrg # extra search paths to look in *after* the directory the source file is in. 
     24  1.1  mrg 
     25  1.1  mrg # append (1) to the end of the first line which includes INC in list INC.
     26  1.1  mrg def append_1 (output, inc):
     27  1.1  mrg   for n,t in enumerate (output):
     28  1.1  mrg     idx = t.find(inc)
     29  1.1  mrg     if idx != -1:
     30  1.1  mrg       eos = idx + len (inc)
     31  1.1  mrg       t = t[:eos] + "  (1)" + t[eos+1:]
     32  1.1  mrg       output[n] = t
     33  1.1  mrg       return
     34  1.1  mrg 
     35  1.1  mrg # These headers show up as duplicates in rtl.h due to conditional code arund the includes
     36  1.1  mrg rtl_core = [ "machmode.h" , "signop.h" , "wide-int.h" , "double-int.h" , "real.h" , "fixed-value.h" , "statistics.h" , "vec.h" , "hash-table.h" , "hash-set.h" , "input.h" , "is-a.h" ]
     37  1.1  mrg 
     38  1.1  mrg def find_include_data (inc):
     39  1.1  mrg   global sawcore
     40  1.1  mrg   for x in incl_dirs:
     41  1.1  mrg     nm = x+"/"+inc
     42  1.1  mrg     if os.path.exists (nm):
     43  1.1  mrg       info = find_unique_include_list (nm)
     44  1.1  mrg       # rtl.h mimics coretypes for GENERATOR FILES, remove if coretypes.h seen.
     45  1.1  mrg       if inc == "coretypes.h":
     46  1.1  mrg         sawcore = True
     47  1.1  mrg       elif inc  == "rtl.h" and sawcore:
     48  1.1  mrg         for i in rtl_core:
     49  1.1  mrg           if i in info:
     50  1.1  mrg             info.remove (i)
     51  1.1  mrg       return info
     52  1.1  mrg   return list()
     53  1.1  mrg 
     54  1.1  mrg def process_include (inc, indent):
     55  1.1  mrg   if inc[-2:] != ".h":
     56  1.1  mrg     return
     57  1.1  mrg   bname  = os.path.basename (inc)
     58  1.1  mrg   if bname in highlight:
     59  1.1  mrg     arrow = "                <<-------"
     60  1.1  mrg     if bname not in summary:
     61  1.1  mrg       summary.append (bname)
     62  1.1  mrg   else:
     63  1.1  mrg     arrow = ""
     64  1.1  mrg   if seen.get(inc) == None:
     65  1.1  mrg     seen[inc] = 1
     66  1.1  mrg     output.append (padding[:indent*tabstop] + bname + arrow)
     67  1.1  mrg     info = find_include_data (inc)
     68  1.1  mrg     for y in info:
     69  1.1  mrg       process_include (y, indent+1)
     70  1.1  mrg   else:
     71  1.1  mrg     seen[inc] += 1
     72  1.1  mrg     if (seen[inc] == 2):
     73  1.1  mrg       append_1(output, inc)
     74  1.1  mrg     output.append (padding[:indent*tabstop] + bname + "  ("+str(seen[inc])+")" + arrow)
     75  1.1  mrg 
     76  1.1  mrg     
     77  1.1  mrg 
     78  1.1  mrg extradir = list()
     79  1.1  mrg usage = False
     80  1.1  mrg src = list()
     81  1.1  mrg 
     82  1.1  mrg for x in sys.argv[1:]:
     83  1.1  mrg   if x[0:2] == "-i":
     84  1.1  mrg     bld = x[2:]
     85  1.1  mrg     extradir.append (bld)
     86  1.1  mrg   elif x[0:2] == "-s":
     87  1.1  mrg     highlight.append (os.path.basename (x[2:]))
     88  1.1  mrg   elif x[0:2] == "-h":
     89  1.1  mrg     usage = True
     90  1.1  mrg   else:
     91  1.1  mrg     src.append (x)
     92  1.1  mrg 
     93  1.1  mrg if len(src) != 1:
     94  1.1  mrg   usage = True
     95  1.1  mrg elif not os.path.exists (src[0]):
     96  1.1  mrg   print src[0] + ": Requested source file does not exist.\n"
     97  1.1  mrg   usage = True
     98  1.1  mrg 
     99  1.1  mrg if usage:
    100  1.1  mrg   print "show-headers [-idir] [-sfilen] file1 "
    101  1.1  mrg   print " "
    102  1.1  mrg   print " Show a hierarchical visual format how many times each header file"
    103  1.1  mrg   print " is included in a source file.  Should be run from the source directory"
    104  1.1  mrg   print " files from find-include-depends"
    105  1.1  mrg   print "      -s : search for a header, and point it out."
    106  1.1  mrg   print "      -i : Specifies additonal directories to search for includes."
    107  1.1  mrg   sys.exit(0)
    108  1.1  mrg 
    109  1.1  mrg 
    110  1.1  mrg 
    111  1.1  mrg if extradir:
    112  1.1  mrg   incl_dirs = extradir + incl_dirs;
    113  1.1  mrg 
    114  1.1  mrg blddir = find_gcc_bld_dir ("../..")
    115  1.1  mrg 
    116  1.1  mrg if blddir:
    117  1.1  mrg   print "Using build directory: " + blddir
    118  1.1  mrg   incl_dirs.insert (0, blddir)
    119  1.1  mrg else:
    120  1.1  mrg   print "Could not find a build directory, better results if you specify one with -i"
    121  1.1  mrg 
    122  1.1  mrg # search path is now ".", blddir, extradirs_from_-i, built_in_incl_dirs
    123  1.1  mrg incl_dirs.insert (0, ".")
    124  1.1  mrg 
    125  1.1  mrg # if source is in a subdirectory, prepend the subdirectory to the search list
    126  1.1  mrg x = src[0]
    127  1.1  mrg srcpath = os.path.dirname(x)
    128  1.1  mrg if srcpath:
    129  1.1  mrg   incl_dirs.insert (0, srcpath)
    130  1.1  mrg 
    131  1.1  mrg output = list()
    132  1.1  mrg sawcore = False
    133  1.1  mrg 
    134  1.1  mrg data = open (x).read().splitlines()
    135  1.1  mrg for line in data:
    136  1.1  mrg   d = find_pound_include (line, True, True)
    137  1.1  mrg   if d and d[-2:] == ".h":
    138  1.1  mrg     process_include (d, 1)
    139  1.1  mrg 
    140  1.1  mrg print "\n" + x
    141  1.1  mrg for line in output:
    142  1.1  mrg   print line
    143  1.1  mrg 
    144  1.1  mrg if highlight:
    145  1.1  mrg   print " "
    146  1.1  mrg   for h in summary:
    147  1.1  mrg     print h + " is included by source file."
    148  1.1  mrg   for h in highlight:
    149  1.1  mrg     if h not in summary:
    150  1.1  mrg       print h + " is not included by source file."
    151  1.1  mrg 
    152