office-gobmx/solenv/bin/buildalyzer
2011-01-10 21:35:22 -06:00

138 lines
5 KiB
Python

#!/usr/bin/env python
import sys
import os
class CxxTarget:
def __init__(self, line):
self.directory = ''
self.outputfile = ''
self.includeflags = []
self.cxxflags = []
self.inputfiles = []
self.nolink = False
options = line[:-1].split(' ')
self.directory = options.pop(0)
parsing_outputfile = False
for option in options:
if parsing_outputfile:
self.outputfile = option
parsing_outputfile = False
elif option == '-o':
parsing_outputfile = True
elif option == '-c':
self.nolink = True
elif option.startswith('-I'):
self.includeflags.append(CxxFlag(option))
elif option.startswith('-'):
self.cxxflags.append(CxxFlag(option))
else:
self.inputfiles.append(option)
self.cxxflags.sort()
self.includeflags.sort()
cxxflags_tmp = dict()
for flag in self.cxxflags:
cxxflags_tmp[flag.name] = flag
self.cxxflags = cxxflags_tmp.values()
includeflags_tmp = dict()
for flag in self.includeflags:
includeflags_tmp[flag.name] = flag
self.includeflags = includeflags_tmp.values()
CxxTargets.by_name[self.getFullOutputname()] = self
def __str__(self):
return '%s' % (self.getFullOutputname())
def getFullOutputname(self):
return self.directory + '/' + self.outputfile
def __cmp__(self, other):
return cmp(self.getFullOutputname(), other.getFullOutputname())
class CxxFlag:
def __init__(self, name):
self.name = name
CxxFlags.by_name[self.name] = self
def __str__(self):
return 'Flag %s' % (self.name)
def __cmp__(self, other):
return cmp(self.name, other.name)
class CxxFlags:
by_name = dict()
class CxxTargets:
by_name = dict()
if __name__ == '__main__':
[CxxTarget(line) for line in sys.stdin.readlines()]
compile_targets = [target for target in CxxTargets.by_name.values() if target.nolink]
link_targets = [target for target in CxxTargets.by_name.values() if not target.nolink]
common_compile_flags = []
for flag in CxxFlags.by_name.values():
if sum((flag in target.cxxflags for target in compile_targets)) == len(compile_targets):
common_compile_flags.append(flag)
common_link_flags = []
for flag in CxxFlags.by_name.values():
if sum((flag in target.cxxflags for target in compile_targets)) == len(compile_targets):
common_link_flags.append(flag)
for target in compile_targets:
target.cxxflags = [flag for flag in target.cxxflags if flag not in common_compile_flags]
target.cxxflags.sort()
for target in link_targets:
target.cxxflags = [flag for flag in target.cxxflags if flag not in common_link_flags]
target.cxxflags.sort()
common_compile_flags.sort()
common_link_flags.sort()
print 'common compile flags: %s' % (' '.join(flag.name for flag in common_compile_flags))
print 'common link flags: %s' % (' '.join(flag.name for flag in common_link_flags))
by_flagset = dict()
for target in CxxTargets.by_name.values():
flagset = ' '.join((flag.name for flag in target.cxxflags))
if flagset not in by_flagset:
by_flagset[flagset] = list()
by_flagset[flagset].append(target)
for targetlist in by_flagset.values():
targetlist.sort()
flagsets = by_flagset.keys()
flagsets.sort()
print '%d compilerflag groups:' % (len(flagsets))
for flagset in flagsets:
print flagset
for target in by_flagset[flagset]:
print '%s' % (target)
print
by_flagset = dict()
for target in CxxTargets.by_name.values():
flagset = ' '.join((flag.name for flag in target.includeflags))
if flagset not in by_flagset:
by_flagset[flagset] = list()
by_flagset[flagset].append(target)
for targetlist in by_flagset.values():
targetlist.sort()
flagsets = by_flagset.keys()
flagsets.sort()
print '%d include flag groups:' % (len(flagsets))
for flagset in flagsets:
print flagset
for target in by_flagset[flagset]:
print '%s' % (target)
print
print 'sources:'
by_name = dict()
for target in CxxTargets.by_name.values():
by_name[os.path.basename(target.outputfile)] = target
names = by_name.keys()
names.sort()
for target in CxxTargets.by_name.values():
if len(target.inputfiles) > 1:
objects = [os.path.basename(object) for object in target.inputfiles]
sources = list()
for object in objects:
if object in by_name:
sources.append(by_name[object].inputfiles[0])
else:
sources.append('!!!!' + object)
sources.sort()
print '%s %s' % (target.getFullOutputname(), ' '.join(sources))