1#!/usr/bin/env python
2
3import os
4import subprocess
5
6def main():
7    cc = os.environ.get('CC', 'cc')
8    sink = open(os.devnull, 'wb')
9    try:
10        cc_is_clang = 'clang' in subprocess.check_output(
11          [cc, '--version'], universal_newlines=True, stderr=sink)
12    except OSError:
13        # We probably just don't have CC/cc.
14        return
15
16    def warning_supported(warning):
17        return subprocess.call([cc, '-x', 'c', '-E', '-Werror',
18                                '-W%s' % warning, os.devnull], stdout=sink, stderr=sink) == 0
19    def can_enable():
20        # This would be a problem
21        if not warning_supported('all'):
22            return False
23
24        # If we aren't clang, make sure we have gcc 4.8 at least
25        if not cc_is_clang:
26            try:
27                v = subprocess.check_output([cc, '-dumpversion'], stderr=sink).decode("utf-8")
28                v = v.strip(' \r\n').split('.')
29                v = list(map(int, v))
30                if v[0] < 4 or (v[0] == 4 and v[1] < 8):
31                    # gcc 4.8 minimum
32                    return False
33            except OSError:
34                return False
35        return True
36
37    if not can_enable():
38        print('-DNSS_NO_GCC48')
39        return
40
41    print('-Werror')
42    print('-Wall')
43
44    def set_warning(warning, contra=''):
45        if warning_supported(warning):
46            print('-W%s%s' % (contra, warning))
47
48    if cc_is_clang:
49        # clang is unable to handle glib's expansion of strcmp and similar for
50        # optimized builds, so disable the resulting errors.
51        # See https://llvm.org/bugs/show_bug.cgi?id=20144
52        for w in ['array-bounds', 'unevaluated-expression',
53                  'parentheses-equality']:
54            set_warning(w, 'no-')
55        print('-Qunused-arguments')
56
57    set_warning('shadow')
58
59if __name__ == '__main__':
60    main()
61