summaryrefslogtreecommitdiff
path: root/coreconf/werror.py
blob: 2f622c5e11617c3d16a0a11d5d825ff7411b8079 (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
#!/usr/bin/env python

import os
import subprocess

def main():
    cc = os.environ.get('CC', 'cc')
    sink = open(os.devnull, 'wb')
    try:
        cc_is_clang = 'clang' in subprocess.check_output(
          [cc, '--version'], universal_newlines=True, stderr=sink)
    except OSError:
        # We probably just don't have CC/cc.
        return

    def warning_supported(warning):
        return subprocess.call([cc, '-x', 'c', '-E', '-Werror',
                                '-W%s' % warning, os.devnull], stdout=sink, stderr=sink) == 0
    def can_enable():
        # This would be a problem
        if not warning_supported('all'):
            return False

        # If we aren't clang, make sure we have gcc 4.8 at least
        if not cc_is_clang:
            try:
                v = subprocess.check_output([cc, '-dumpversion'], stderr=sink).decode("utf-8")
                v = v.strip(' \r\n').split('.')
                v = list(map(int, v))
                if v[0] < 4 or (v[0] == 4 and v[1] < 8):
                    # gcc 4.8 minimum
                    return False
            except OSError:
                return False
        return True

    if not can_enable():
        print('-DNSS_NO_GCC48')
        return

    print('-Werror')
    print('-Wall')

    def set_warning(warning, contra=''):
        if warning_supported(warning):
            print('-W%s%s' % (contra, warning))

    if cc_is_clang:
        # clang is unable to handle glib's expansion of strcmp and similar for
        # optimized builds, so disable the resulting errors.
        # See https://llvm.org/bugs/show_bug.cgi?id=20144
        for w in ['array-bounds',
                  'unevaluated-expression',
                  'parentheses-equality',
                  'tautological-type-limit-compare',
                  'sign-compare',
                  'comma',
                  'implicit-fallthrough'
                  ]:
            set_warning(w, 'no-')
        for w in ['tautological-constant-in-range-compare',
                  'bitfield-enum-conversion',
                  'empty-body',
                  'format-type-confusion',
                  'ignored-qualifiers',
                  'pointer-arith',
                  'type-limits',
                  'unreachable-code',
                  'unreachable-code-return',
                  'duplicated-cond',
                  'logical-op',
                  'implicit-function-declaration'
                  ]:
            set_warning(w,'')
        print('-Qunused-arguments')

    set_warning('shadow')

if __name__ == '__main__':
    main()