File: check_deps.py

package info (click to toggle)
ghostscript 10.05.1~dfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 93,508 kB
  • sloc: ansic: 908,895; python: 7,676; cpp: 6,534; cs: 6,457; sh: 6,168; java: 4,028; perl: 2,373; tcl: 1,639; makefile: 529; awk: 66; yacc: 18
file content (133 lines) | stat: -rwxr-xr-x 4,263 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#!/usr/bin/python

import os, string

# not used may use later
def get_line_directives_table(file):
    # not intended to be portable or useful outside of gs universe.
    CPP_FLAGS="-I../gs/base/ -I../gs/psi -I../pl/ -I../pcl -I../pxl -I../main/obj -DDEBUG"
    CPP="gcc -E"
    CPP_COMMAND=CPP + " " + CPP_FLAGS + " " + file
    CPP_IN=os.popen(CPP_COMMAND, 'r')
    lines = []
    while (1):
        line = CPP_IN.readline()
        if not line:
            break;
        # chop newline
        line = line[:-1]

        # check again for line since we might have chopped the only
        # character.  check for lines starting with # and ending with
        # 1 (see cpp docs).
        
        if line and line[0] == "#" and line[-1] == "1":
            # second field 1:-1 leaves out enclosing quotes.
            lines.append(os.path.basename(string.splitfields(line)[2][1:-1]))
    for line in lines:
        print line

def get_includes(file, skip_system_files=1):
    includes = []
    for line in fileinput.input(file):
        if line[0:len("#include")] == "#include":
            myin = string.splitfields(line)[1]
            if skip_system_files and myin[0] == '<' and myin[-1] == '>':
                print "skipping system header " + myin
                continue
            else:
                includes.append(myin[1:-1])
    return includes
            
def find_all_files(dir, pattern):
    lines=[]
    FIND_COMMAND = "find " + dir + " -name " + pattern
    for line in os.popen(FIND_COMMAND).readlines():
        lines.append(line[:-1])
    return lines
    

import fileinput


def find_target(makefile, target):
    parsed_target = []
    parsing_target = 0
    fp = open(makefile)
    for line in fp.readlines():
        if line.find(target) >= 0 and not parsing_target:
            parsing_target = 1
            parsed_target.append(line)
            continue
        if parsing_target:
            if line[0] not in string.whitespace:
                break
            parsed_target.append(line)
    fp.close()
    return makefile, parsed_target
        
# return the filename and the targets from all the makefiles that
# contain the target.
def find_targets(target, makefiles):
    # target is a c file - want .$(OBJ) file
    target = target[:-1] + "$(OBJ):"
    target = os.path.basename(target)
    parsed_targets = []
    # list of lines
    for line in fileinput.input(makefiles):
        if line.find(')' + target) >= 0:
            parsed_targets.append(find_target(fileinput.filename(), target))
    fileinput.close()
    return parsed_targets

import re

def get_deps_from_target(target):
    # find .h files sans definition.
    reg=re.compile('\.h')
    for line in target:
        for h in reg.findall(line):
            print "naked .h found in " + target[0][0:target[0].index(":")]
    # not quite right.
    reg=re.compile('[A-Za-z0-9]+_+h')
    deps=[]
    for line in target:
        targ_list=reg.findall(line)
        for targ in targ_list:
            deps.append(targ)
    return deps

def compare_lists(c_file, makefile, from_makefile, from_source):
    canon_from_source = []
    for x in from_source:
        canon_from_source.append(x.replace('.', '_'))

#    print canon_from_source
#    print from_makefile

    for mline in from_makefile:
        if mline not in canon_from_source:
            print mline + " from " + makefile + " not in " + c_file
    for sline in canon_from_source:
        if sline not in from_makefile:
            print sline + " from " + c_file + " not in " + makefile
    
if __name__ == '__main__':
#    headers=get_line_directives_table("../pcl/pcjob.c")
#    print headers
     C_FILES=find_all_files("../", "\\*.c")
     MAKEFILES=find_all_files("../", "\\*.mak")
     for c_file in C_FILES:
         target_list = find_targets(c_file, MAKEFILES)
         for (f, t) in target_list:
#             print "found target for " + c_file + " in " + f
#             print "target is "
#             print t
             compare_lists(c_file, f, get_deps_from_target(t), get_includes(c_file))
         else:
             "no target for " + c_file
#    C_FILES=find_all_files("../", "*.c")
#    MAKE_FILES=find_all_files("../", "*.mak")
#    H_FILES=find_all_files("../", "*.h")