blob: 47b07744be9d80ed500c791d38f50f0e5f3c0ef4 [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é Fonseca25f6c932009-06-26 19:50:12 +0100337 ccflags += ['-pg']
José Fonseca381e3482008-07-17 11:23:43 +0900338 if env['machine'] == 'x86':
José Fonseca25f6c932009-06-26 19:50:12 +0100339 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900340 '-m32',
341 #'-march=pentium4',
342 '-mmmx', '-msse', '-msse2', # enable SIMD intrinsics
José Fonsecab0b131b2009-09-09 21:45:08 +0100343 '-mstackrealign', # ensure stack is aligned -- do not enabled -msse without it!
José Fonseca381e3482008-07-17 11:23:43 +0900344 #'-mfpmath=sse',
345 ]
346 if env['machine'] == 'x86_64':
José Fonseca25f6c932009-06-26 19:50:12 +0100347 ccflags += ['-m64']
José Fonseca102cb5c2009-03-13 16:21:30 +0000348 # See also:
349 # - http://gcc.gnu.org/onlinedocs/gcc/Warning-Options.html
José Fonseca25f6c932009-06-26 19:50:12 +0100350 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900351 '-Wall',
José Fonseca102cb5c2009-03-13 16:21:30 +0000352 '-Wmissing-field-initializers',
353 '-Wpointer-arith',
José Fonseca381e3482008-07-17 11:23:43 +0900354 '-Wno-long-long',
355 '-ffast-math',
José Fonseca381e3482008-07-17 11:23:43 +0900356 '-fmessage-length=0', # be nice to Eclipse
357 ]
José Fonseca25f6c932009-06-26 19:50:12 +0100358 cflags += [
359 '-Werror=declaration-after-statement',
360 '-Wmissing-prototypes',
361 '-std=gnu99',
362 ]
José Fonseca381e3482008-07-17 11:23:43 +0900363 if msvc:
364 # See also:
José Fonsecaa6c72582008-09-01 09:47:40 +0900365 # - http://msdn.microsoft.com/en-us/library/19z1t1wy.aspx
José Fonseca381e3482008-07-17 11:23:43 +0900366 # - cl /?
367 if debug:
José Fonseca25f6c932009-06-26 19:50:12 +0100368 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900369 '/Od', # disable optimizations
370 '/Oi', # enable intrinsic functions
371 '/Oy-', # disable frame pointer omission
José Fonseca73ccabc2009-02-12 11:57:45 +0000372 '/GL-', # disable whole program optimization
José Fonseca381e3482008-07-17 11:23:43 +0900373 ]
374 else:
José Fonseca25f6c932009-06-26 19:50:12 +0100375 ccflags += [
José Fonseca78dad272009-06-04 10:34:02 -0700376 '/O2', # optimize for speed
José Fonsecafc7f9242009-06-02 18:41:12 -0700377 #'/fp:fast', # fast floating point
José Fonseca381e3482008-07-17 11:23:43 +0900378 ]
379 if env['profile']:
José Fonseca25f6c932009-06-26 19:50:12 +0100380 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900381 '/Gh', # enable _penter hook function
382 '/GH', # enable _pexit hook function
383 ]
José Fonseca25f6c932009-06-26 19:50:12 +0100384 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900385 '/W3', # warning level
386 #'/Wp64', # enable 64 bit porting warnings
387 ]
José Fonsecaa6c72582008-09-01 09:47:40 +0900388 if env['machine'] == 'x86':
José Fonseca25f6c932009-06-26 19:50:12 +0100389 ccflags += [
José Fonsecaa6c72582008-09-01 09:47:40 +0900390 #'/QIfist', # Suppress _ftol
391 #'/arch:SSE2', # use the SSE2 instructions
392 ]
José Fonseca381e3482008-07-17 11:23:43 +0900393 if platform == 'windows':
José Fonseca25f6c932009-06-26 19:50:12 +0100394 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900395 # TODO
396 ]
397 if platform == 'winddk':
José Fonseca25f6c932009-06-26 19:50:12 +0100398 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900399 '/Zl', # omit default library name in .OBJ
400 '/Zp8', # 8bytes struct member alignment
401 '/Gy', # separate functions for linker
402 '/Gm-', # disable minimal rebuild
403 '/WX', # treat warnings as errors
404 '/Gz', # __stdcall Calling convention
405 '/GX-', # disable C++ EH
406 '/GR-', # disable C++ RTTI
407 '/GF', # enable read-only string pooling
408 '/G6', # optimize for PPro, P-II, P-III
409 '/Ze', # enable extensions
410 '/Gi-', # disable incremental compilation
411 '/QIfdiv-', # disable Pentium FDIV fix
412 '/hotpatch', # prepares an image for hotpatching.
413 #'/Z7', #enable old-style debug info
414 ]
415 if platform == 'wince':
416 # See also C:\WINCE600\public\common\oak\misc\makefile.def
José Fonseca25f6c932009-06-26 19:50:12 +0100417 ccflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900418 '/Zl', # omit default library name in .OBJ
419 '/GF', # enable read-only string pooling
420 '/GR-', # disable C++ RTTI
421 '/GS', # enable security checks
422 # Allow disabling language conformance to maintain backward compat
423 #'/Zc:wchar_t-', # don't force wchar_t as native type, instead of typedef
424 #'/Zc:forScope-', # don't enforce Standard C++ for scoping rules
425 #'/wd4867',
426 #'/wd4430',
427 #'/MT',
428 #'/U_MT',
429 ]
430 # Automatic pdb generation
431 # See http://scons.tigris.org/issues/show_bug.cgi?id=1656
432 env.EnsureSConsVersion(0, 98, 0)
433 env['PDB'] = '${TARGET.base}.pdb'
José Fonseca25f6c932009-06-26 19:50:12 +0100434 env.Append(CCFLAGS = ccflags)
José Fonseca381e3482008-07-17 11:23:43 +0900435 env.Append(CFLAGS = cflags)
José Fonseca25f6c932009-06-26 19:50:12 +0100436 env.Append(CXXFLAGS = cxxflags)
José Fonsecab04aa712008-06-06 14:48:57 +0900437
José Fonseca1781d7f2009-01-06 16:16:38 +0000438 if env['platform'] == 'windows' and msvc:
439 # Choose the appropriate MSVC CRT
440 # http://msdn.microsoft.com/en-us/library/2kzt1wy3.aspx
441 if env['debug']:
442 env.Append(CCFLAGS = ['/MTd'])
443 env.Append(SHCCFLAGS = ['/LDd'])
444 else:
445 env.Append(CCFLAGS = ['/MT'])
446 env.Append(SHCCFLAGS = ['/LD'])
447
José Fonseca381e3482008-07-17 11:23:43 +0900448 # Assembler options
449 if gcc:
450 if env['machine'] == 'x86':
451 env.Append(ASFLAGS = ['-m32'])
452 if env['machine'] == 'x86_64':
453 env.Append(ASFLAGS = ['-m64'])
José Fonseca27d8d6f2008-07-03 12:42:23 +0900454
José Fonseca381e3482008-07-17 11:23:43 +0900455 # Linker options
456 linkflags = []
José Fonseca72ad0392009-06-28 10:54:23 +0100457 shlinkflags = []
José Fonseca381e3482008-07-17 11:23:43 +0900458 if gcc:
459 if env['machine'] == 'x86':
460 linkflags += ['-m32']
461 if env['machine'] == 'x86_64':
462 linkflags += ['-m64']
José Fonseca72ad0392009-06-28 10:54:23 +0100463 shlinkflags += [
464 '-Wl,-Bsymbolic',
465 ]
José Fonseca7b391942009-08-13 16:32:51 +0100466 # Handle circular dependencies in the libraries
467 env['_LIBFLAGS'] = '-Wl,--start-group ' + env['_LIBFLAGS'] + ' -Wl,--end-group'
José Fonseca6fe421c2009-02-12 12:59:58 +0000468 if platform == 'windows' and msvc:
José Fonseca381e3482008-07-17 11:23:43 +0900469 # See also:
470 # - http://msdn2.microsoft.com/en-us/library/y0zzbyt4.aspx
471 linkflags += [
José Fonseca73ccabc2009-02-12 11:57:45 +0000472 '/fixed:no',
473 '/incremental:no',
474 ]
475 if platform == 'winddk':
476 linkflags += [
José Fonseca381e3482008-07-17 11:23:43 +0900477 '/merge:_PAGE=PAGE',
478 '/merge:_TEXT=.text',
479 '/section:INIT,d',
480 '/opt:ref',
481 '/opt:icf',
482 '/ignore:4198,4010,4037,4039,4065,4070,4078,4087,4089,4221',
483 '/incremental:no',
484 '/fullbuild',
485 '/release',
486 '/nodefaultlib',
487 '/wx',
488 '/debug',
489 '/debugtype:cv',
490 '/version:5.1',
491 '/osversion:5.1',
492 '/functionpadmin:5',
493 '/safeseh',
494 '/pdbcompress',
495 '/stack:0x40000,0x1000',
496 '/driver',
497 '/align:0x80',
498 '/subsystem:native,5.01',
499 '/base:0x10000',
500
501 '/entry:DrvEnableDriver',
502 ]
José Fonseca46728032009-02-18 15:05:23 +0000503 if env['debug'] or env['profile']:
José Fonseca381e3482008-07-17 11:23:43 +0900504 linkflags += [
505 '/MAP', # http://msdn.microsoft.com/en-us/library/k7xkk3e2.aspx
506 ]
507 if platform == 'wince':
508 linkflags += [
509 '/nodefaultlib',
510 #'/incremental:no',
511 #'/fullbuild',
512 '/entry:_DllMainCRTStartup',
513 ]
514 env.Append(LINKFLAGS = linkflags)
José Fonseca72ad0392009-06-28 10:54:23 +0100515 env.Append(SHLINKFLAGS = shlinkflags)
José Fonseca381e3482008-07-17 11:23:43 +0900516
José Fonsecac76787a2008-07-17 11:25:20 +0900517 # Default libs
518 env.Append(LIBS = [])
519
José Fonseca381e3482008-07-17 11:23:43 +0900520 # Custom builders and methods
521 createConvenienceLibBuilder(env)
522 createCodeGenerateMethod(env)
José Fonseca52c2dd12008-09-08 07:54:15 +0900523 createInstallMethods(env)
José Fonseca381e3482008-07-17 11:23:43 +0900524
525 # for debugging
526 #print env.Dump()
José Fonsecab04aa712008-06-06 14:48:57 +0900527
528
529def exists(env):
José Fonseca381e3482008-07-17 11:23:43 +0900530 return 1