1#!/usr/bin/env python 2# encoding: utf-8 3# Thomas Nagy, 2006-2018 (ita) 4# Ralf Habacker, 2006 (rh) 5# Yinon Ehrlich, 2009 6 7""" 8gcc/llvm detection. 9""" 10 11from waflib.Tools import ccroot, ar 12from waflib.Configure import conf 13 14@conf 15def find_gcc(conf): 16 """ 17 Find the program gcc, and if present, try to detect its version number 18 """ 19 cc = conf.find_program(['gcc', 'cc'], var='CC') 20 conf.get_cc_version(cc, gcc=True) 21 conf.env.CC_NAME = 'gcc' 22 23@conf 24def gcc_common_flags(conf): 25 """ 26 Common flags for gcc on nearly all platforms 27 """ 28 v = conf.env 29 30 v.CC_SRC_F = [] 31 v.CC_TGT_F = ['-c', '-o'] 32 33 if not v.LINK_CC: 34 v.LINK_CC = v.CC 35 36 v.CCLNK_SRC_F = [] 37 v.CCLNK_TGT_F = ['-o'] 38 v.CPPPATH_ST = '-I%s' 39 v.DEFINES_ST = '-D%s' 40 41 v.LIB_ST = '-l%s' # template for adding libs 42 v.LIBPATH_ST = '-L%s' # template for adding libpaths 43 v.STLIB_ST = '-l%s' 44 v.STLIBPATH_ST = '-L%s' 45 v.RPATH_ST = '-Wl,-rpath,%s' 46 47 v.SONAME_ST = '-Wl,-h,%s' 48 v.SHLIB_MARKER = '-Wl,-Bdynamic' 49 v.STLIB_MARKER = '-Wl,-Bstatic' 50 51 v.cprogram_PATTERN = '%s' 52 53 v.CFLAGS_cshlib = ['-fPIC'] 54 v.LINKFLAGS_cshlib = ['-shared'] 55 v.cshlib_PATTERN = 'lib%s.so' 56 57 v.LINKFLAGS_cstlib = ['-Wl,-Bstatic'] 58 v.cstlib_PATTERN = 'lib%s.a' 59 60 v.LINKFLAGS_MACBUNDLE = ['-bundle', '-undefined', 'dynamic_lookup'] 61 v.CFLAGS_MACBUNDLE = ['-fPIC'] 62 v.macbundle_PATTERN = '%s.bundle' 63 64@conf 65def gcc_modifier_win32(conf): 66 """Configuration flags for executing gcc on Windows""" 67 v = conf.env 68 v.cprogram_PATTERN = '%s.exe' 69 70 v.cshlib_PATTERN = '%s.dll' 71 v.implib_PATTERN = '%s.dll.a' 72 v.IMPLIB_ST = '-Wl,--out-implib,%s' 73 74 v.CFLAGS_cshlib = [] 75 76 # Auto-import is enabled by default even without this option, 77 # but enabling it explicitly has the nice effect of suppressing the rather boring, debug-level messages 78 # that the linker emits otherwise. 79 v.append_value('LINKFLAGS', ['-Wl,--enable-auto-import']) 80 81@conf 82def gcc_modifier_cygwin(conf): 83 """Configuration flags for executing gcc on Cygwin""" 84 gcc_modifier_win32(conf) 85 v = conf.env 86 v.cshlib_PATTERN = 'cyg%s.dll' 87 v.append_value('LINKFLAGS_cshlib', ['-Wl,--enable-auto-image-base']) 88 v.CFLAGS_cshlib = [] 89 90@conf 91def gcc_modifier_darwin(conf): 92 """Configuration flags for executing gcc on MacOS""" 93 v = conf.env 94 v.CFLAGS_cshlib = ['-fPIC'] 95 v.LINKFLAGS_cshlib = ['-dynamiclib'] 96 v.cshlib_PATTERN = 'lib%s.dylib' 97 v.FRAMEWORKPATH_ST = '-F%s' 98 v.FRAMEWORK_ST = ['-framework'] 99 v.ARCH_ST = ['-arch'] 100 101 v.LINKFLAGS_cstlib = [] 102 103 v.SHLIB_MARKER = [] 104 v.STLIB_MARKER = [] 105 v.SONAME_ST = [] 106 107@conf 108def gcc_modifier_aix(conf): 109 """Configuration flags for executing gcc on AIX""" 110 v = conf.env 111 v.LINKFLAGS_cprogram = ['-Wl,-brtl'] 112 v.LINKFLAGS_cshlib = ['-shared','-Wl,-brtl,-bexpfull'] 113 v.SHLIB_MARKER = [] 114 115@conf 116def gcc_modifier_hpux(conf): 117 v = conf.env 118 v.SHLIB_MARKER = [] 119 v.STLIB_MARKER = [] 120 v.CFLAGS_cshlib = ['-fPIC','-DPIC'] 121 v.cshlib_PATTERN = 'lib%s.sl' 122 123@conf 124def gcc_modifier_openbsd(conf): 125 conf.env.SONAME_ST = [] 126 127@conf 128def gcc_modifier_osf1V(conf): 129 v = conf.env 130 v.SHLIB_MARKER = [] 131 v.STLIB_MARKER = [] 132 v.SONAME_ST = [] 133 134@conf 135def gcc_modifier_platform(conf): 136 """Execute platform-specific functions based on *gcc_modifier_+NAME*""" 137 # * set configurations specific for a platform. 138 # * the destination platform is detected automatically by looking at the macros the compiler predefines, 139 # and if it's not recognised, it fallbacks to sys.platform. 140 gcc_modifier_func = getattr(conf, 'gcc_modifier_' + conf.env.DEST_OS, None) 141 if gcc_modifier_func: 142 gcc_modifier_func() 143 144def configure(conf): 145 """ 146 Configuration for gcc 147 """ 148 conf.find_gcc() 149 conf.find_ar() 150 conf.gcc_common_flags() 151 conf.gcc_modifier_platform() 152 conf.cc_load_tools() 153 conf.cc_add_flags() 154 conf.link_add_flags() 155 conf.check_gcc_o_space() 156 157