blob: 1625b7a2eb9bcadabc595ce39e7a2e89affeec15 [file] [log] [blame]
lrn@chromium.org25156de2010-04-06 13:10:27 +00001# Copyright 2010 the V8 project authors. All rights reserved.
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00002# Redistribution and use in source and binary forms, with or without
3# modification, are permitted provided that the following conditions are
4# met:
5#
6# * Redistributions of source code must retain the above copyright
7# notice, this list of conditions and the following disclaimer.
8# * Redistributions in binary form must reproduce the above
9# copyright notice, this list of conditions and the following
10# disclaimer in the documentation and/or other materials provided
11# with the distribution.
12# * Neither the name of Google Inc. nor the names of its
13# contributors may be used to endorse or promote products derived
14# from this software without specific prior written permission.
15#
16# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27
28import platform
kasper.lund212ac232008-07-16 07:07:30 +000029import re
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000030import sys
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +000031import os
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000032from os.path import join, dirname, abspath
ager@chromium.org236ad962008-09-25 09:45:57 +000033from types import DictType, StringTypes
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000034root_dir = dirname(File('SConstruct').rfile().abspath)
35sys.path.append(join(root_dir, 'tools'))
ager@chromium.orgc27e4e72008-09-04 13:52:27 +000036import js2c, utils
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000037
ager@chromium.orgbb29dc92009-03-24 13:25:23 +000038# ANDROID_TOP is the top of the Android checkout, fetched from the environment
39# variable 'TOP'. You will also need to set the CXX, CC, AR and RANLIB
40# environment variables to the cross-compiling tools.
41ANDROID_TOP = os.environ.get('TOP')
42if ANDROID_TOP is None:
43 ANDROID_TOP=""
44
kasperl@chromium.org71affb52009-05-26 05:44:31 +000045# TODO: Sort these issues out properly but as a temporary solution for gcc 4.4
ager@chromium.orge2902be2009-06-08 12:21:35 +000046# on linux we need these compiler flags to avoid crashes in the v8 test suite
47# and avoid dtoa.c strict aliasing issues
kasperl@chromium.org71affb52009-05-26 05:44:31 +000048if os.environ.get('GCC_VERSION') == '44':
ager@chromium.orgce5e87b2010-03-10 10:24:18 +000049 GCC_EXTRA_CCFLAGS = ['-fno-tree-vrp', '-fno-strict-aliasing']
50 GCC_DTOA_EXTRA_CCFLAGS = []
kasperl@chromium.org71affb52009-05-26 05:44:31 +000051else:
52 GCC_EXTRA_CCFLAGS = []
53 GCC_DTOA_EXTRA_CCFLAGS = []
54
whesse@chromium.orgb6e43bb2010-04-14 09:36:28 +000055ANDROID_FLAGS = ['-march=armv7-a',
56 '-mtune=cortex-a8',
57 '-mfloat-abi=softfp',
58 '-mfpu=vfp',
ager@chromium.orgbb29dc92009-03-24 13:25:23 +000059 '-fpic',
60 '-mthumb-interwork',
61 '-funwind-tables',
62 '-fstack-protector',
63 '-fno-short-enums',
64 '-fmessage-length=0',
65 '-finline-functions',
66 '-fno-inline-functions-called-once',
67 '-fgcse-after-reload',
68 '-frerun-cse-after-loop',
69 '-frename-registers',
70 '-fomit-frame-pointer',
71 '-fno-strict-aliasing',
72 '-finline-limit=64',
whesse@chromium.orgb6e43bb2010-04-14 09:36:28 +000073 '-DCAN_USE_VFP_INSTRUCTIONS=1',
74 '-DCAN_USE_ARMV7_INSTRUCTIONS=1',
ager@chromium.orgbb29dc92009-03-24 13:25:23 +000075 '-MD']
76
77ANDROID_INCLUDES = [ANDROID_TOP + '/bionic/libc/arch-arm/include',
78 ANDROID_TOP + '/bionic/libc/include',
79 ANDROID_TOP + '/bionic/libstdc++/include',
80 ANDROID_TOP + '/bionic/libc/kernel/common',
81 ANDROID_TOP + '/bionic/libc/kernel/arch-arm',
82 ANDROID_TOP + '/bionic/libm/include',
83 ANDROID_TOP + '/bionic/libm/include/arch/arm',
christian.plesner.hansen@gmail.com5a6af922009-08-12 14:20:51 +000084 ANDROID_TOP + '/bionic/libthread_db/include',
85 ANDROID_TOP + '/frameworks/base/include',
86 ANDROID_TOP + '/system/core/include']
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000087
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +000088ANDROID_LINKFLAGS = ['-nostdlib',
89 '-Bdynamic',
90 '-Wl,-T,' + ANDROID_TOP + '/build/core/armelf.x',
91 '-Wl,-dynamic-linker,/system/bin/linker',
92 '-Wl,--gc-sections',
93 '-Wl,-z,nocopyreloc',
94 '-Wl,-rpath-link=' + ANDROID_TOP + '/out/target/product/generic/obj/lib',
95 ANDROID_TOP + '/out/target/product/generic/obj/lib/crtbegin_dynamic.o',
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +000096 ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork/libgcc.a',
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +000097 ANDROID_TOP + '/out/target/product/generic/obj/lib/crtend_android.o'];
98
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +000099LIBRARY_FLAGS = {
100 'all': {
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000101 'CPPPATH': [join(root_dir, 'src')],
102 'regexp:native': {
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000103 'CPPDEFINES': ['V8_NATIVE_REGEXP']
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000104 },
105 'mode:debug': {
106 'CPPDEFINES': ['V8_ENABLE_CHECKS']
ager@chromium.org4af710e2009-09-15 12:20:11 +0000107 },
ager@chromium.org357bf652010-04-12 11:30:10 +0000108 'vmstate:on': {
109 'CPPDEFINES': ['ENABLE_VMSTATE_TRACKING'],
110 },
111 'protectheap:on': {
112 'CPPDEFINES': ['ENABLE_VMSTATE_TRACKING', 'ENABLE_HEAP_PROTECTION'],
113 },
ager@chromium.org4af710e2009-09-15 12:20:11 +0000114 'profilingsupport:on': {
ager@chromium.org357bf652010-04-12 11:30:10 +0000115 'CPPDEFINES': ['ENABLE_VMSTATE_TRACKING', 'ENABLE_LOGGING_AND_PROFILING'],
ager@chromium.org4af710e2009-09-15 12:20:11 +0000116 },
lrn@chromium.org25156de2010-04-06 13:10:27 +0000117 'cppprofilesprocessor:on': {
118 'CPPDEFINES': ['ENABLE_CPP_PROFILES_PROCESSOR'],
119 },
ager@chromium.org4af710e2009-09-15 12:20:11 +0000120 'debuggersupport:on': {
121 'CPPDEFINES': ['ENABLE_DEBUGGER_SUPPORT'],
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000122 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000123 },
124 'gcc': {
125 'all': {
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000126 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000127 'CXXFLAGS': ['$CCFLAGS', '-fno-rtti', '-fno-exceptions'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000128 },
ager@chromium.org4af710e2009-09-15 12:20:11 +0000129 'visibility:hidden': {
130 # Use visibility=default to disable this.
131 'CXXFLAGS': ['-fvisibility=hidden']
132 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000133 'mode:debug': {
134 'CCFLAGS': ['-g', '-O0'],
ager@chromium.org71daaf62009-04-01 07:22:49 +0000135 'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'],
136 'os:android': {
137 'CCFLAGS': ['-mthumb']
138 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000139 },
140 'mode:release': {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000141 'CCFLAGS': ['-O3', '-fomit-frame-pointer', '-fdata-sections',
142 '-ffunction-sections'],
143 'os:android': {
ager@chromium.org71daaf62009-04-01 07:22:49 +0000144 'CCFLAGS': ['-mthumb', '-Os'],
ager@chromium.org4af710e2009-09-15 12:20:11 +0000145 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000146 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000147 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000148 'os:linux': {
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000149 'CCFLAGS': ['-ansi'] + GCC_EXTRA_CCFLAGS,
sgjesse@chromium.orgf8c81802009-03-30 07:19:14 +0000150 'library:shared': {
sgjesse@chromium.orgb9d7da12009-08-05 08:38:10 +0000151 'CPPDEFINES': ['V8_SHARED'],
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000152 'LIBS': ['pthread']
sgjesse@chromium.orgf8c81802009-03-30 07:19:14 +0000153 }
iposva@chromium.org245aa852009-02-10 00:49:54 +0000154 },
155 'os:macos': {
ager@chromium.org5aa501c2009-06-23 07:57:28 +0000156 'CCFLAGS': ['-ansi', '-mmacosx-version-min=10.4'],
kmillikin@chromium.org13bd2942009-12-16 15:36:05 +0000157 'library:shared': {
158 'CPPDEFINES': ['V8_SHARED']
159 }
iposva@chromium.org245aa852009-02-10 00:49:54 +0000160 },
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000161 'os:freebsd': {
ager@chromium.orge2902be2009-06-08 12:21:35 +0000162 'CPPPATH' : ['/usr/local/include'],
163 'LIBPATH' : ['/usr/local/lib'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000164 'CCFLAGS': ['-ansi'],
165 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000166 'os:openbsd': {
167 'CPPPATH' : ['/usr/local/include'],
168 'LIBPATH' : ['/usr/local/lib'],
169 'CCFLAGS': ['-ansi'],
170 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000171 'os:solaris': {
172 'CPPPATH' : ['/usr/local/include'],
173 'LIBPATH' : ['/usr/local/lib'],
174 'CCFLAGS': ['-ansi'],
175 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000176 'os:win32': {
177 'CCFLAGS': ['-DWIN32'],
178 'CXXFLAGS': ['-DWIN32'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000179 },
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000180 'os:android': {
181 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
182 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
183 'CCFLAGS': ANDROID_FLAGS,
184 'WARNINGFLAGS': ['-Wall', '-Wno-unused', '-Werror=return-type',
185 '-Wstrict-aliasing=2'],
186 'CPPPATH': ANDROID_INCLUDES,
187 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000188 'arch:ia32': {
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000189 'CPPDEFINES': ['V8_TARGET_ARCH_IA32'],
190 'CCFLAGS': ['-m32'],
191 'LINKFLAGS': ['-m32']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000192 },
193 'arch:arm': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000194 'CPPDEFINES': ['V8_TARGET_ARCH_ARM']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000195 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000196 'simulator:arm': {
197 'CCFLAGS': ['-m32'],
198 'LINKFLAGS': ['-m32']
199 },
kmillikin@chromium.org13bd2942009-12-16 15:36:05 +0000200 'armvariant:thumb2': {
201 'CPPDEFINES': ['V8_ARM_VARIANT_THUMB']
202 },
203 'armvariant:arm': {
204 'CPPDEFINES': ['V8_ARM_VARIANT_ARM']
205 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000206 'arch:mips': {
207 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
208 'simulator:none': {
209 'CCFLAGS': ['-EL', '-mips32r2', '-Wa,-mips32r2', '-fno-inline'],
210 'LDFLAGS': ['-EL']
211 }
212 },
213 'simulator:mips': {
214 'CCFLAGS': ['-m32'],
215 'LINKFLAGS': ['-m32']
216 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000217 'arch:x64': {
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000218 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
sgjesse@chromium.org911335c2009-08-19 12:59:44 +0000219 'CCFLAGS': ['-m64'],
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000220 'LINKFLAGS': ['-m64'],
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000221 },
222 'prof:oprofile': {
223 'CPPDEFINES': ['ENABLE_OPROFILE_AGENT']
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000224 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000225 },
226 'msvc': {
227 'all': {
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000228 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
v8.team.kasperl727e9952008-09-02 14:56:44 +0000229 'CXXFLAGS': ['$CCFLAGS', '/GR-', '/Gy'],
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000230 'CPPDEFINES': ['WIN32'],
231 'LINKFLAGS': ['/INCREMENTAL:NO', '/NXCOMPAT', '/IGNORE:4221'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000232 'CCPDBFLAGS': ['/Zi']
233 },
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000234 'verbose:off': {
235 'DIALECTFLAGS': ['/nologo'],
236 'ARFLAGS': ['/NOLOGO']
237 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000238 'arch:ia32': {
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000239 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', '_USE_32BIT_TIME_T'],
240 'LINKFLAGS': ['/MACHINE:X86'],
241 'ARFLAGS': ['/MACHINE:X86']
242 },
243 'arch:x64': {
244 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
245 'LINKFLAGS': ['/MACHINE:X64'],
246 'ARFLAGS': ['/MACHINE:X64']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000247 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000248 'mode:debug': {
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000249 'CCFLAGS': ['/Od', '/Gm'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000250 'CPPDEFINES': ['_DEBUG', 'ENABLE_DISASSEMBLER', 'DEBUG'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000251 'LINKFLAGS': ['/DEBUG'],
252 'msvcrt:static': {
253 'CCFLAGS': ['/MTd']
254 },
255 'msvcrt:shared': {
256 'CCFLAGS': ['/MDd']
257 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000258 },
259 'mode:release': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000260 'CCFLAGS': ['/O2'],
261 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000262 'msvcrt:static': {
263 'CCFLAGS': ['/MT']
264 },
265 'msvcrt:shared': {
266 'CCFLAGS': ['/MD']
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000267 },
268 'msvcltcg:on': {
269 'CCFLAGS': ['/GL'],
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000270 'ARFLAGS': ['/LTCG'],
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000271 'pgo:off': {
272 'LINKFLAGS': ['/LTCG'],
273 },
274 'pgo:instrument': {
275 'LINKFLAGS': ['/LTCG:PGI']
276 },
277 'pgo:optimize': {
278 'LINKFLAGS': ['/LTCG:PGO']
279 }
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000280 }
ager@chromium.org5ec48922009-05-05 07:25:34 +0000281 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000282 }
283}
284
285
286V8_EXTRA_FLAGS = {
287 'gcc': {
288 'all': {
sgjesse@chromium.orgb9d7da12009-08-05 08:38:10 +0000289 'WARNINGFLAGS': ['-Wall',
290 '-Werror',
291 '-W',
292 '-Wno-unused-parameter',
293 '-Wnon-virtual-dtor']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000294 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000295 'os:win32': {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000296 'WARNINGFLAGS': ['-pedantic', '-Wno-long-long']
297 },
298 'os:linux': {
ager@chromium.org5ec48922009-05-05 07:25:34 +0000299 'WARNINGFLAGS': ['-pedantic'],
300 'library:shared': {
301 'soname:on': {
302 'LINKFLAGS': ['-Wl,-soname,${SONAME}']
303 }
304 }
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000305 },
306 'os:macos': {
307 'WARNINGFLAGS': ['-pedantic']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000308 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000309 'disassembler:on': {
310 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
311 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000312 },
313 'msvc': {
314 'all': {
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000315 'WARNINGFLAGS': ['/W3', '/WX', '/wd4355', '/wd4800']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000316 },
sgjesse@chromium.org4e421f42009-09-07 07:18:16 +0000317 'library:shared': {
318 'CPPDEFINES': ['BUILDING_V8_SHARED'],
319 'LIBS': ['winmm', 'ws2_32']
320 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000321 'arch:arm': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000322 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
ager@chromium.org3bf7b912008-11-17 09:09:45 +0000323 # /wd4996 is to silence the warning about sscanf
324 # used by the arm simulator.
325 'WARNINGFLAGS': ['/wd4996']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000326 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000327 'arch:mips': {
328 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
329 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000330 'disassembler:on': {
331 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
332 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000333 }
334}
335
336
iposva@chromium.org245aa852009-02-10 00:49:54 +0000337MKSNAPSHOT_EXTRA_FLAGS = {
338 'gcc': {
339 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000340 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000341 },
342 'os:macos': {
343 'LIBS': ['pthread'],
344 },
345 'os:freebsd': {
ager@chromium.orge2902be2009-06-08 12:21:35 +0000346 'LIBS': ['execinfo', 'pthread']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000347 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000348 'os:solaris': {
349 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
350 'LINKFLAGS': ['-mt']
351 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000352 'os:openbsd': {
353 'LIBS': ['execinfo', 'pthread']
354 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000355 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000356 'LIBS': ['winmm', 'ws2_32'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000357 },
358 },
359 'msvc': {
360 'all': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000361 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
ager@chromium.org381abbb2009-02-25 13:23:22 +0000362 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000363 }
364 }
365}
366
367
368DTOA_EXTRA_FLAGS = {
369 'gcc': {
370 'all': {
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000371 'WARNINGFLAGS': ['-Werror', '-Wno-uninitialized'],
372 'CCFLAGS': GCC_DTOA_EXTRA_CCFLAGS
ager@chromium.org236ad962008-09-25 09:45:57 +0000373 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000374 },
375 'msvc': {
376 'all': {
377 'WARNINGFLAGS': ['/WX', '/wd4018', '/wd4244']
378 }
379 }
380}
381
382
383CCTEST_EXTRA_FLAGS = {
384 'all': {
385 'CPPPATH': [join(root_dir, 'src')],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000386 },
387 'gcc': {
388 'all': {
389 'LIBPATH': [abspath('.')]
390 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000391 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000392 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000393 },
394 'os:macos': {
395 'LIBS': ['pthread'],
396 },
397 'os:freebsd': {
398 'LIBS': ['execinfo', 'pthread']
399 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000400 'os:solaris': {
401 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
402 'LINKFLAGS': ['-mt']
403 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000404 'os:openbsd': {
405 'LIBS': ['execinfo', 'pthread']
406 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000407 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000408 'LIBS': ['winmm', 'ws2_32']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000409 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000410 'os:android': {
411 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
412 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
413 'CCFLAGS': ANDROID_FLAGS,
414 'CPPPATH': ANDROID_INCLUDES,
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +0000415 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib',
416 ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork'],
ager@chromium.org5ec48922009-05-05 07:25:34 +0000417 'LINKFLAGS': ANDROID_LINKFLAGS,
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +0000418 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'],
ager@chromium.org5ec48922009-05-05 07:25:34 +0000419 'mode:release': {
420 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
421 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000422 },
423 },
424 'msvc': {
425 'all': {
iposva@chromium.org245aa852009-02-10 00:49:54 +0000426 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
ager@chromium.org381abbb2009-02-25 13:23:22 +0000427 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000428 },
429 'library:shared': {
430 'CPPDEFINES': ['USING_V8_SHARED']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000431 },
432 'arch:ia32': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000433 'CPPDEFINES': ['V8_TARGET_ARCH_IA32']
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000434 },
435 'arch:x64': {
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000436 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
437 'LINKFLAGS': ['/STACK:2091752']
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000438 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000439 }
440}
441
442
443SAMPLE_FLAGS = {
444 'all': {
v8.team.kasperl727e9952008-09-02 14:56:44 +0000445 'CPPPATH': [join(abspath('.'), 'include')],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000446 },
447 'gcc': {
448 'all': {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000449 'LIBPATH': ['.'],
450 'CCFLAGS': ['-fno-rtti', '-fno-exceptions']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000451 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000452 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000453 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000454 },
455 'os:macos': {
456 'LIBS': ['pthread'],
457 },
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000458 'os:freebsd': {
ager@chromium.orge2902be2009-06-08 12:21:35 +0000459 'LIBPATH' : ['/usr/local/lib'],
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000460 'LIBS': ['execinfo', 'pthread']
461 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000462 'os:solaris': {
463 'LIBPATH' : ['/usr/local/lib'],
464 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
465 'LINKFLAGS': ['-mt']
466 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000467 'os:openbsd': {
468 'LIBPATH' : ['/usr/local/lib'],
469 'LIBS': ['execinfo', 'pthread']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000470 },
471 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000472 'LIBS': ['winmm', 'ws2_32']
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000473 },
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000474 'os:android': {
475 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
476 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
477 'CCFLAGS': ANDROID_FLAGS,
478 'CPPPATH': ANDROID_INCLUDES,
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +0000479 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib',
480 ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork'],
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +0000481 'LINKFLAGS': ANDROID_LINKFLAGS,
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +0000482 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'],
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000483 'mode:release': {
484 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
485 }
486 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000487 'arch:ia32': {
488 'CCFLAGS': ['-m32'],
489 'LINKFLAGS': ['-m32']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000490 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000491 'arch:x64': {
492 'CCFLAGS': ['-m64'],
493 'LINKFLAGS': ['-m64']
494 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000495 'arch:mips': {
496 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
497 'simulator:none': {
498 'CCFLAGS': ['-EL', '-mips32r2', '-Wa,-mips32r2', '-fno-inline'],
499 'LINKFLAGS': ['-EL'],
500 'LDFLAGS': ['-EL']
501 }
502 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000503 'simulator:arm': {
504 'CCFLAGS': ['-m32'],
505 'LINKFLAGS': ['-m32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000506 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000507 'simulator:mips': {
508 'CCFLAGS': ['-m32'],
509 'LINKFLAGS': ['-m32']
510 },
ager@chromium.org236ad962008-09-25 09:45:57 +0000511 'mode:release': {
512 'CCFLAGS': ['-O2']
513 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000514 'mode:debug': {
515 'CCFLAGS': ['-g', '-O0']
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000516 },
517 'prof:oprofile': {
518 'LIBPATH': ['/usr/lib32', '/usr/lib32/oprofile'],
519 'LIBS': ['opagent']
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000520 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000521 },
522 'msvc': {
523 'all': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000524 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000525 },
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000526 'verbose:off': {
527 'CCFLAGS': ['/nologo'],
528 'LINKFLAGS': ['/NOLOGO']
529 },
530 'verbose:on': {
531 'LINKFLAGS': ['/VERBOSE']
532 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000533 'library:shared': {
534 'CPPDEFINES': ['USING_V8_SHARED']
535 },
ager@chromium.org236ad962008-09-25 09:45:57 +0000536 'prof:on': {
537 'LINKFLAGS': ['/MAP']
538 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000539 'mode:release': {
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000540 'CCFLAGS': ['/O2'],
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000541 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000542 'msvcrt:static': {
543 'CCFLAGS': ['/MT']
544 },
545 'msvcrt:shared': {
546 'CCFLAGS': ['/MD']
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000547 },
548 'msvcltcg:on': {
549 'CCFLAGS': ['/GL'],
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000550 'pgo:off': {
551 'LINKFLAGS': ['/LTCG'],
552 },
553 },
554 'pgo:instrument': {
555 'LINKFLAGS': ['/LTCG:PGI']
556 },
557 'pgo:optimize': {
558 'LINKFLAGS': ['/LTCG:PGO']
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000559 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000560 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000561 'arch:ia32': {
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000562 'CPPDEFINES': ['V8_TARGET_ARCH_IA32'],
563 'LINKFLAGS': ['/MACHINE:X86']
564 },
565 'arch:x64': {
566 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000567 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2091752']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000568 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000569 'mode:debug': {
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000570 'CCFLAGS': ['/Od'],
571 'LINKFLAGS': ['/DEBUG'],
572 'msvcrt:static': {
573 'CCFLAGS': ['/MTd']
574 },
575 'msvcrt:shared': {
576 'CCFLAGS': ['/MDd']
577 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000578 }
579 }
580}
581
582
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000583D8_FLAGS = {
584 'gcc': {
585 'console:readline': {
586 'LIBS': ['readline']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000587 },
588 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000589 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000590 },
591 'os:macos': {
592 'LIBS': ['pthread'],
593 },
594 'os:freebsd': {
595 'LIBS': ['pthread'],
596 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000597 'os:solaris': {
598 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
599 'LINKFLAGS': ['-mt']
600 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000601 'os:openbsd': {
602 'LIBS': ['pthread'],
603 },
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +0000604 'os:android': {
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +0000605 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib',
606 ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork'],
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +0000607 'LINKFLAGS': ANDROID_LINKFLAGS,
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +0000608 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'],
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +0000609 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000610 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000611 'LIBS': ['winmm', 'ws2_32'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000612 },
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000613 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000614 'msvc': {
615 'all': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000616 'LIBS': ['winmm', 'ws2_32']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000617 }
618 }
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000619}
620
621
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000622SUFFIXES = {
623 'release': '',
624 'debug': '_g'
625}
626
627
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000628def Abort(message):
629 print message
630 sys.exit(1)
631
632
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000633def GuessToolchain(os):
634 tools = Environment()['TOOLS']
635 if 'gcc' in tools:
kasper.lund7276f142008-07-30 08:49:36 +0000636 return 'gcc'
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000637 elif 'msvc' in tools:
638 return 'msvc'
639 else:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000640 return None
641
642
ager@chromium.org870a0b62008-11-04 11:43:05 +0000643OS_GUESS = utils.GuessOS()
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000644TOOLCHAIN_GUESS = GuessToolchain(OS_GUESS)
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000645ARCH_GUESS = utils.GuessArchitecture()
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000646
647
648SIMPLE_OPTIONS = {
649 'toolchain': {
650 'values': ['gcc', 'msvc'],
651 'default': TOOLCHAIN_GUESS,
ager@chromium.org5ec48922009-05-05 07:25:34 +0000652 'help': 'the toolchain to use (' + TOOLCHAIN_GUESS + ')'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000653 },
654 'os': {
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000655 'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'solaris'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000656 'default': OS_GUESS,
ager@chromium.org5ec48922009-05-05 07:25:34 +0000657 'help': 'the os to build for (' + OS_GUESS + ')'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000658 },
659 'arch': {
ager@chromium.org5c838252010-02-19 08:53:10 +0000660 'values':['arm', 'ia32', 'x64', 'mips'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000661 'default': ARCH_GUESS,
ager@chromium.org5ec48922009-05-05 07:25:34 +0000662 'help': 'the architecture to build for (' + ARCH_GUESS + ')'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000663 },
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000664 'regexp': {
665 'values': ['native', 'interpreted'],
666 'default': 'native',
667 'help': 'Whether to use native or interpreted regexp implementation'
668 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000669 'snapshot': {
iposva@chromium.org245aa852009-02-10 00:49:54 +0000670 'values': ['on', 'off', 'nobuild'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000671 'default': 'off',
672 'help': 'build using snapshots for faster start-up'
673 },
ager@chromium.org236ad962008-09-25 09:45:57 +0000674 'prof': {
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000675 'values': ['on', 'off', 'oprofile'],
ager@chromium.org236ad962008-09-25 09:45:57 +0000676 'default': 'off',
677 'help': 'enable profiling of build target'
678 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000679 'library': {
680 'values': ['static', 'shared'],
681 'default': 'static',
682 'help': 'the type of library to produce'
683 },
ager@chromium.org357bf652010-04-12 11:30:10 +0000684 'vmstate': {
685 'values': ['on', 'off'],
686 'default': 'off',
687 'help': 'enable VM state tracking'
688 },
689 'protectheap': {
690 'values': ['on', 'off'],
691 'default': 'off',
692 'help': 'enable heap protection'
693 },
ager@chromium.org4af710e2009-09-15 12:20:11 +0000694 'profilingsupport': {
695 'values': ['on', 'off'],
696 'default': 'on',
697 'help': 'enable profiling of JavaScript code'
698 },
lrn@chromium.org25156de2010-04-06 13:10:27 +0000699 'cppprofilesprocessor': {
700 'values': ['on', 'off'],
ager@chromium.org357bf652010-04-12 11:30:10 +0000701 'default': 'on',
lrn@chromium.org25156de2010-04-06 13:10:27 +0000702 'help': 'enable C++ profiles processor'
703 },
ager@chromium.org4af710e2009-09-15 12:20:11 +0000704 'debuggersupport': {
705 'values': ['on', 'off'],
706 'default': 'on',
707 'help': 'enable debugging of JavaScript code'
708 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000709 'soname': {
710 'values': ['on', 'off'],
711 'default': 'off',
712 'help': 'turn on setting soname for Linux shared library'
713 },
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000714 'msvcrt': {
715 'values': ['static', 'shared'],
716 'default': 'static',
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000717 'help': 'the type of Microsoft Visual C++ runtime library to use'
718 },
719 'msvcltcg': {
720 'values': ['on', 'off'],
721 'default': 'on',
722 'help': 'use Microsoft Visual C++ link-time code generation'
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000723 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000724 'simulator': {
ager@chromium.org5c838252010-02-19 08:53:10 +0000725 'values': ['arm', 'mips', 'none'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000726 'default': 'none',
727 'help': 'build with simulator'
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000728 },
729 'disassembler': {
730 'values': ['on', 'off'],
731 'default': 'off',
732 'help': 'enable the disassembler to inspect generated code'
733 },
734 'sourcesignatures': {
735 'values': ['MD5', 'timestamp'],
736 'default': 'MD5',
737 'help': 'set how the build system detects file changes'
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000738 },
739 'console': {
740 'values': ['dumb', 'readline'],
741 'default': 'dumb',
742 'help': 'the console to use for the d8 shell'
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000743 },
744 'verbose': {
745 'values': ['on', 'off'],
746 'default': 'off',
747 'help': 'more output from compiler and linker'
ager@chromium.org4af710e2009-09-15 12:20:11 +0000748 },
749 'visibility': {
750 'values': ['default', 'hidden'],
751 'default': 'hidden',
752 'help': 'shared library symbol visibility'
kmillikin@chromium.org13bd2942009-12-16 15:36:05 +0000753 },
754 'armvariant': {
755 'values': ['arm', 'thumb2', 'none'],
756 'default': 'none',
757 'help': 'generate thumb2 instructions instead of arm instructions (default)'
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000758 },
759 'pgo': {
760 'values': ['off', 'instrument', 'optimize'],
761 'default': 'off',
762 'help': 'select profile guided optimization variant',
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000763 }
764}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000765
766
767def GetOptions():
768 result = Options()
kasper.lund7276f142008-07-30 08:49:36 +0000769 result.Add('mode', 'compilation mode (debug, release)', 'release')
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000770 result.Add('sample', 'build sample (shell, process, lineprocessor)', '')
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +0000771 result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '')
772 result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '')
ager@chromium.org236ad962008-09-25 09:45:57 +0000773 for (name, option) in SIMPLE_OPTIONS.iteritems():
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000774 help = '%s (%s)' % (name, ", ".join(option['values']))
775 result.Add(name, help, option.get('default'))
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000776 return result
777
778
ager@chromium.org5ec48922009-05-05 07:25:34 +0000779def GetVersionComponents():
780 MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)")
781 MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)")
782 BUILD_NUMBER_PATTERN = re.compile(r"#define\s+BUILD_NUMBER\s+(.*)")
783 PATCH_LEVEL_PATTERN = re.compile(r"#define\s+PATCH_LEVEL\s+(.*)")
784
785 patterns = [MAJOR_VERSION_PATTERN,
786 MINOR_VERSION_PATTERN,
787 BUILD_NUMBER_PATTERN,
788 PATCH_LEVEL_PATTERN]
789
790 source = open(join(root_dir, 'src', 'version.cc')).read()
791 version_components = []
792 for pattern in patterns:
793 match = pattern.search(source)
794 if match:
795 version_components.append(match.group(1).strip())
796 else:
797 version_components.append('0')
798
799 return version_components
800
801
802def GetVersion():
803 version_components = GetVersionComponents()
ager@chromium.org5aa501c2009-06-23 07:57:28 +0000804
ager@chromium.org5ec48922009-05-05 07:25:34 +0000805 if version_components[len(version_components) - 1] == '0':
806 version_components.pop()
807 return '.'.join(version_components)
808
809
810def GetSpecificSONAME():
811 SONAME_PATTERN = re.compile(r"#define\s+SONAME\s+\"(.*)\"")
ager@chromium.org5aa501c2009-06-23 07:57:28 +0000812
ager@chromium.org5ec48922009-05-05 07:25:34 +0000813 source = open(join(root_dir, 'src', 'version.cc')).read()
814 match = SONAME_PATTERN.search(source)
ager@chromium.org5aa501c2009-06-23 07:57:28 +0000815
ager@chromium.org5ec48922009-05-05 07:25:34 +0000816 if match:
817 return match.group(1).strip()
818 else:
819 return ''
820
821
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000822def SplitList(str):
823 return [ s for s in str.split(",") if len(s) > 0 ]
824
825
826def IsLegal(env, option, values):
827 str = env[option]
828 for s in SplitList(str):
829 if not s in values:
830 Abort("Illegal value for option %s '%s'." % (option, s))
831 return False
832 return True
833
834
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000835def VerifyOptions(env):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000836 if not IsLegal(env, 'mode', ['debug', 'release']):
837 return False
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000838 if not IsLegal(env, 'sample', ["shell", "process", "lineprocessor"]):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000839 return False
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000840 if not IsLegal(env, 'regexp', ["native", "interpreted"]):
841 return False
ager@chromium.org236ad962008-09-25 09:45:57 +0000842 if env['os'] == 'win32' and env['library'] == 'shared' and env['prof'] == 'on':
843 Abort("Profiling on windows only supported for static library.")
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000844 if env['prof'] == 'oprofile' and env['os'] != 'linux':
845 Abort("OProfile is only supported on Linux.")
ager@chromium.org5ec48922009-05-05 07:25:34 +0000846 if env['os'] == 'win32' and env['soname'] == 'on':
847 Abort("Shared Object soname not applicable for Windows.")
848 if env['soname'] == 'on' and env['library'] == 'static':
849 Abort("Shared Object soname not applicable for static library.")
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000850 if env['os'] != 'win32' and env['pgo'] != 'off':
851 Abort("Profile guided optimization only supported on Windows.")
ager@chromium.org236ad962008-09-25 09:45:57 +0000852 for (name, option) in SIMPLE_OPTIONS.iteritems():
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000853 if (not option.get('default')) and (name not in ARGUMENTS):
854 message = ("A value for option %s must be specified (%s)." %
855 (name, ", ".join(option['values'])))
856 Abort(message)
857 if not env[name] in option['values']:
858 message = ("Unknown %s value '%s'. Possible values are (%s)." %
859 (name, env[name], ", ".join(option['values'])))
860 Abort(message)
861
862
863class BuildContext(object):
864
v8.team.kasperl727e9952008-09-02 14:56:44 +0000865 def __init__(self, options, env_overrides, samples):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000866 self.library_targets = []
iposva@chromium.org245aa852009-02-10 00:49:54 +0000867 self.mksnapshot_targets = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000868 self.cctest_targets = []
869 self.sample_targets = []
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000870 self.d8_targets = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000871 self.options = options
v8.team.kasperl727e9952008-09-02 14:56:44 +0000872 self.env_overrides = env_overrides
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000873 self.samples = samples
iposva@chromium.org245aa852009-02-10 00:49:54 +0000874 self.use_snapshot = (options['snapshot'] != 'off')
875 self.build_snapshot = (options['snapshot'] == 'on')
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000876 self.flags = None
ager@chromium.org236ad962008-09-25 09:45:57 +0000877
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000878 def AddRelevantFlags(self, initial, flags):
879 result = initial.copy()
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000880 toolchain = self.options['toolchain']
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000881 if toolchain in flags:
882 self.AppendFlags(result, flags[toolchain].get('all'))
883 for option in sorted(self.options.keys()):
884 value = self.options[option]
885 self.AppendFlags(result, flags[toolchain].get(option + ':' + value))
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000886 self.AppendFlags(result, flags.get('all'))
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000887 return result
888
889 def AddRelevantSubFlags(self, options, flags):
890 self.AppendFlags(options, flags.get('all'))
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000891 for option in sorted(self.options.keys()):
892 value = self.options[option]
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000893 self.AppendFlags(options, flags.get(option + ':' + value))
ager@chromium.org236ad962008-09-25 09:45:57 +0000894
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000895 def GetRelevantSources(self, source):
896 result = []
897 result += source.get('all', [])
ager@chromium.org236ad962008-09-25 09:45:57 +0000898 for (name, value) in self.options.iteritems():
sgjesse@chromium.org911335c2009-08-19 12:59:44 +0000899 source_value = source.get(name + ':' + value, [])
900 if type(source_value) == dict:
901 result += self.GetRelevantSources(source_value)
902 else:
903 result += source_value
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000904 return sorted(result)
905
906 def AppendFlags(self, options, added):
907 if not added:
908 return
ager@chromium.org236ad962008-09-25 09:45:57 +0000909 for (key, value) in added.iteritems():
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000910 if key.find(':') != -1:
911 self.AddRelevantSubFlags(options, { key: value })
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000912 else:
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000913 if not key in options:
914 options[key] = value
915 else:
916 prefix = options[key]
917 if isinstance(prefix, StringTypes): prefix = prefix.split()
918 options[key] = prefix + value
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000919
920 def ConfigureObject(self, env, input, **kw):
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000921 if (kw.has_key('CPPPATH') and env.has_key('CPPPATH')):
922 kw['CPPPATH'] += env['CPPPATH']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000923 if self.options['library'] == 'static':
924 return env.StaticObject(input, **kw)
925 else:
926 return env.SharedObject(input, **kw)
927
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000928 def ApplyEnvOverrides(self, env):
929 if not self.env_overrides:
930 return
931 if type(env['ENV']) == DictType:
932 env['ENV'].update(**self.env_overrides)
933 else:
934 env['ENV'] = self.env_overrides
935
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000936
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000937def PostprocessOptions(options, os):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000938 # Adjust architecture if the simulator option has been set
939 if (options['simulator'] != 'none') and (options['arch'] != options['simulator']):
940 if 'arch' in ARGUMENTS:
941 # Print a warning if arch has explicitly been set
942 print "Warning: forcing architecture to match simulator (%s)" % options['simulator']
943 options['arch'] = options['simulator']
ager@chromium.org4af710e2009-09-15 12:20:11 +0000944 if (options['prof'] != 'off') and (options['profilingsupport'] == 'off'):
945 # Print a warning if profiling is enabled without profiling support
946 print "Warning: forcing profilingsupport on when prof is on"
947 options['profilingsupport'] = 'on'
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000948 if os == 'win32' and options['pgo'] != 'off' and options['msvcltcg'] == 'off':
949 if 'msvcltcg' in ARGUMENTS:
950 print "Warning: forcing msvcltcg on as it is required for pgo (%s)" % options['pgo']
951 options['msvcltcg'] = 'on'
kmillikin@chromium.org13bd2942009-12-16 15:36:05 +0000952 if (options['armvariant'] == 'none' and options['arch'] == 'arm'):
953 options['armvariant'] = 'arm'
954 if (options['armvariant'] != 'none' and options['arch'] != 'arm'):
955 options['armvariant'] = 'none'
ager@chromium.org5c838252010-02-19 08:53:10 +0000956 if options['arch'] == 'mips':
957 if ('regexp' in ARGUMENTS) and options['regexp'] == 'native':
958 # Print a warning if native regexp is specified for mips
959 print "Warning: forcing regexp to interpreted for mips"
960 options['regexp'] = 'interpreted'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000961
962
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +0000963def ParseEnvOverrides(arg, imports):
964 # The environment overrides are in the format NAME0:value0,NAME1:value1,...
965 # The environment imports are in the format NAME0,NAME1,...
v8.team.kasperl727e9952008-09-02 14:56:44 +0000966 overrides = {}
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +0000967 for var in imports.split(','):
968 if var in os.environ:
969 overrides[var] = os.environ[var]
v8.team.kasperl727e9952008-09-02 14:56:44 +0000970 for override in arg.split(','):
971 pos = override.find(':')
972 if pos == -1:
973 continue
974 overrides[override[:pos].strip()] = override[pos+1:].strip()
975 return overrides
976
977
978def BuildSpecific(env, mode, env_overrides):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000979 options = {'mode': mode}
980 for option in SIMPLE_OPTIONS:
981 options[option] = env[option]
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000982 PostprocessOptions(options, env['os'])
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000983
v8.team.kasperl727e9952008-09-02 14:56:44 +0000984 context = BuildContext(options, env_overrides, samples=SplitList(env['sample']))
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000985
ager@chromium.orgab99eea2009-08-25 07:05:41 +0000986 # Remove variables which can't be imported from the user's external
987 # environment into a construction environment.
988 user_environ = os.environ.copy()
989 try:
990 del user_environ['ENV']
991 except KeyError:
992 pass
993
994 library_flags = context.AddRelevantFlags(user_environ, LIBRARY_FLAGS)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000995 v8_flags = context.AddRelevantFlags(library_flags, V8_EXTRA_FLAGS)
iposva@chromium.org245aa852009-02-10 00:49:54 +0000996 mksnapshot_flags = context.AddRelevantFlags(library_flags, MKSNAPSHOT_EXTRA_FLAGS)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000997 dtoa_flags = context.AddRelevantFlags(library_flags, DTOA_EXTRA_FLAGS)
ager@chromium.org236ad962008-09-25 09:45:57 +0000998 cctest_flags = context.AddRelevantFlags(v8_flags, CCTEST_EXTRA_FLAGS)
ager@chromium.orgab99eea2009-08-25 07:05:41 +0000999 sample_flags = context.AddRelevantFlags(user_environ, SAMPLE_FLAGS)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001000 d8_flags = context.AddRelevantFlags(library_flags, D8_FLAGS)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001001
1002 context.flags = {
1003 'v8': v8_flags,
iposva@chromium.org245aa852009-02-10 00:49:54 +00001004 'mksnapshot': mksnapshot_flags,
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001005 'dtoa': dtoa_flags,
1006 'cctest': cctest_flags,
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001007 'sample': sample_flags,
1008 'd8': d8_flags
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001009 }
ager@chromium.org236ad962008-09-25 09:45:57 +00001010
ager@chromium.org5ec48922009-05-05 07:25:34 +00001011 # Generate library base name.
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001012 target_id = mode
1013 suffix = SUFFIXES[target_id]
1014 library_name = 'v8' + suffix
ager@chromium.org5ec48922009-05-05 07:25:34 +00001015 version = GetVersion()
1016 if context.options['soname'] == 'on':
1017 # When building shared object with SONAME version the library name.
1018 library_name += '-' + version
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001019
ager@chromium.org5ec48922009-05-05 07:25:34 +00001020 # Generate library SONAME if required by the build.
1021 if context.options['soname'] == 'on':
1022 soname = GetSpecificSONAME()
1023 if soname == '':
1024 soname = 'lib' + library_name + '.so'
1025 env['SONAME'] = soname
1026
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001027 # Build the object files by invoking SCons recursively.
iposva@chromium.org245aa852009-02-10 00:49:54 +00001028 (object_files, shell_files, mksnapshot) = env.SConscript(
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001029 join('src', 'SConscript'),
1030 build_dir=join('obj', target_id),
1031 exports='context',
1032 duplicate=False
1033 )
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001034
iposva@chromium.org245aa852009-02-10 00:49:54 +00001035 context.mksnapshot_targets.append(mksnapshot)
1036
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001037 # Link the object files into a library.
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00001038 env.Replace(**context.flags['v8'])
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00001039
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001040 context.ApplyEnvOverrides(env)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001041 if context.options['library'] == 'static':
1042 library = env.StaticLibrary(library_name, object_files)
1043 else:
1044 # There seems to be a glitch in the way scons decides where to put
1045 # PDB files when compiling using MSVC so we specify it manually.
1046 # This should not affect any other platforms.
1047 pdb_name = library_name + '.dll.pdb'
1048 library = env.SharedLibrary(library_name, object_files, PDB=pdb_name)
1049 context.library_targets.append(library)
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001050
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001051 d8_env = Environment()
1052 d8_env.Replace(**context.flags['d8'])
fschneider@chromium.org0c20e672010-01-14 15:28:53 +00001053 context.ApplyEnvOverrides(d8_env)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001054 shell = d8_env.Program('d8' + suffix, object_files + shell_files)
1055 context.d8_targets.append(shell)
1056
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001057 for sample in context.samples:
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +00001058 sample_env = Environment()
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001059 sample_env.Replace(**context.flags['sample'])
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +00001060 sample_env.Prepend(LIBS=[library_name])
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001061 context.ApplyEnvOverrides(sample_env)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001062 sample_object = sample_env.SConscript(
1063 join('samples', 'SConscript'),
1064 build_dir=join('obj', 'sample', sample, target_id),
1065 exports='sample context',
1066 duplicate=False
1067 )
1068 sample_name = sample + suffix
1069 sample_program = sample_env.Program(sample_name, sample_object)
1070 sample_env.Depends(sample_program, library)
1071 context.sample_targets.append(sample_program)
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001072
ager@chromium.orgb26c50a2010-03-26 09:27:16 +00001073 cctest_env = env.Copy()
1074 cctest_env.Prepend(LIBS=[library_name])
1075 cctest_program = cctest_env.SConscript(
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001076 join('test', 'cctest', 'SConscript'),
1077 build_dir=join('obj', 'test', target_id),
1078 exports='context object_files',
1079 duplicate=False
1080 )
1081 context.cctest_targets.append(cctest_program)
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001082
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001083 return context
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001084
1085
kasper.lund7276f142008-07-30 08:49:36 +00001086def Build():
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001087 opts = GetOptions()
1088 env = Environment(options=opts)
1089 Help(opts.GenerateHelpText(env))
1090 VerifyOptions(env)
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +00001091 env_overrides = ParseEnvOverrides(env['env'], env['importenv'])
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001092
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001093 SourceSignatures(env['sourcesignatures'])
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001094
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001095 libraries = []
iposva@chromium.org245aa852009-02-10 00:49:54 +00001096 mksnapshots = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001097 cctests = []
1098 samples = []
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001099 d8s = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001100 modes = SplitList(env['mode'])
1101 for mode in modes:
v8.team.kasperl727e9952008-09-02 14:56:44 +00001102 context = BuildSpecific(env.Copy(), mode, env_overrides)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001103 libraries += context.library_targets
iposva@chromium.org245aa852009-02-10 00:49:54 +00001104 mksnapshots += context.mksnapshot_targets
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001105 cctests += context.cctest_targets
1106 samples += context.sample_targets
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001107 d8s += context.d8_targets
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001108
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001109 env.Alias('library', libraries)
iposva@chromium.org245aa852009-02-10 00:49:54 +00001110 env.Alias('mksnapshot', mksnapshots)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001111 env.Alias('cctests', cctests)
1112 env.Alias('sample', samples)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001113 env.Alias('d8', d8s)
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001114
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001115 if env['sample']:
1116 env.Default('sample')
kasper.lund7276f142008-07-30 08:49:36 +00001117 else:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001118 env.Default('library')
kasper.lund7276f142008-07-30 08:49:36 +00001119
1120
v8.team.kasperl727e9952008-09-02 14:56:44 +00001121# We disable deprecation warnings because we need to be able to use
1122# env.Copy without getting warnings for compatibility with older
1123# version of scons. Also, there's a bug in some revisions that
1124# doesn't allow this flag to be set, so we swallow any exceptions.
1125# Lovely.
1126try:
1127 SetOption('warn', 'no-deprecated')
1128except:
1129 pass
1130
1131
kasper.lund7276f142008-07-30 08:49:36 +00001132Build()