1cdf0e10cSrcweir#!/usr/bin/env python 2*5b501c92SAndrew Rist# ************************************************************* 3*5b501c92SAndrew Rist# 4*5b501c92SAndrew Rist# Licensed to the Apache Software Foundation (ASF) under one 5*5b501c92SAndrew Rist# or more contributor license agreements. See the NOTICE file 6*5b501c92SAndrew Rist# distributed with this work for additional information 7*5b501c92SAndrew Rist# regarding copyright ownership. The ASF licenses this file 8*5b501c92SAndrew Rist# to you under the Apache License, Version 2.0 (the 9*5b501c92SAndrew Rist# "License"); you may not use this file except in compliance 10*5b501c92SAndrew Rist# with the License. You may obtain a copy of the License at 11*5b501c92SAndrew Rist# 12*5b501c92SAndrew Rist# http://www.apache.org/licenses/LICENSE-2.0 13*5b501c92SAndrew Rist# 14*5b501c92SAndrew Rist# Unless required by applicable law or agreed to in writing, 15*5b501c92SAndrew Rist# software distributed under the License is distributed on an 16*5b501c92SAndrew Rist# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 17*5b501c92SAndrew Rist# KIND, either express or implied. See the License for the 18*5b501c92SAndrew Rist# specific language governing permissions and limitations 19*5b501c92SAndrew Rist# under the License. 20*5b501c92SAndrew Rist# 21*5b501c92SAndrew Rist# ************************************************************* 22cdf0e10cSrcweirimport sys 23cdf0e10cSrcweirimport os 24cdf0e10cSrcweir 25cdf0e10cSrcweirclass CxxTarget: 26cdf0e10cSrcweir def __init__(self, line): 27cdf0e10cSrcweir self.directory = '' 28cdf0e10cSrcweir self.outputfile = '' 29cdf0e10cSrcweir self.includeflags = [] 30cdf0e10cSrcweir self.cxxflags = [] 31cdf0e10cSrcweir self.inputfiles = [] 32cdf0e10cSrcweir self.nolink = False 33cdf0e10cSrcweir options = line[:-1].split(' ') 34cdf0e10cSrcweir self.directory = options.pop(0) 35cdf0e10cSrcweir parsing_outputfile = False 36cdf0e10cSrcweir for option in options: 37cdf0e10cSrcweir if parsing_outputfile: 38cdf0e10cSrcweir self.outputfile = option 39cdf0e10cSrcweir parsing_outputfile = False 40cdf0e10cSrcweir elif option == '-o': 41cdf0e10cSrcweir parsing_outputfile = True 42cdf0e10cSrcweir elif option == '-c': 43cdf0e10cSrcweir self.nolink = True 44cdf0e10cSrcweir elif option.startswith('-I'): 45cdf0e10cSrcweir self.includeflags.append(CxxFlag(option)) 46cdf0e10cSrcweir elif option.startswith('-'): 47cdf0e10cSrcweir self.cxxflags.append(CxxFlag(option)) 48cdf0e10cSrcweir else: 49cdf0e10cSrcweir self.inputfiles.append(option) 50cdf0e10cSrcweir self.cxxflags.sort() 51cdf0e10cSrcweir self.includeflags.sort() 52cdf0e10cSrcweir cxxflags_tmp = dict() 53cdf0e10cSrcweir for flag in self.cxxflags: 54cdf0e10cSrcweir cxxflags_tmp[flag.name] = flag 55cdf0e10cSrcweir self.cxxflags = cxxflags_tmp.values() 56cdf0e10cSrcweir includeflags_tmp = dict() 57cdf0e10cSrcweir for flag in self.includeflags: 58cdf0e10cSrcweir includeflags_tmp[flag.name] = flag 59cdf0e10cSrcweir self.includeflags = includeflags_tmp.values() 60cdf0e10cSrcweir CxxTargets.by_name[self.getFullOutputname()] = self 61cdf0e10cSrcweir def __str__(self): 62cdf0e10cSrcweir return '%s' % (self.getFullOutputname()) 63cdf0e10cSrcweir def getFullOutputname(self): 64cdf0e10cSrcweir return self.directory + '/' + self.outputfile 65cdf0e10cSrcweir def __cmp__(self, other): 66cdf0e10cSrcweir return cmp(self.getFullOutputname(), other.getFullOutputname()) 67cdf0e10cSrcweir 68cdf0e10cSrcweirclass CxxFlag: 69cdf0e10cSrcweir def __init__(self, name): 70cdf0e10cSrcweir self.name = name 71cdf0e10cSrcweir CxxFlags.by_name[self.name] = self 72cdf0e10cSrcweir def __str__(self): 73cdf0e10cSrcweir return 'Flag %s' % (self.name) 74cdf0e10cSrcweir def __cmp__(self, other): 75cdf0e10cSrcweir return cmp(self.name, other.name) 76cdf0e10cSrcweir 77cdf0e10cSrcweirclass CxxFlags: 78cdf0e10cSrcweir by_name = dict() 79cdf0e10cSrcweir 80cdf0e10cSrcweirclass CxxTargets: 81cdf0e10cSrcweir by_name = dict() 82cdf0e10cSrcweir 83cdf0e10cSrcweirif __name__ == '__main__': 84cdf0e10cSrcweir [CxxTarget(line) for line in sys.stdin.readlines()] 85cdf0e10cSrcweir compile_targets = [target for target in CxxTargets.by_name.values() if target.nolink] 86cdf0e10cSrcweir link_targets = [target for target in CxxTargets.by_name.values() if not target.nolink] 87cdf0e10cSrcweir common_compile_flags = [] 88cdf0e10cSrcweir for flag in CxxFlags.by_name.values(): 89cdf0e10cSrcweir if sum((flag in target.cxxflags for target in compile_targets)) == len(compile_targets): 90cdf0e10cSrcweir common_compile_flags.append(flag) 91cdf0e10cSrcweir common_link_flags = [] 92cdf0e10cSrcweir for flag in CxxFlags.by_name.values(): 93cdf0e10cSrcweir if sum((flag in target.cxxflags for target in compile_targets)) == len(compile_targets): 94cdf0e10cSrcweir common_link_flags.append(flag) 95cdf0e10cSrcweir 96cdf0e10cSrcweir for target in compile_targets: 97cdf0e10cSrcweir target.cxxflags = [flag for flag in target.cxxflags if flag not in common_compile_flags] 98cdf0e10cSrcweir target.cxxflags.sort() 99cdf0e10cSrcweir for target in link_targets: 100cdf0e10cSrcweir target.cxxflags = [flag for flag in target.cxxflags if flag not in common_link_flags] 101cdf0e10cSrcweir target.cxxflags.sort() 102cdf0e10cSrcweir 103cdf0e10cSrcweir common_compile_flags.sort() 104cdf0e10cSrcweir common_link_flags.sort() 105cdf0e10cSrcweir print 'common compile flags: %s' % (' '.join(flag.name for flag in common_compile_flags)) 106cdf0e10cSrcweir print 'common link flags: %s' % (' '.join(flag.name for flag in common_link_flags)) 107cdf0e10cSrcweir 108cdf0e10cSrcweir by_flagset = dict() 109cdf0e10cSrcweir for target in CxxTargets.by_name.values(): 110cdf0e10cSrcweir flagset = ' '.join((flag.name for flag in target.cxxflags)) 111cdf0e10cSrcweir if flagset not in by_flagset: 112cdf0e10cSrcweir by_flagset[flagset] = list() 113cdf0e10cSrcweir by_flagset[flagset].append(target) 114cdf0e10cSrcweir for targetlist in by_flagset.values(): 115cdf0e10cSrcweir targetlist.sort() 116cdf0e10cSrcweir flagsets = by_flagset.keys() 117cdf0e10cSrcweir flagsets.sort() 118cdf0e10cSrcweir print '%d compilerflag groups:' % (len(flagsets)) 119cdf0e10cSrcweir for flagset in flagsets: 120cdf0e10cSrcweir print flagset 121cdf0e10cSrcweir for target in by_flagset[flagset]: 122cdf0e10cSrcweir print '%s' % (target) 123cdf0e10cSrcweir print 124cdf0e10cSrcweir 125cdf0e10cSrcweir by_flagset = dict() 126cdf0e10cSrcweir for target in CxxTargets.by_name.values(): 127cdf0e10cSrcweir flagset = ' '.join((flag.name for flag in target.includeflags)) 128cdf0e10cSrcweir if flagset not in by_flagset: 129cdf0e10cSrcweir by_flagset[flagset] = list() 130cdf0e10cSrcweir by_flagset[flagset].append(target) 131cdf0e10cSrcweir for targetlist in by_flagset.values(): 132cdf0e10cSrcweir targetlist.sort() 133cdf0e10cSrcweir flagsets = by_flagset.keys() 134cdf0e10cSrcweir flagsets.sort() 135cdf0e10cSrcweir print '%d include flag groups:' % (len(flagsets)) 136cdf0e10cSrcweir for flagset in flagsets: 137cdf0e10cSrcweir print flagset 138cdf0e10cSrcweir for target in by_flagset[flagset]: 139cdf0e10cSrcweir print '%s' % (target) 140cdf0e10cSrcweir print 141cdf0e10cSrcweir 142cdf0e10cSrcweir print 'sources:' 143cdf0e10cSrcweir by_name = dict() 144cdf0e10cSrcweir for target in CxxTargets.by_name.values(): 145cdf0e10cSrcweir by_name[os.path.basename(target.outputfile)] = target 146cdf0e10cSrcweir names = by_name.keys() 147cdf0e10cSrcweir names.sort() 148cdf0e10cSrcweir for target in CxxTargets.by_name.values(): 149cdf0e10cSrcweir if len(target.inputfiles) > 1: 150cdf0e10cSrcweir objects = [os.path.basename(object) for object in target.inputfiles] 151cdf0e10cSrcweir sources = list() 152cdf0e10cSrcweir for object in objects: 153cdf0e10cSrcweir if object in by_name: 154cdf0e10cSrcweir sources.append(by_name[object].inputfiles[0]) 155cdf0e10cSrcweir else: 156cdf0e10cSrcweir sources.append('!!!!' + object) 157cdf0e10cSrcweir sources.sort() 158cdf0e10cSrcweir print '%s %s' % (target.getFullOutputname(), ' '.join(sources)) 159