#!/usr/bin/env python # ************************************************************* # # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information # regarding copyright ownership. The ASF licenses this file # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. # # ************************************************************* 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))