blob: 38782ac7266f5535d3f006de9e8a2757a945fbb6 [file] [log] [blame]
José Fonsecab04aa712008-06-06 14:48:57 +09001"""gallium
2
3Frontend-tool for Gallium3D architecture.
4
5"""
6
José Fonseca381e3482008-07-17 11:23:43 +09007#
José Fonsecab04aa712008-06-06 14:48:57 +09008# Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
9# All Rights Reserved.
José Fonseca381e3482008-07-17 11:23:43 +090010#
José Fonsecab04aa712008-06-06 14:48:57 +090011# Permission is hereby granted, free of charge, to any person obtaining a
12# copy of this software and associated documentation files (the
13# "Software"), to deal in the Software without restriction, including
14# without limitation the rights to use, copy, modify, merge, publish,
15# distribute, sub license, and/or sell copies of the Software, and to
16# permit persons to whom the Software is furnished to do so, subject to
17# the following conditions:
José Fonseca381e3482008-07-17 11:23:43 +090018#
José Fonsecab04aa712008-06-06 14:48:57 +090019# The above copyright notice and this permission notice (including the
20# next paragraph) shall be included in all copies or substantial portions
21# of the Software.
José Fonseca381e3482008-07-17 11:23:43 +090022#
José Fonsecab04aa712008-06-06 14:48:57 +090023# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
24# OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
25# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
26# IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
27# ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
28# TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
29# SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
José Fonseca381e3482008-07-17 11:23:43 +090030#
José Fonsecab04aa712008-06-06 14:48:57 +090031
32
José Fonseca27d8d6f2008-07-03 12:42:23 +090033import os
José Fonsecab04aa712008-06-06 14:48:57 +090034import os.path
José Fonseca27d8d6f2008-07-03 12:42:23 +090035import re
José Fonsecab04aa712008-06-06 14:48:57 +090036
37import SCons.Action
38import SCons.Builder
José Fonseca27d8d6f2008-07-03 12:42:23 +090039import SCons.Scanner
José Fonsecab04aa712008-06-06 14:48:57 +090040
José Fonseca7325c1e2009-07-14 11:09:23 +010041import fixes
42
José Fonsecab04aa712008-06-06 14:48:57 +090043
44def quietCommandLines(env):
José Fonseca381e3482008-07-17 11:23:43 +090045 # Quiet command lines
46 # See also http://www.scons.org/wiki/HidingCommandLinesInOutput
Michel Dänzer550a2fe2009-06-11 12:11:37 +020047 env['ASCOMSTR'] = " Assembling $SOURCE ..."
48 env['ASPPCOMSTR'] = " Assembling $SOURCE ..."
49 env['CCCOMSTR'] = " Compiling $SOURCE ..."
50 env['SHCCCOMSTR'] = " Compiling $SOURCE ..."
51 env['CXXCOMSTR'] = " Compiling $SOURCE ..."
52 env['SHCXXCOMSTR'] = " Compiling $SOURCE ..."
53 env['ARCOMSTR'] = " Archiving $TARGET ..."
54 env['RANLIBCOMSTR'] = " Indexing $TARGET ..."
55 env['LINKCOMSTR'] = " Linking $TARGET ..."
56 env['SHLINKCOMSTR'] = " Linking $TARGET ..."
57 env['LDMODULECOMSTR'] = " Linking $TARGET ..."
58 env['SWIGCOMSTR'] = " Generating $TARGET ..."
José Fonsecab04aa712008-06-06 14:48:57 +090059
60
61def createConvenienceLibBuilder(env):
62 """This is a utility function that creates the ConvenienceLibrary
63 Builder in an Environment if it is not there already.
64
65 If it is already there, we return the existing one.
José Fonseca381e3482008-07-17 11:23:43 +090066
José Fonsecab04aa712008-06-06 14:48:57 +090067 Based on the stock StaticLibrary and SharedLibrary builders.
68 """
69
70 try:
71 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
72 except KeyError:
73 action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ]
74 if env.Detect('ranlib'):
75 ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR")
76 action_list.append(ranlib_action)
77
78 convenience_lib = SCons.Builder.Builder(action = action_list,
79 emitter = '$LIBEMITTER',
80 prefix = '$LIBPREFIX',
81 suffix = '$LIBSUFFIX',
82 src_suffix = '$SHOBJSUFFIX',
83 src_builder = 'SharedObject')
84 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
José Fonsecab04aa712008-06-06 14:48:57 +090085
86 return convenience_lib
87
88
José Fonseca27d8d6f2008-07-03 12:42:23 +090089# TODO: handle import statements with multiple modules
90# TODO: handle from import statements
91import_re = re.compile(r'^import\s+(\S+)$', re.M)
92
93def python_scan(node, env, path):
José Fonseca381e3482008-07-17 11:23:43 +090094 # http://www.scons.org/doc/0.98.5/HTML/scons-user/c2781.html#AEN2789
95 contents = node.get_contents()
96 source_dir = node.get_dir()
97 imports = import_re.findall(contents)
98 results = []
99 for imp in imports:
100 for dir in path:
101 file = os.path.join(str(dir), imp.replace('.', os.sep) + '.py')
102 if os.path.exists(file):
103 results.append(env.File(file))
104 break
105 file = os.path.join(str(dir), imp.replace('.', os.sep), '__init__.py')
106 if os.path.exists(file):
107 results.append(env.File(file))
108 break
109 return results
José Fonseca27d8d6f2008-07-03 12:42:23 +0900110
111python_scanner = SCons.Scanner.Scanner(function = python_scan, skeys = ['.py'])
112
113
114def code_generate(env, script, target, source, command):
José Fonseca381e3482008-07-17 11:23:43 +0900115 """Method to simplify code generation via python scripts.
José Fonseca27d8d6f2008-07-03 12:42:23 +0900116
José Fonseca381e3482008-07-17 11:23:43 +0900117 http://www.scons.org/wiki/UsingCodeGenerators
118 http://www.scons.org/doc/0.98.5/HTML/scons-user/c2768.html
119 """
120
121 # We're generating code using Python scripts, so we have to be
122 # careful with our scons elements. This entry represents
123 # the generator file *in the source directory*.
124 script_src = env.File(script).srcnode()
125
126 # This command creates generated code *in the build directory*.
127 command = command.replace('$SCRIPT', script_src.path)
128 code = env.Command(target, source, command)
129
130 # Explicitly mark that the generated code depends on the generator,
131 # and on implicitly imported python modules
132 path = (script_src.get_dir(),)
133 deps = [script_src]
134 deps += script_src.get_implicit_deps(env, python_scanner, path)
135 env.Depends(code, deps)
136
137 # Running the Python script causes .pyc files to be generated in the
138 # source directory. When we clean up, they should go too. So add side
139 # effects for .pyc files
140 for dep in deps:
141 pyc = env.File(str(dep) + 'c')
142 env.SideEffect(pyc, code)
143
144 return code
José Fonseca27d8d6f2008-07-03 12:42:23 +0900145
146
147def createCodeGenerateMethod(env):
José Fonseca381e3482008-07-17 11:23:43 +0900148 env.Append(SCANNERS = python_scanner)
149 env.AddMethod(code_generate, 'CodeGenerate')
José Fonseca27d8d6f2008-07-03 12:42:23 +0900150
151
José Fonseca52c2dd12008-09-08 07:54:15 +0900152def symlink(target, source, env):
153 target = str(target[0])
154 source = str(source[0])
155 if os.path.islink(target) or os.path.exists(target):
156 os.remove(target)
157 os.symlink(os.path.basename(source), target)
158
159def install_shared_library(env, source, version = ()):
160 source = str(source[0])
161 version = tuple(map(str, version))
José Fonseca7cfc2942008-09-08 21:50:50 +0900162 target_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build'], 'lib')
José Fonseca52c2dd12008-09-08 07:54:15 +0900163 target_name = '.'.join((str(source),) + version)
164 last = env.InstallAs(os.path.join(target_dir, target_name), source)
165 while len(version):
166 version = version[:-1]
167 target_name = '.'.join((str(source),) + version)
168 action = SCons.Action.Action(symlink, "$TARGET -> $SOURCE")
José Fonseca52c2dd12008-09-08 07:54:15 +0900169 last = env.Command(os.path.join(target_dir, target_name), last, action)
170
171def createInstallMethods(env):
172 env.AddMethod(install_shared_library, 'InstallSharedLibrary')
173
174
José Fonseca1e8177e2009-02-10 18:11:56 +0000175def num_jobs():
176 try:
177 return int(os.environ['NUMBER_OF_PROCESSORS'])
178 except (ValueError, KeyError):
179 pass
180
181 try:
182 return os.sysconf('SC_NPROCESSORS_ONLN')
183 except (ValueError, OSError, AttributeError):
184 pass
185
186 try:
187 return int(os.popen2("sysctl -n hw.ncpu")[1].read())
188 except ValueError:
189 pass
190
191 return 1
192
193
José Fonsecab04aa712008-06-06 14:48:57 +0900194def generate(env):
José Fonseca381e3482008-07-17 11:23:43 +0900195 """Common environment generation code"""
José Fonsecab04aa712008-06-06 14:48:57 +0900196
José Fonseca0f50c4f2009-06-02 18:23:12 -0700197 if env.get('quiet', True):
198 quietCommandLines(env)
José Fonsecab04aa712008-06-06 14:48:57 +0900199
José Fonseca6cf59e12008-11-18 19:13:32 +0900200 # Toolchain
201 platform = env['platform']
202 if env['toolchain'] == 'default':
203 if platform == 'winddk':
Michal Krol4f3dcf32008-11-19 20:31:38 +0100204 env['toolchain'] = 'winddk'
José Fonseca6cf59e12008-11-18 19:13:32 +0900205 elif platform == 'wince':
Michal Krol4f3dcf32008-11-19 20:31:38 +0100206 env['toolchain'] = 'wcesdk'
José Fonseca6cf59e12008-11-18 19:13:32 +0900207 env.Tool(env['toolchain'])
208
José Fonseca26e27ba2009-03-25 19:24:16 +0000209 env['gcc'] = 'gcc' in os.path.basename(env['CC']).split('-')
210 env['msvc'] = env['CC'] == 'cl'
211
José Fonseca381e3482008-07-17 11:23:43 +0900212 # shortcuts
213 debug = env['debug']
214 machine = env['machine']
215 platform = env['platform']
216 x86 = env['machine'] == 'x86'
Michel Dänzer6b69e3c2008-10-23 10:28:48 +0200217 ppc = env['machine'] == 'ppc'
José Fonseca26e27ba2009-03-25 19:24:16 +0000218 gcc = env['gcc']
219 msvc = env['msvc']
José Fonsecab04aa712008-06-06 14:48:57 +0900220
José Fonseca381e3482008-07-17 11:23:43 +0900221 # Put build output in a separate dir, which depends on the current
222 # configuration. See also http://www.scons.org/wiki/AdvancedBuildExample
223 build_topdir = 'build'
224 build_subdir = env['platform']
José Fonseca381e3482008-07-17 11:23:43 +0900225 if env['llvm']:
226 build_subdir += "-llvm"
227 if env['machine'] != 'generic':
228 build_subdir += '-' + env['machine']
229 if env['debug']:
230 build_subdir += "-debug"
231 if env['profile']:
232 build_subdir += "-profile"
233 build_dir = os.path.join(build_topdir, build_subdir)
234 # Place the .sconsign file in the build dir too, to avoid issues with
235 # different scons versions building the same source file
236 env['build'] = build_dir
237 env.SConsignFile(os.path.join(build_dir, '.sconsign'))
José Fonseca18170bb2009-01-23 21:01:16 +0000238 env.CacheDir('build/cache')
José Fonsecab04aa712008-06-06 14:48:57 +0900239
José Fonseca1e8177e2009-02-10 18:11:56 +0000240 # Parallel build
241 if env.GetOption('num_jobs') <= 1:
242 env.SetOption('num_jobs', num_jobs())
243
José Fonseca381e3482008-07-17 11:23:43 +0900244 # C preprocessor options
245 cppdefines = []
246 if debug:
247 cppdefines += ['DEBUG']
248 else:
249 cppdefines += ['NDEBUG']
250 if env['profile']:
251 cppdefines += ['PROFILE']
252 if platform == 'windows':
253 cppdefines += [
254 'WIN32',
255 '_WINDOWS',
José Fonseca42be0102009-01-22 14:26:30 +0000256 #'_UNICODE',
257 #'UNICODE',
José Fonseca129c6ed2008-12-01 11:53:26 -0800258 ('_WIN32_WINNT', '0x0501'), # minimum required OS version
259 ('WINVER', '0x0501'),
José Fonseca381e3482008-07-17 11:23:43 +0900260 # http://msdn2.microsoft.com/en-us/library/6dwk3a1z.aspx,
261 'WIN32_LEAN_AND_MEAN',
José Fonseca381e3482008-07-17 11:23:43 +0900262 ]
José Fonseca71793e0f2009-04-14 21:39:54 +0100263 if msvc and env['toolchain'] != 'winddk':
José Fonsecab3e03ed2009-03-25 19:32:54 +0000264 cppdefines += [
265 'VC_EXTRALEAN',
266 '_CRT_SECURE_NO_DEPRECATE',
267 ]
José Fonseca381e3482008-07-17 11:23:43 +0900268 if debug:
269 cppdefines += ['_DEBUG']
José Fonseca71793e0f2009-04-14 21:39:54 +0100270 if env['toolchain'] == 'winddk':
José Fonseca381e3482008-07-17 11:23:43 +0900271 # Mimic WINDDK's builtin flags. See also:
272 # - WINDDK's bin/makefile.new i386mk.inc for more info.
273 # - buildchk_wxp_x86.log files, generated by the WINDDK's build
274 # - http://alter.org.ua/docs/nt_kernel/vc8_proj/
José Fonseca71793e0f2009-04-14 21:39:54 +0100275 if machine == 'x86':
276 cppdefines += ['_X86_', 'i386']
277 if machine == 'x86_64':
278 cppdefines += ['_AMD64_', 'AMD64']
279 if platform == 'winddk':
José Fonseca381e3482008-07-17 11:23:43 +0900280 cppdefines += [
José Fonseca381e3482008-07-17 11:23:43 +0900281 'STD_CALL',
282 ('CONDITION_HANDLING', '1'),
283 ('NT_INST', '0'),
284 ('WIN32', '100'),
285 ('_NT1X_', '100'),
286 ('WINNT', '1'),
287 ('_WIN32_WINNT', '0x0501'), # minimum required OS version
288 ('WINVER', '0x0501'),
289 ('_WIN32_IE', '0x0603'),
290 ('WIN32_LEAN_AND_MEAN', '1'),
291 ('DEVL', '1'),
292 ('__BUILDMACHINE__', 'WinDDK'),
293 ('FPO', '0'),
294 ]
295 if debug:
296 cppdefines += [('DBG', 1)]
297 if platform == 'wince':
298 cppdefines += [
299 '_CRT_SECURE_NO_DEPRECATE',
300 '_USE_32BIT_TIME_T',
301 'UNICODE',
302 '_UNICODE',
303 ('UNDER_CE', '600'),
304 ('_WIN32_WCE', '0x600'),
305 'WINCEOEM',
306 'WINCEINTERNAL',
307 'WIN32',
308 'STRICT',
309 'x86',
310 '_X86_',
311 'INTERNATIONAL',
312 ('INTLMSG_CODEPAGE', '1252'),
313 ]
314 if platform == 'windows':
315 cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_USER']
316 if platform == 'winddk':
317 cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_DISPLAY']
318 if platform == 'wince':
319 cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_CE']
José Fonseca40b3bb02008-11-04 10:53:02 +0900320 cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_CE_OGL']
José Fonseca381e3482008-07-17 11:23:43 +0900321 env.Append(CPPDEFINES = cppdefines)
José Fonsecab04aa712008-06-06 14:48:57 +0900322
José Fonseca381e3482008-07-17 11:23:43 +0900323 # C compiler options
José Fonseca25f6c932009-06-26 19:50:12 +0100324 cflags = [] # C
325 cxxflags = [] # C++
326 ccflags = [] # C & C++
José Fonseca381e3482008-07-17 11:23:43 +0900327 if gcc:
328 if debug:
José Fonseca25f6c932009-06-26 19:50:12 +0100329 ccflags += ['-O0', '-g3']
José Fonsecabb8f3092009-06-28 11:12:22 +0100330 elif env['CCVERSION'].startswith('4.2.'):
331 # gcc 4.2.x optimizer is broken
332 print "warning: gcc 4.2.x optimizer is broken -- disabling optimizations"
333 ccflags += ['-O0', '-g3']
José Fonseca381e3482008-07-17 11:23:43 +0900334 else:
José Fonseca25f6c932009-06-26 19:50:12 +0100335 ccflags += ['-O3', '-g3']
José Fonseca381e3482008-07-17 11:23:43 +0900336 if env['profile']:
José Fonseca1a9eec82009-09-20 18:07:16 +0100337 # See http://code.google.com/p/jrfonseca/wiki/Gprof2Dot#Which_options_should_I_pass_to_gcc_when_compiling_for_profiling?
338 ccflags += [
339 '-fno-omit-frame-pointer',
340 '-fno-optimize-sibling-calls',
341 ]
José Fonseca381e3482008-07-17 11:23:43 +0900342 if env['machine'] == 'x86':
José Fonseca25f6c932009-06-26 19:50:12 +0100343 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900344 '-m32',
345 #'-march=pentium4',
346 '-mmmx', '-msse', '-msse2', # enable SIMD intrinsics
José Fonsecab0b131b2009-09-09 21:45:08 +0100347 '-mstackrealign', # ensure stack is aligned -- do not enabled -msse without it!
José Fonseca381e3482008-07-17 11:23:43 +0900348 #'-mfpmath=sse',
349 ]
350 if env['machine'] == 'x86_64':
José Fonseca25f6c932009-06-26 19:50:12 +0100351 ccflags += ['-m64']
José Fonseca102cb5c2009-03-13 16:21:30 +0000352 # See also:
353 # - http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
José Fonseca25f6c932009-06-26 19:50:12 +0100354 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900355 '-Wall',
José Fonseca102cb5c2009-03-13 16:21:30 +0000356 '-Wmissing-field-initializers',
357 '-Wpointer-arith',
José Fonseca381e3482008-07-17 11:23:43 +0900358 '-Wno-long-long',
359 '-ffast-math',
José Fonseca381e3482008-07-17 11:23:43 +0900360 '-fmessage-length=0', # be nice to Eclipse
361 ]
José Fonseca25f6c932009-06-26 19:50:12 +0100362 cflags += [
363 '-Werror=declaration-after-statement',
364 '-Wmissing-prototypes',
365 '-std=gnu99',
366 ]
José Fonseca381e3482008-07-17 11:23:43 +0900367 if msvc:
368 # See also:
José Fonsecaa6c72582008-09-01 09:47:40 +0900369 # - http://msdn.microsoft.com/en-us/library/19z1t1wy.aspx
José Fonseca381e3482008-07-17 11:23:43 +0900370 # - cl /?
371 if debug:
José Fonseca25f6c932009-06-26 19:50:12 +0100372 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900373 '/Od', # disable optimizations
374 '/Oi', # enable intrinsic functions
375 '/Oy-', # disable frame pointer omission
José Fonseca73ccabc2009-02-12 11:57:45 +0000376 '/GL-', # disable whole program optimization
José Fonseca381e3482008-07-17 11:23:43 +0900377 ]
378 else:
José Fonseca25f6c932009-06-26 19:50:12 +0100379 ccflags += [
José Fonseca78dad272009-06-04 10:34:02 -0700380 '/O2', # optimize for speed
José Fonsecafc7f9242009-06-02 18:41:12 -0700381 #'/fp:fast', # fast floating point
José Fonseca381e3482008-07-17 11:23:43 +0900382 ]
383 if env['profile']:
José Fonseca25f6c932009-06-26 19:50:12 +0100384 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900385 '/Gh', # enable _penter hook function
386 '/GH', # enable _pexit hook function
387 ]
José Fonseca25f6c932009-06-26 19:50:12 +0100388 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900389 '/W3', # warning level
390 #'/Wp64', # enable 64 bit porting warnings
391 ]
José Fonsecaa6c72582008-09-01 09:47:40 +0900392 if env['machine'] == 'x86':
José Fonseca25f6c932009-06-26 19:50:12 +0100393 ccflags += [
José Fonsecaa6c72582008-09-01 09:47:40 +0900394 #'/QIfist', # Suppress _ftol
395 #'/arch:SSE2', # use the SSE2 instructions
396 ]
José Fonseca381e3482008-07-17 11:23:43 +0900397 if platform == 'windows':
José Fonseca25f6c932009-06-26 19:50:12 +0100398 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900399 # TODO
400 ]
401 if platform == 'winddk':
José Fonseca25f6c932009-06-26 19:50:12 +0100402 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900403 '/Zl', # omit default library name in .OBJ
404 '/Zp8', # 8bytes struct member alignment
405 '/Gy', # separate functions for linker
406 '/Gm-', # disable minimal rebuild
407 '/WX', # treat warnings as errors
408 '/Gz', # __stdcall Calling convention
409 '/GX-', # disable C++ EH
410 '/GR-', # disable C++ RTTI
411 '/GF', # enable read-only string pooling
412 '/G6', # optimize for PPro, P-II, P-III
413 '/Ze', # enable extensions
414 '/Gi-', # disable incremental compilation
415 '/QIfdiv-', # disable Pentium FDIV fix
416 '/hotpatch', # prepares an image for hotpatching.
417 #'/Z7', #enable old-style debug info
418 ]
419 if platform == 'wince':
420 # See also C:\WINCE600\public\common\oak\misc\makefile.def
José Fonseca25f6c932009-06-26 19:50:12 +0100421 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900422 '/Zl', # omit default library name in .OBJ
423 '/GF', # enable read-only string pooling
424 '/GR-', # disable C++ RTTI
425 '/GS', # enable security checks
426 # Allow disabling language conformance to maintain backward compat
427 #'/Zc:wchar_t-', # don't force wchar_t as native type, instead of typedef
428 #'/Zc:forScope-', # don't enforce Standard C++ for scoping rules
429 #'/wd4867',
430 #'/wd4430',
431 #'/MT',
432 #'/U_MT',
433 ]
434 # Automatic pdb generation
435 # See http://scons.tigris.org/issues/show_bug.cgi?id=1656
436 env.EnsureSConsVersion(0, 98, 0)
437 env['PDB'] = '${TARGET.base}.pdb'
José Fonseca25f6c932009-06-26 19:50:12 +0100438 env.Append(CCFLAGS = ccflags)
José Fonseca381e3482008-07-17 11:23:43 +0900439 env.Append(CFLAGS = cflags)
José Fonseca25f6c932009-06-26 19:50:12 +0100440 env.Append(CXXFLAGS = cxxflags)
José Fonsecab04aa712008-06-06 14:48:57 +0900441
José Fonseca1781d7f2009-01-06 16:16:38 +0000442 if env['platform'] == 'windows' and msvc:
443 # Choose the appropriate MSVC CRT
444 # http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
445 if env['debug']:
446 env.Append(CCFLAGS = ['/MTd'])
447 env.Append(SHCCFLAGS = ['/LDd'])
448 else:
449 env.Append(CCFLAGS = ['/MT'])
450 env.Append(SHCCFLAGS = ['/LD'])
451
José Fonseca381e3482008-07-17 11:23:43 +0900452 # Assembler options
453 if gcc:
454 if env['machine'] == 'x86':
455 env.Append(ASFLAGS = ['-m32'])
456 if env['machine'] == 'x86_64':
457 env.Append(ASFLAGS = ['-m64'])
José Fonseca27d8d6f2008-07-03 12:42:23 +0900458
José Fonseca381e3482008-07-17 11:23:43 +0900459 # Linker options
460 linkflags = []
José Fonseca72ad0392009-06-28 10:54:23 +0100461 shlinkflags = []
José Fonseca381e3482008-07-17 11:23:43 +0900462 if gcc:
463 if env['machine'] == 'x86':
464 linkflags += ['-m32']
465 if env['machine'] == 'x86_64':
466 linkflags += ['-m64']
José Fonseca72ad0392009-06-28 10:54:23 +0100467 shlinkflags += [
468 '-Wl,-Bsymbolic',
469 ]
José Fonseca7b391942009-08-13 16:32:51 +0100470 # Handle circular dependencies in the libraries
471 env['_LIBFLAGS'] = '-Wl,--start-group ' + env['_LIBFLAGS'] + ' -Wl,--end-group'
José Fonseca6fe421c2009-02-12 12:59:58 +0000472 if platform == 'windows' and msvc:
José Fonseca381e3482008-07-17 11:23:43 +0900473 # See also:
474 # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx
475 linkflags += [
José Fonseca73ccabc2009-02-12 11:57:45 +0000476 '/fixed:no',
477 '/incremental:no',
478 ]
479 if platform == 'winddk':
480 linkflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900481 '/merge:_PAGE=PAGE',
482 '/merge:_TEXT=.text',
483 '/section:INIT,d',
484 '/opt:ref',
485 '/opt:icf',
486 '/ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221',
487 '/incremental:no',
488 '/fullbuild',
489 '/release',
490 '/nodefaultlib',
491 '/wx',
492 '/debug',
493 '/debugtype:cv',
494 '/version:5.1',
495 '/osversion:5.1',
496 '/functionpadmin:5',
497 '/safeseh',
498 '/pdbcompress',
499 '/stack:0x40000,0x1000',
500 '/driver',
501 '/align:0x80',
502 '/subsystem:native,5.01',
503 '/base:0x10000',
504
505 '/entry:DrvEnableDriver',
506 ]
José Fonseca46728032009-02-18 15:05:23 +0000507 if env['debug'] or env['profile']:
José Fonseca381e3482008-07-17 11:23:43 +0900508 linkflags += [
509 '/MAP', # http://msdn.microsoft.com/en-us/library/k7xkk3e2.aspx
510 ]
511 if platform == 'wince':
512 linkflags += [
513 '/nodefaultlib',
514 #'/incremental:no',
515 #'/fullbuild',
516 '/entry:_DllMainCRTStartup',
517 ]
518 env.Append(LINKFLAGS = linkflags)
José Fonseca72ad0392009-06-28 10:54:23 +0100519 env.Append(SHLINKFLAGS = shlinkflags)
José Fonseca381e3482008-07-17 11:23:43 +0900520
José Fonsecac76787a2008-07-17 11:25:20 +0900521 # Default libs
522 env.Append(LIBS = [])
523
José Fonseca381e3482008-07-17 11:23:43 +0900524 # Custom builders and methods
525 createConvenienceLibBuilder(env)
526 createCodeGenerateMethod(env)
José Fonseca52c2dd12008-09-08 07:54:15 +0900527 createInstallMethods(env)
José Fonseca381e3482008-07-17 11:23:43 +0900528
529 # for debugging
530 #print env.Dump()
José Fonsecab04aa712008-06-06 14:48:57 +0900531
532
533def exists(env):
José Fonseca381e3482008-07-17 11:23:43 +0900534 return 1