8b70e9b4261fc822268a91fcafbdf2ae139df733
[mesa.git] / common.py
1 #######################################################################
2 # Common SCons code
3
4 import os
5 import os.path
6 import sys
7 import platform as _platform
8
9
10 #######################################################################
11 # Defaults
12
13 _platform_map = {
14 'linux2': 'linux',
15 'win32': 'winddk',
16 }
17
18 default_platform = sys.platform
19 default_platform = _platform_map.get(default_platform, default_platform)
20
21 _machine_map = {
22 'x86': 'x86',
23 'i386': 'x86',
24 'i486': 'x86',
25 'i586': 'x86',
26 'i686': 'x86',
27 'x86_64': 'x86_64',
28 }
29 if 'PROCESSOR_ARCHITECTURE' in os.environ:
30 default_machine = os.environ['PROCESSOR_ARCHITECTURE']
31 else:
32 default_machine = _platform.machine()
33 default_machine = _machine_map.get(default_machine, 'generic')
34
35 if default_platform in ('linux', 'freebsd', 'darwin'):
36 default_dri = 'yes'
37 elif default_platform in ('winddk', 'windows', 'wince'):
38 default_dri = 'no'
39 else:
40 default_dri = 'no'
41
42
43 #######################################################################
44 # Common options
45
46 def AddOptions(opts):
47 try:
48 from SCons.Options.BoolOption import BoolOption
49 except ImportError:
50 from SCons.Variables.BoolVariable import BoolVariable as BoolOption
51 try:
52 from SCons.Options.EnumOption import EnumOption
53 except ImportError:
54 from SCons.Variables.EnumVariable import EnumVariable as EnumOption
55 opts.Add(BoolOption('debug', 'debug build', 'no'))
56 opts.Add(BoolOption('profile', 'profile build', 'no'))
57 #opts.Add(BoolOption('quiet', 'quiet command lines', 'no'))
58 opts.Add(EnumOption('machine', 'use machine-specific assembly code', default_machine,
59 allowed_values=('generic', 'x86', 'x86_64')))
60 opts.Add(EnumOption('platform', 'target platform', default_platform,
61 allowed_values=('linux', 'cell', 'windows', 'winddk', 'wince')))
62 opts.Add(BoolOption('llvm', 'use LLVM', 'no'))
63 opts.Add(BoolOption('dri', 'build DRI drivers', default_dri))
64
65
66 #######################################################################
67 # Quiet command lines
68 #
69 # See also http://www.scons.org/wiki/HidingCommandLinesInOutput
70
71 def quietCommandLines(env):
72 env['CCCOMSTR'] = "Compiling $SOURCE ..."
73 env['CXXCOMSTR'] = "Compiling $SOURCE ..."
74 env['ARCOMSTR'] = "Archiving $TARGET ..."
75 env['RANLIBCOMSTR'] = ""
76 env['LINKCOMSTR'] = "Linking $TARGET ..."
77
78
79 #######################################################################
80 # Convenience Library Builder
81 # based on the stock StaticLibrary and SharedLibrary builders
82
83 import SCons.Action
84 import SCons.Builder
85
86 def createConvenienceLibBuilder(env):
87 """This is a utility function that creates the ConvenienceLibrary
88 Builder in an Environment if it is not there already.
89
90 If it is already there, we return the existing one.
91 """
92
93 try:
94 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
95 except KeyError:
96 action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ]
97 if env.Detect('ranlib'):
98 ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR")
99 action_list.append(ranlib_action)
100
101 convenience_lib = SCons.Builder.Builder(action = action_list,
102 emitter = '$LIBEMITTER',
103 prefix = '$LIBPREFIX',
104 suffix = '$LIBSUFFIX',
105 src_suffix = '$SHOBJSUFFIX',
106 src_builder = 'SharedObject')
107 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
108 env['BUILDERS']['Library'] = convenience_lib
109
110 return convenience_lib
111
112
113 #######################################################################
114 # Build
115
116 def make_build_dir(env):
117 # Put build output in a separate dir, which depends on the current configuration
118 # See also http://www.scons.org/wiki/AdvancedBuildExample
119 build_topdir = 'build'
120 build_subdir = env['platform']
121 if env['dri']:
122 build_subdir += "-dri"
123 if env['llvm']:
124 build_subdir += "-llvm"
125 if env['machine'] != 'generic':
126 build_subdir += '-' + env['machine']
127 if env['debug']:
128 build_subdir += "-debug"
129 if env['profile']:
130 build_subdir += "-profile"
131 build_dir = os.path.join(build_topdir, build_subdir)
132 # Place the .sconsign file on the builddir too, to avoid issues with different scons
133 # versions building the same source file
134 env.SConsignFile(os.path.join(build_dir, '.sconsign'))
135 return build_dir
136
137
138 #######################################################################
139 # Common environment generation code
140
141 def generate(env):
142 # FIXME: this is already too late
143 #if env.get('quiet', False):
144 # quietCommandLines(env)
145
146 # shortcuts
147 debug = env['debug']
148 machine = env['machine']
149 platform = env['platform']
150 x86 = env['machine'] == 'x86'
151 gcc = env['platform'] in ('linux', 'freebsd', 'darwin')
152 msvc = env['platform'] in ('windows', 'winddk', 'wince')
153
154 # C preprocessor options
155 cppdefines = []
156 if debug:
157 cppdefines += ['DEBUG']
158 else:
159 cppdefines += ['NDEBUG']
160 if env['profile']:
161 cppdefines += ['PROFILE']
162 if platform == 'windows':
163 cppdefines += [
164 'WIN32',
165 '_WINDOWS',
166 '_UNICODE',
167 'UNICODE',
168 # http://msdn2.microsoft.com/en-us/library/6dwk3a1z.aspx,
169 'WIN32_LEAN_AND_MEAN',
170 'VC_EXTRALEAN',
171 '_CRT_SECURE_NO_DEPRECATE',
172 ]
173 if debug:
174 cppdefines += ['_DEBUG']
175 if platform == 'winddk':
176 # Mimic WINDDK's builtin flags. See also:
177 # - WINDDK's bin/makefile.new i386mk.inc for more info.
178 # - buildchk_wxp_x86.log files, generated by the WINDDK's build
179 # - http://alter.org.ua/docs/nt_kernel/vc8_proj/
180 cppdefines += [
181 ('_X86_', '1'),
182 ('i386', '1'),
183 'STD_CALL',
184 ('CONDITION_HANDLING', '1'),
185 ('NT_INST', '0'),
186 ('WIN32', '100'),
187 ('_NT1X_', '100'),
188 ('WINNT', '1'),
189 ('_WIN32_WINNT', '0x0501'), # minimum required OS version
190 ('WINVER', '0x0501'),
191 ('_WIN32_IE', '0x0603'),
192 ('WIN32_LEAN_AND_MEAN', '1'),
193 ('DEVL', '1'),
194 ('__BUILDMACHINE__', 'WinDDK'),
195 ('FPO', '0'),
196 ]
197 if debug:
198 cppdefines += [('DBG', 1)]
199 if platform == 'wince':
200 cppdefines += [
201 ('_WIN32_WCE', '500'),
202 'WCE_PLATFORM_STANDARDSDK_500',
203 '_i386_',
204 ('UNDER_CE', '500'),
205 'UNICODE',
206 '_UNICODE',
207 '_X86_',
208 'x86',
209 '_USRDLL',
210 'TEST_EXPORTS' ,
211 ]
212 if platform == 'windows':
213 cppdefines += ['PIPE_SUBSYSTEM_USER']
214 if platform == 'winddk':
215 cppdefines += ['PIPE_SUBSYSTEM_KERNEL']
216 env.Append(CPPDEFINES = cppdefines)
217
218 # C compiler options
219 cflags = []
220 if gcc:
221 if debug:
222 cflags += ['-O0', '-g3']
223 else:
224 cflags += ['-O3', '-g3']
225 if env['profile']:
226 cflags += ['-pg']
227 cflags += [
228 '-Wall',
229 '-Wmissing-prototypes',
230 '-Wno-long-long',
231 '-ffast-math',
232 '-pedantic',
233 '-fmessage-length=0', # be nice to Eclipse
234 ]
235 if msvc:
236 # See also:
237 # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx
238 # - cl /?
239 if debug:
240 cflags += [
241 '/Od', # disable optimizations
242 '/Oi', # enable intrinsic functions
243 '/Oy-', # disable frame pointer omission
244 ]
245 else:
246 cflags += [
247 '/Ox', # maximum optimizations
248 '/Oi', # enable intrinsic functions
249 '/Os', # favor code space
250 ]
251 if env['profile']:
252 cflags += [
253 '/Gh', # enable _penter hook function
254 '/GH', # enable _pexit hook function
255 ]
256 cflags += [
257 '/W3', # warning level
258 #'/Wp64', # enable 64 bit porting warnings
259 ]
260 if platform == 'windows':
261 cflags += [
262 # TODO
263 ]
264 if platform == 'winddk':
265 cflags += [
266 '/Zl', # omit default library name in .OBJ
267 '/Zp8', # 8bytes struct member alignment
268 '/Gy', # separate functions for linker
269 '/Gm-', # disable minimal rebuild
270 '/WX', # treat warnings as errors
271 '/Gz', # __stdcall Calling convention
272 '/GX-', # disable C++ EH
273 '/GR-', # disable C++ RTTI
274 '/GF', # enable read-only string pooling
275 '/G6', # optimize for PPro, P-II, P-III
276 '/Ze', # enable extensions
277 '/Gi-', # disable incremental compilation
278 '/QIfdiv-', # disable Pentium FDIV fix
279 '/hotpatch', # prepares an image for hotpatching.
280 #'/Z7', #enable old-style debug info
281 ]
282 if platform == 'wince':
283 cflags += [
284 '/Gs8192',
285 '/GF', # enable read-only string pooling
286 ]
287 # Put debugging information in a separate .pdb file for each object file as
288 # described in the scons manpage
289 env['CCPDBFLAGS'] = '/Zi /Fd${TARGET}.pdb'
290 env.Append(CFLAGS = cflags)
291 env.Append(CXXFLAGS = cflags)
292
293 # Linker options
294 if platform == 'winddk':
295 # See also:
296 # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx
297 env.Append(LINKFLAGS = [
298 '/merge:_PAGE=PAGE',
299 '/merge:_TEXT=.text',
300 '/section:INIT,d',
301 '/opt:ref',
302 '/opt:icf',
303 '/ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221',
304 '/incremental:no',
305 '/fullbuild',
306 '/release',
307 '/nodefaultlib',
308 '/wx',
309 '/debug',
310 '/debugtype:cv',
311 '/version:5.1',
312 '/osversion:5.1',
313 '/functionpadmin:5',
314 '/safeseh',
315 '/pdbcompress',
316 '/stack:0x40000,0x1000',
317 '/driver',
318 '/align:0x80',
319 '/subsystem:native,5.01',
320 '/base:0x10000',
321
322 '/entry:DrvEnableDriver',
323 ])
324
325
326 createConvenienceLibBuilder(env)
327
328
329 # for debugging
330 #print env.Dump()
331