summaryrefslogtreecommitdiff
path: root/solenv/bin/buildalyzer
blob: 77d8d413eccb861d82c0d3e9b8bfc65f151652be (plain)
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
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
#!/usr/bin/env python
#
# This file is part of the LibreOffice project.
#
# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
#
# This file incorporates work covered by the following license notice:
#
#   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 .
#
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))