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