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")
|