third_party/waf: upgrade to waf 2.0.8
[samba.git] / third_party / waf / waflib / Tools / gcc.py
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 """
8 gcc/llvm detection.
9 """
10
11 from waflib.Tools import ccroot, ar
12 from waflib.Configure import conf
13
14 @conf
15 def 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
24 def 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
65 def 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
82 def 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
91 def 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
108 def 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
116 def 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
124 def gcc_modifier_openbsd(conf):
125         conf.env.SONAME_ST = []
126
127 @conf
128 def gcc_modifier_osf1V(conf):
129         v = conf.env
130         v.SHLIB_MARKER        = []
131         v.STLIB_MARKER        = []
132         v.SONAME_ST           = []
133
134 @conf
135 def 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
144 def 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