138 lines
5 KiB
Python
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))
|