blob: 8082aba6f2f6e32db8fcb32bb49a85ec6863c7e7 [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
José Fonseca0f50c4f2009-06-02 18:23:12 -070047 env['ASCOMSTR'] = "Assembling $SOURCE ..."
José Fonseca381e3482008-07-17 11:23:43 +090048 env['CCCOMSTR'] = "Compiling $SOURCE ..."
José Fonseca0f50c4f2009-06-02 18:23:12 -070049 env['SHCCCOMSTR'] = "Compiling $SOURCE ..."
José Fonseca381e3482008-07-17 11:23:43 +090050 env['CXXCOMSTR'] = "Compiling $SOURCE ..."
José Fonseca0f50c4f2009-06-02 18:23:12 -070051 env['SHCXXCOMSTR'] = "Compiling $SOURCE ..."
José Fonseca381e3482008-07-17 11:23:43 +090052 env['ARCOMSTR'] = "Archiving $TARGET ..."
José Fonseca0f50c4f2009-06-02 18:23:12 -070053 env['RANLIBCOMSTR'] = "Indexing $TARGET ..."
José Fonseca381e3482008-07-17 11:23:43 +090054 env['LINKCOMSTR'] = "Linking $TARGET ..."
José Fonseca0f50c4f2009-06-02 18:23:12 -070055 env['SHLINKCOMSTR'] = "Linking $TARGET ..."
56 env['LDMODULECOMSTR'] = "Linking $TARGET ..."
57 env['SWIGCOMSTR'] = "Generating $TARGET ..."
José Fonsecab04aa712008-06-06 14:48:57 +090058
59
60def createConvenienceLibBuilder(env):
61 """This is a utility function that creates the ConvenienceLibrary
62 Builder in an Environment if it is not there already.
63
64 If it is already there, we return the existing one.
José Fonseca381e3482008-07-17 11:23:43 +090065
José Fonsecab04aa712008-06-06 14:48:57 +090066 Based on the stock StaticLibrary and SharedLibrary builders.
67 """
68
69 try:
70 convenience_lib = env['BUILDERS']['ConvenienceLibrary']
71 except KeyError:
72 action_list = [ SCons.Action.Action("$ARCOM", "$ARCOMSTR") ]
73 if env.Detect('ranlib'):
74 ranlib_action = SCons.Action.Action("$RANLIBCOM", "$RANLIBCOMSTR")
75 action_list.append(ranlib_action)
76
77 convenience_lib = SCons.Builder.Builder(action = action_list,
78 emitter = '$LIBEMITTER',
79 prefix = '$LIBPREFIX',
80 suffix = '$LIBSUFFIX',
81 src_suffix = '$SHOBJSUFFIX',
82 src_builder = 'SharedObject')
83 env['BUILDERS']['ConvenienceLibrary'] = convenience_lib
José Fonsecab04aa712008-06-06 14:48:57 +090084
85 return convenience_lib
86
87
José Fonseca27d8d6f2008-07-03 12:42:23 +090088# TODO: handle import statements with multiple modules
89# TODO: handle from import statements
90import_re = re.compile(r'^import\s+(\S+)$', re.M)
91
92def python_scan(node, env, path):
José Fonseca381e3482008-07-17 11:23:43 +090093 # http://www.scons.org/doc/0.98.5/HTML/scons-user/c2781.html#AEN2789
94 contents = node.get_contents()
95 source_dir = node.get_dir()
96 imports = import_re.findall(contents)
97 results = []
98 for imp in imports:
99 for dir in path:
100 file = os.path.join(str(dir), imp.replace('.', os.sep) + '.py')
101 if os.path.exists(file):
102 results.append(env.File(file))
103 break
104 file = os.path.join(str(dir), imp.replace('.', os.sep), '__init__.py')
105 if os.path.exists(file):
106 results.append(env.File(file))
107 break
108 return results
José Fonseca27d8d6f2008-07-03 12:42:23 +0900109
110python_scanner = SCons.Scanner.Scanner(function = python_scan, skeys = ['.py'])
111
112
113def code_generate(env, script, target, source, command):
José Fonseca381e3482008-07-17 11:23:43 +0900114 """Method to simplify code generation via python scripts.
José Fonseca27d8d6f2008-07-03 12:42:23 +0900115
José Fonseca381e3482008-07-17 11:23:43 +0900116 http://www.scons.org/wiki/UsingCodeGenerators
117 http://www.scons.org/doc/0.98.5/HTML/scons-user/c2768.html
118 """
119
120 # We're generating code using Python scripts, so we have to be
121 # careful with our scons elements. This entry represents
122 # the generator file *in the source directory*.
123 script_src = env.File(script).srcnode()
124
125 # This command creates generated code *in the build directory*.
126 command = command.replace('$SCRIPT', script_src.path)
127 code = env.Command(target, source, command)
128
129 # Explicitly mark that the generated code depends on the generator,
130 # and on implicitly imported python modules
131 path = (script_src.get_dir(),)
132 deps = [script_src]
133 deps += script_src.get_implicit_deps(env, python_scanner, path)
134 env.Depends(code, deps)
135
136 # Running the Python script causes .pyc files to be generated in the
137 # source directory. When we clean up, they should go too. So add side
138 # effects for .pyc files
139 for dep in deps:
140 pyc = env.File(str(dep) + 'c')
141 env.SideEffect(pyc, code)
142
143 return code
José Fonseca27d8d6f2008-07-03 12:42:23 +0900144
145
146def createCodeGenerateMethod(env):
José Fonseca381e3482008-07-17 11:23:43 +0900147 env.Append(SCANNERS = python_scanner)
148 env.AddMethod(code_generate, 'CodeGenerate')
José Fonseca27d8d6f2008-07-03 12:42:23 +0900149
150
José Fonseca52c2dd12008-09-08 07:54:15 +0900151def symlink(target, source, env):
152 target = str(target[0])
153 source = str(source[0])
154 if os.path.islink(target) or os.path.exists(target):
155 os.remove(target)
156 os.symlink(os.path.basename(source), target)
157
158def install_shared_library(env, source, version = ()):
159 source = str(source[0])
160 version = tuple(map(str, version))
José Fonseca7cfc2942008-09-08 21:50:50 +0900161 target_dir = os.path.join(env.Dir('#.').srcnode().abspath, env['build'], 'lib')
José Fonseca52c2dd12008-09-08 07:54:15 +0900162 target_name = '.'.join((str(source),) + version)
163 last = env.InstallAs(os.path.join(target_dir, target_name), source)
164 while len(version):
165 version = version[:-1]
166 target_name = '.'.join((str(source),) + version)
167 action = SCons.Action.Action(symlink, "$TARGET -> $SOURCE")
José Fonseca52c2dd12008-09-08 07:54:15 +0900168 last = env.Command(os.path.join(target_dir, target_name), last, action)
169
170def createInstallMethods(env):
171 env.AddMethod(install_shared_library, 'InstallSharedLibrary')
172
173
José Fonseca1e8177e2009-02-10 18:11:56 +0000174def num_jobs():
175 try:
176 return int(os.environ['NUMBER_OF_PROCESSORS'])
177 except (ValueError, KeyError):
178 pass
179
180 try:
181 return os.sysconf('SC_NPROCESSORS_ONLN')
182 except (ValueError, OSError, AttributeError):
183 pass
184
185 try:
186 return int(os.popen2("sysctl -n hw.ncpu")[1].read())
187 except ValueError:
188 pass
189
190 return 1
191
192
José Fonsecab04aa712008-06-06 14:48:57 +0900193def generate(env):
José Fonseca381e3482008-07-17 11:23:43 +0900194 """Common environment generation code"""
José Fonsecab04aa712008-06-06 14:48:57 +0900195
José Fonseca0f50c4f2009-06-02 18:23:12 -0700196 if env.get('quiet', True):
197 quietCommandLines(env)
José Fonsecab04aa712008-06-06 14:48:57 +0900198
José Fonseca6cf59e12008-11-18 19:13:32 +0900199 # Toolchain
200 platform = env['platform']
201 if env['toolchain'] == 'default':
202 if platform == 'winddk':
Michal Krol4f3dcf32008-11-19 20:31:38 +0100203 env['toolchain'] = 'winddk'
José Fonseca6cf59e12008-11-18 19:13:32 +0900204 elif platform == 'wince':
Michal Krol4f3dcf32008-11-19 20:31:38 +0100205 env['toolchain'] = 'wcesdk'
José Fonseca6cf59e12008-11-18 19:13:32 +0900206 env.Tool(env['toolchain'])
207
José Fonseca26e27ba2009-03-25 19:24:16 +0000208 env['gcc'] = 'gcc' in os.path.basename(env['CC']).split('-')
209 env['msvc'] = env['CC'] == 'cl'
210
José Fonseca381e3482008-07-17 11:23:43 +0900211 # shortcuts
212 debug = env['debug']
213 machine = env['machine']
214 platform = env['platform']
215 x86 = env['machine'] == 'x86'
Michel Dänzer6b69e3c2008-10-23 10:28:48 +0200216 ppc = env['machine'] == 'ppc'
José Fonseca26e27ba2009-03-25 19:24:16 +0000217 gcc = env['gcc']
218 msvc = env['msvc']
José Fonsecab04aa712008-06-06 14:48:57 +0900219
José Fonseca381e3482008-07-17 11:23:43 +0900220 # Put build output in a separate dir, which depends on the current
221 # configuration. See also http://www.scons.org/wiki/AdvancedBuildExample
222 build_topdir = 'build'
223 build_subdir = env['platform']
José Fonseca381e3482008-07-17 11:23:43 +0900224 if env['llvm']:
225 build_subdir += "-llvm"
226 if env['machine'] != 'generic':
227 build_subdir += '-' + env['machine']
228 if env['debug']:
229 build_subdir += "-debug"
230 if env['profile']:
231 build_subdir += "-profile"
232 build_dir = os.path.join(build_topdir, build_subdir)
233 # Place the .sconsign file in the build dir too, to avoid issues with
234 # different scons versions building the same source file
235 env['build'] = build_dir
236 env.SConsignFile(os.path.join(build_dir, '.sconsign'))
José Fonseca18170bb2009-01-23 21:01:16 +0000237 env.CacheDir('build/cache')
José Fonsecab04aa712008-06-06 14:48:57 +0900238
José Fonseca1e8177e2009-02-10 18:11:56 +0000239 # Parallel build
240 if env.GetOption('num_jobs') <= 1:
241 env.SetOption('num_jobs', num_jobs())
242
José Fonseca381e3482008-07-17 11:23:43 +0900243 # C preprocessor options
244 cppdefines = []
245 if debug:
246 cppdefines += ['DEBUG']
247 else:
248 cppdefines += ['NDEBUG']
249 if env['profile']:
250 cppdefines += ['PROFILE']
251 if platform == 'windows':
252 cppdefines += [
253 'WIN32',
254 '_WINDOWS',
José Fonseca42be0102009-01-22 14:26:30 +0000255 #'_UNICODE',
256 #'UNICODE',
José Fonseca129c6ed2008-12-01 11:53:26 -0800257 ('_WIN32_WINNT', '0x0501'), # minimum required OS version
258 ('WINVER', '0x0501'),
José Fonseca381e3482008-07-17 11:23:43 +0900259 # http://msdn2.microsoft.com/en-us/library/6dwk3a1z.aspx,
260 'WIN32_LEAN_AND_MEAN',
José Fonseca381e3482008-07-17 11:23:43 +0900261 ]
José Fonseca71793e0f2009-04-14 21:39:54 +0100262 if msvc and env['toolchain'] != 'winddk':
José Fonsecab3e03ed2009-03-25 19:32:54 +0000263 cppdefines += [
264 'VC_EXTRALEAN',
265 '_CRT_SECURE_NO_DEPRECATE',
266 ]
José Fonseca381e3482008-07-17 11:23:43 +0900267 if debug:
268 cppdefines += ['_DEBUG']
José Fonseca71793e0f2009-04-14 21:39:54 +0100269 if env['toolchain'] == 'winddk':
José Fonseca381e3482008-07-17 11:23:43 +0900270 # Mimic WINDDK's builtin flags. See also:
271 # - WINDDK's bin/makefile.new i386mk.inc for more info.
272 # - buildchk_wxp_x86.log files, generated by the WINDDK's build
273 # - http://alter.org.ua/docs/nt_kernel/vc8_proj/
José Fonseca71793e0f2009-04-14 21:39:54 +0100274 if machine == 'x86':
275 cppdefines += ['_X86_', 'i386']
276 if machine == 'x86_64':
277 cppdefines += ['_AMD64_', 'AMD64']
278 if platform == 'winddk':
José Fonseca381e3482008-07-17 11:23:43 +0900279 cppdefines += [
José Fonseca381e3482008-07-17 11:23:43 +0900280 'STD_CALL',
281 ('CONDITION_HANDLING', '1'),
282 ('NT_INST', '0'),
283 ('WIN32', '100'),
284 ('_NT1X_', '100'),
285 ('WINNT', '1'),
286 ('_WIN32_WINNT', '0x0501'), # minimum required OS version
287 ('WINVER', '0x0501'),
288 ('_WIN32_IE', '0x0603'),
289 ('WIN32_LEAN_AND_MEAN', '1'),
290 ('DEVL', '1'),
291 ('__BUILDMACHINE__', 'WinDDK'),
292 ('FPO', '0'),
293 ]
294 if debug:
295 cppdefines += [('DBG', 1)]
296 if platform == 'wince':
297 cppdefines += [
298 '_CRT_SECURE_NO_DEPRECATE',
299 '_USE_32BIT_TIME_T',
300 'UNICODE',
301 '_UNICODE',
302 ('UNDER_CE', '600'),
303 ('_WIN32_WCE', '0x600'),
304 'WINCEOEM',
305 'WINCEINTERNAL',
306 'WIN32',
307 'STRICT',
308 'x86',
309 '_X86_',
310 'INTERNATIONAL',
311 ('INTLMSG_CODEPAGE', '1252'),
312 ]
313 if platform == 'windows':
314 cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_USER']
315 if platform == 'winddk':
316 cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_DISPLAY']
317 if platform == 'wince':
318 cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_CE']
José Fonseca40b3bb02008-11-04 10:53:02 +0900319 cppdefines += ['PIPE_SUBSYSTEM_WINDOWS_CE_OGL']
José Fonseca381e3482008-07-17 11:23:43 +0900320 env.Append(CPPDEFINES = cppdefines)
José Fonsecab04aa712008-06-06 14:48:57 +0900321
José Fonseca381e3482008-07-17 11:23:43 +0900322 # C compiler options
José Fonseca25f6c932009-06-26 19:50:12 +0100323 cflags = [] # C
324 cxxflags = [] # C++
325 ccflags = [] # C & C++
José Fonseca381e3482008-07-17 11:23:43 +0900326 if gcc:
327 if debug:
José Fonseca25f6c932009-06-26 19:50:12 +0100328 ccflags += ['-O0', '-g3']
José Fonsecabb8f3092009-06-28 11:12:22 +0100329 elif env['CCVERSION'].startswith('4.2.'):
330 # gcc 4.2.x optimizer is broken
331 print "warning: gcc 4.2.x optimizer is broken -- disabling optimizations"
332 ccflags += ['-O0', '-g3']
José Fonseca381e3482008-07-17 11:23:43 +0900333 else:
José Fonseca25f6c932009-06-26 19:50:12 +0100334 ccflags += ['-O3', '-g3']
José Fonseca381e3482008-07-17 11:23:43 +0900335 if env['profile']:
José Fonseca25f6c932009-06-26 19:50:12 +0100336 ccflags += ['-pg']
José Fonseca381e3482008-07-17 11:23:43 +0900337 if env['machine'] == 'x86':
José Fonseca25f6c932009-06-26 19:50:12 +0100338 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900339 '-m32',
340 #'-march=pentium4',
341 '-mmmx', '-msse', '-msse2', # enable SIMD intrinsics
342 #'-mfpmath=sse',
343 ]
344 if env['machine'] == 'x86_64':
José Fonseca25f6c932009-06-26 19:50:12 +0100345 ccflags += ['-m64']
José Fonseca102cb5c2009-03-13 16:21:30 +0000346 # See also:
347 # - http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
José Fonseca25f6c932009-06-26 19:50:12 +0100348 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900349 '-Wall',
José Fonseca102cb5c2009-03-13 16:21:30 +0000350 '-Wmissing-field-initializers',
351 '-Wpointer-arith',
José Fonseca381e3482008-07-17 11:23:43 +0900352 '-Wno-long-long',
353 '-ffast-math',
José Fonseca381e3482008-07-17 11:23:43 +0900354 '-fmessage-length=0', # be nice to Eclipse
355 ]
José Fonseca25f6c932009-06-26 19:50:12 +0100356 cflags += [
357 '-Werror=declaration-after-statement',
358 '-Wmissing-prototypes',
359 '-std=gnu99',
360 ]
José Fonseca381e3482008-07-17 11:23:43 +0900361 if msvc:
362 # See also:
José Fonsecaa6c72582008-09-01 09:47:40 +0900363 # - http://msdn.microsoft.com/en-us/library/19z1t1wy.aspx
José Fonseca381e3482008-07-17 11:23:43 +0900364 # - cl /?
365 if debug:
José Fonseca25f6c932009-06-26 19:50:12 +0100366 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900367 '/Od', # disable optimizations
368 '/Oi', # enable intrinsic functions
369 '/Oy-', # disable frame pointer omission
José Fonseca73ccabc2009-02-12 11:57:45 +0000370 '/GL-', # disable whole program optimization
José Fonseca381e3482008-07-17 11:23:43 +0900371 ]
372 else:
José Fonseca25f6c932009-06-26 19:50:12 +0100373 ccflags += [
José Fonseca78dad272009-06-04 10:34:02 -0700374 '/O2', # optimize for speed
José Fonsecafc7f9242009-06-02 18:41:12 -0700375 #'/fp:fast', # fast floating point
José Fonseca381e3482008-07-17 11:23:43 +0900376 ]
377 if env['profile']:
José Fonseca25f6c932009-06-26 19:50:12 +0100378 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900379 '/Gh', # enable _penter hook function
380 '/GH', # enable _pexit hook function
381 ]
José Fonseca25f6c932009-06-26 19:50:12 +0100382 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900383 '/W3', # warning level
384 #'/Wp64', # enable 64 bit porting warnings
385 ]
José Fonsecaa6c72582008-09-01 09:47:40 +0900386 if env['machine'] == 'x86':
José Fonseca25f6c932009-06-26 19:50:12 +0100387 ccflags += [
José Fonsecaa6c72582008-09-01 09:47:40 +0900388 #'/QIfist', # Suppress _ftol
389 #'/arch:SSE2', # use the SSE2 instructions
390 ]
José Fonseca381e3482008-07-17 11:23:43 +0900391 if platform == 'windows':
José Fonseca25f6c932009-06-26 19:50:12 +0100392 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900393 # TODO
394 ]
395 if platform == 'winddk':
José Fonseca25f6c932009-06-26 19:50:12 +0100396 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900397 '/Zl', # omit default library name in .OBJ
398 '/Zp8', # 8bytes struct member alignment
399 '/Gy', # separate functions for linker
400 '/Gm-', # disable minimal rebuild
401 '/WX', # treat warnings as errors
402 '/Gz', # __stdcall Calling convention
403 '/GX-', # disable C++ EH
404 '/GR-', # disable C++ RTTI
405 '/GF', # enable read-only string pooling
406 '/G6', # optimize for PPro, P-II, P-III
407 '/Ze', # enable extensions
408 '/Gi-', # disable incremental compilation
409 '/QIfdiv-', # disable Pentium FDIV fix
410 '/hotpatch', # prepares an image for hotpatching.
411 #'/Z7', #enable old-style debug info
412 ]
413 if platform == 'wince':
414 # See also C:\WINCE600\public\common\oak\misc\makefile.def
José Fonseca25f6c932009-06-26 19:50:12 +0100415 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900416 '/Zl', # omit default library name in .OBJ
417 '/GF', # enable read-only string pooling
418 '/GR-', # disable C++ RTTI
419 '/GS', # enable security checks
420 # Allow disabling language conformance to maintain backward compat
421 #'/Zc:wchar_t-', # don't force wchar_t as native type, instead of typedef
422 #'/Zc:forScope-', # don't enforce Standard C++ for scoping rules
423 #'/wd4867',
424 #'/wd4430',
425 #'/MT',
426 #'/U_MT',
427 ]
428 # Automatic pdb generation
429 # See http://scons.tigris.org/issues/show_bug.cgi?id=1656
430 env.EnsureSConsVersion(0, 98, 0)
431 env['PDB'] = '${TARGET.base}.pdb'
José Fonseca25f6c932009-06-26 19:50:12 +0100432 env.Append(CCFLAGS = ccflags)
José Fonseca381e3482008-07-17 11:23:43 +0900433 env.Append(CFLAGS = cflags)
José Fonseca25f6c932009-06-26 19:50:12 +0100434 env.Append(CXXFLAGS = cxxflags)
José Fonsecab04aa712008-06-06 14:48:57 +0900435
José Fonseca1781d7f2009-01-06 16:16:38 +0000436 if env['platform'] == 'windows' and msvc:
437 # Choose the appropriate MSVC CRT
438 # http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
439 if env['debug']:
440 env.Append(CCFLAGS = ['/MTd'])
441 env.Append(SHCCFLAGS = ['/LDd'])
442 else:
443 env.Append(CCFLAGS = ['/MT'])
444 env.Append(SHCCFLAGS = ['/LD'])
445
José Fonseca381e3482008-07-17 11:23:43 +0900446 # Assembler options
447 if gcc:
448 if env['machine'] == 'x86':
449 env.Append(ASFLAGS = ['-m32'])
450 if env['machine'] == 'x86_64':
451 env.Append(ASFLAGS = ['-m64'])
José Fonseca27d8d6f2008-07-03 12:42:23 +0900452
José Fonseca381e3482008-07-17 11:23:43 +0900453 # Linker options
454 linkflags = []
José Fonseca72ad0392009-06-28 10:54:23 +0100455 shlinkflags = []
José Fonseca381e3482008-07-17 11:23:43 +0900456 if gcc:
457 if env['machine'] == 'x86':
458 linkflags += ['-m32']
459 if env['machine'] == 'x86_64':
460 linkflags += ['-m64']
José Fonseca72ad0392009-06-28 10:54:23 +0100461 shlinkflags += [
462 '-Wl,-Bsymbolic',
463 ]
José Fonseca6fe421c2009-02-12 12:59:58 +0000464 if platform == 'windows' and msvc:
José Fonseca381e3482008-07-17 11:23:43 +0900465 # See also:
466 # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx
467 linkflags += [
José Fonseca73ccabc2009-02-12 11:57:45 +0000468 '/fixed:no',
469 '/incremental:no',
470 ]
471 if platform == 'winddk':
472 linkflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900473 '/merge:_PAGE=PAGE',
474 '/merge:_TEXT=.text',
475 '/section:INIT,d',
476 '/opt:ref',
477 '/opt:icf',
478 '/ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221',
479 '/incremental:no',
480 '/fullbuild',
481 '/release',
482 '/nodefaultlib',
483 '/wx',
484 '/debug',
485 '/debugtype:cv',
486 '/version:5.1',
487 '/osversion:5.1',
488 '/functionpadmin:5',
489 '/safeseh',
490 '/pdbcompress',
491 '/stack:0x40000,0x1000',
492 '/driver',
493 '/align:0x80',
494 '/subsystem:native,5.01',
495 '/base:0x10000',
496
497 '/entry:DrvEnableDriver',
498 ]
José Fonseca46728032009-02-18 15:05:23 +0000499 if env['debug'] or env['profile']:
José Fonseca381e3482008-07-17 11:23:43 +0900500 linkflags += [
501 '/MAP', # http://msdn.microsoft.com/en-us/library/k7xkk3e2.aspx
502 ]
503 if platform == 'wince':
504 linkflags += [
505 '/nodefaultlib',
506 #'/incremental:no',
507 #'/fullbuild',
508 '/entry:_DllMainCRTStartup',
509 ]
510 env.Append(LINKFLAGS = linkflags)
José Fonseca72ad0392009-06-28 10:54:23 +0100511 env.Append(SHLINKFLAGS = shlinkflags)
José Fonseca381e3482008-07-17 11:23:43 +0900512
José Fonsecac76787a2008-07-17 11:25:20 +0900513 # Default libs
514 env.Append(LIBS = [])
515
José Fonseca381e3482008-07-17 11:23:43 +0900516 # Custom builders and methods
517 createConvenienceLibBuilder(env)
518 createCodeGenerateMethod(env)
José Fonseca52c2dd12008-09-08 07:54:15 +0900519 createInstallMethods(env)
José Fonseca381e3482008-07-17 11:23:43 +0900520
521 # for debugging
522 #print env.Dump()
José Fonsecab04aa712008-06-06 14:48:57 +0900523
524
525def exists(env):
José Fonseca381e3482008-07-17 11:23:43 +0900526 return 1