blob: d4eaebef8debd1fd459ddf6bd662e8c46ede37e3 [file] [log] [blame]
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00001# Copyright 2011 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
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +000030import subprocess
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000031import sys
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +000032import os
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000033from os.path import join, dirname, abspath
ager@chromium.org236ad962008-09-25 09:45:57 +000034from types import DictType, StringTypes
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000035root_dir = dirname(File('SConstruct').rfile().abspath)
ulan@chromium.org2efb9002012-01-19 15:36:35 +000036src_dir = join(root_dir, 'src')
ager@chromium.org0ee099b2011-01-25 14:06:47 +000037sys.path.insert(0, join(root_dir, 'tools'))
ager@chromium.orgc27e4e72008-09-04 13:52:27 +000038import js2c, utils
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000039
ricow@chromium.orgc9c80822010-04-21 08:22:37 +000040# ARM_TARGET_LIB is the path to the dynamic library to use on the target
whesse@chromium.orgba5a61b2010-07-26 11:44:40 +000041# machine if cross-compiling to an arm machine. You will also need to set
ricow@chromium.orgc9c80822010-04-21 08:22:37 +000042# the additional cross-compiling environment variables to the cross compiler.
43ARM_TARGET_LIB = os.environ.get('ARM_TARGET_LIB')
44if ARM_TARGET_LIB:
45 ARM_LINK_FLAGS = ['-Wl,-rpath=' + ARM_TARGET_LIB + '/lib:' +
46 ARM_TARGET_LIB + '/usr/lib',
47 '-Wl,--dynamic-linker=' + ARM_TARGET_LIB +
48 '/lib/ld-linux.so.3']
49else:
50 ARM_LINK_FLAGS = []
51
ricow@chromium.org0b9f8502010-08-18 07:45:01 +000052GCC_EXTRA_CCFLAGS = []
53GCC_DTOA_EXTRA_CCFLAGS = []
kasperl@chromium.org71affb52009-05-26 05:44:31 +000054
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +000055LIBRARY_FLAGS = {
56 'all': {
ulan@chromium.org2efb9002012-01-19 15:36:35 +000057 'CPPPATH': [src_dir],
ricow@chromium.orgc9c80822010-04-21 08:22:37 +000058 'regexp:interpreted': {
59 'CPPDEFINES': ['V8_INTERPRETED_REGEXP']
ager@chromium.org18ad94b2009-09-02 08:22:29 +000060 },
61 'mode:debug': {
whesse@chromium.org023421e2010-12-21 12:19:12 +000062 'CPPDEFINES': ['V8_ENABLE_CHECKS', 'OBJECT_PRINT']
ager@chromium.org4af710e2009-09-15 12:20:11 +000063 },
whesse@chromium.org023421e2010-12-21 12:19:12 +000064 'objectprint:on': {
65 'CPPDEFINES': ['OBJECT_PRINT'],
66 },
ager@chromium.org4af710e2009-09-15 12:20:11 +000067 'debuggersupport:on': {
68 'CPPDEFINES': ['ENABLE_DEBUGGER_SUPPORT'],
erik.corry@gmail.com0511e242011-01-19 11:11:08 +000069 },
70 'inspector:on': {
71 'CPPDEFINES': ['INSPECTOR'],
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +000072 },
whesse@chromium.org030d38e2011-07-13 13:23:34 +000073 'fasttls:off': {
74 'CPPDEFINES': ['V8_NO_FAST_TLS'],
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +000075 },
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +000076 'liveobjectlist:on': {
77 'CPPDEFINES': ['ENABLE_DEBUGGER_SUPPORT', 'INSPECTOR',
78 'LIVE_OBJECT_LIST', 'OBJECT_PRINT'],
kasperl@chromium.org68ac0092009-07-09 06:00:35 +000079 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +000080 },
81 'gcc': {
82 'all': {
kasperl@chromium.org41044eb2008-10-06 08:24:46 +000083 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
ricow@chromium.org4f693d62011-07-04 14:01:31 +000084 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +000085 },
ager@chromium.org4af710e2009-09-15 12:20:11 +000086 'visibility:hidden': {
87 # Use visibility=default to disable this.
88 'CXXFLAGS': ['-fvisibility=hidden']
89 },
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +000090 'strictaliasing:off': {
91 'CCFLAGS': ['-fno-strict-aliasing']
92 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +000093 'mode:debug': {
94 'CCFLAGS': ['-g', '-O0'],
ager@chromium.org71daaf62009-04-01 07:22:49 +000095 'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +000096 },
97 'mode:release': {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +000098 'CCFLAGS': ['-O3', '-fomit-frame-pointer', '-fdata-sections',
99 '-ffunction-sections'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000100 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000101 'os:linux': {
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000102 'CCFLAGS': ['-ansi'] + GCC_EXTRA_CCFLAGS,
sgjesse@chromium.orgf8c81802009-03-30 07:19:14 +0000103 'library:shared': {
sgjesse@chromium.orgb9d7da12009-08-05 08:38:10 +0000104 'CPPDEFINES': ['V8_SHARED'],
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000105 'LIBS': ['pthread']
sgjesse@chromium.orgf8c81802009-03-30 07:19:14 +0000106 }
iposva@chromium.org245aa852009-02-10 00:49:54 +0000107 },
108 'os:macos': {
ager@chromium.org5aa501c2009-06-23 07:57:28 +0000109 'CCFLAGS': ['-ansi', '-mmacosx-version-min=10.4'],
kmillikin@chromium.org13bd2942009-12-16 15:36:05 +0000110 'library:shared': {
111 'CPPDEFINES': ['V8_SHARED']
112 }
iposva@chromium.org245aa852009-02-10 00:49:54 +0000113 },
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000114 'os:freebsd': {
ulan@chromium.org2efb9002012-01-19 15:36:35 +0000115 'CPPPATH' : [src_dir, '/usr/local/include'],
ager@chromium.orge2902be2009-06-08 12:21:35 +0000116 'LIBPATH' : ['/usr/local/lib'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000117 'CCFLAGS': ['-ansi'],
ricow@chromium.orgbadaffc2011-03-17 12:15:27 +0000118 'LIBS': ['execinfo']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000119 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000120 'os:openbsd': {
ulan@chromium.org2efb9002012-01-19 15:36:35 +0000121 'CPPPATH' : [src_dir, '/usr/local/include'],
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000122 'LIBPATH' : ['/usr/local/lib'],
123 'CCFLAGS': ['-ansi'],
124 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000125 'os:solaris': {
vegorov@chromium.orgdff694e2010-05-17 09:10:26 +0000126 # On Solaris, to get isinf, INFINITY, fpclassify and other macros one
127 # needs to define __C99FEATURES__.
128 'CPPDEFINES': ['__C99FEATURES__'],
ulan@chromium.org2efb9002012-01-19 15:36:35 +0000129 'CPPPATH' : [src_dir, '/usr/local/include'],
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000130 'LIBPATH' : ['/usr/local/lib'],
131 'CCFLAGS': ['-ansi'],
132 },
ricow@chromium.org27bf2882011-11-17 08:34:43 +0000133 'os:netbsd': {
ulan@chromium.org2efb9002012-01-19 15:36:35 +0000134 'CPPPATH' : [src_dir, '/usr/pkg/include'],
ricow@chromium.org27bf2882011-11-17 08:34:43 +0000135 'LIBPATH' : ['/usr/pkg/lib'],
136 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000137 'os:win32': {
138 'CCFLAGS': ['-DWIN32'],
139 'CXXFLAGS': ['-DWIN32'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000140 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000141 'arch:ia32': {
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000142 'CPPDEFINES': ['V8_TARGET_ARCH_IA32'],
143 'CCFLAGS': ['-m32'],
144 'LINKFLAGS': ['-m32']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000145 },
146 'arch:arm': {
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000147 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
148 'unalignedaccesses:on' : {
149 'CPPDEFINES' : ['CAN_USE_UNALIGNED_ACCESSES=1']
150 },
151 'unalignedaccesses:off' : {
152 'CPPDEFINES' : ['CAN_USE_UNALIGNED_ACCESSES=0']
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000153 },
154 'armeabi:soft' : {
155 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
156 'simulator:none': {
157 'CCFLAGS': ['-mfloat-abi=soft'],
158 }
159 },
160 'armeabi:softfp' : {
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +0000161 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
162 'vfp3:on': {
163 'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
164 },
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000165 'simulator:none': {
166 'CCFLAGS': ['-mfloat-abi=softfp'],
167 }
168 },
169 'armeabi:hard' : {
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +0000170 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=1'],
171 'vfp3:on': {
172 'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
173 },
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000174 'simulator:none': {
175 'CCFLAGS': ['-mfloat-abi=hard'],
176 }
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000177 }
ager@chromium.org5ec48922009-05-05 07:25:34 +0000178 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000179 'simulator:arm': {
ricow@chromium.org30ce4112010-05-31 10:38:25 +0000180 'CCFLAGS': ['-m32'],
vegorov@chromium.org42841962010-10-18 11:18:59 +0000181 'LINKFLAGS': ['-m32'],
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000182 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000183 'arch:mips': {
184 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
lrn@chromium.org7516f052011-03-30 08:52:27 +0000185 'mips_arch_variant:mips32r2': {
186 'CPPDEFINES': ['_MIPS_ARCH_MIPS32R2']
187 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000188 'simulator:none': {
lrn@chromium.org7516f052011-03-30 08:52:27 +0000189 'CCFLAGS': ['-EL'],
190 'LINKFLAGS': ['-EL'],
191 'mips_arch_variant:mips32r2': {
192 'CCFLAGS': ['-mips32r2', '-Wa,-mips32r2']
193 },
194 'mips_arch_variant:mips32r1': {
195 'CCFLAGS': ['-mips32', '-Wa,-mips32']
196 },
197 'library:static': {
198 'LINKFLAGS': ['-static', '-static-libgcc']
199 },
200 'mipsabi:softfloat': {
201 'CCFLAGS': ['-msoft-float'],
202 'LINKFLAGS': ['-msoft-float']
203 },
204 'mipsabi:hardfloat': {
205 'CCFLAGS': ['-mhard-float'],
206 'LINKFLAGS': ['-mhard-float']
207 }
ager@chromium.org5c838252010-02-19 08:53:10 +0000208 }
209 },
210 'simulator:mips': {
211 'CCFLAGS': ['-m32'],
vegorov@chromium.org42841962010-10-18 11:18:59 +0000212 'LINKFLAGS': ['-m32'],
lrn@chromium.org7516f052011-03-30 08:52:27 +0000213 'mipsabi:softfloat': {
214 'CPPDEFINES': ['__mips_soft_float=1'],
danno@chromium.org40cb8782011-05-25 07:58:50 +0000215 },
216 'mipsabi:hardfloat': {
217 'CPPDEFINES': ['__mips_hard_float=1'],
lrn@chromium.org7516f052011-03-30 08:52:27 +0000218 }
ager@chromium.org5c838252010-02-19 08:53:10 +0000219 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000220 'arch:x64': {
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000221 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
sgjesse@chromium.org911335c2009-08-19 12:59:44 +0000222 'CCFLAGS': ['-m64'],
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000223 'LINKFLAGS': ['-m64'],
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000224 },
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000225 'gdbjit:on': {
226 'CPPDEFINES': ['ENABLE_GDB_JIT_INTERFACE']
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000227 },
228 'compress_startup_data:bz2': {
229 'CPPDEFINES': ['COMPRESS_STARTUP_DATA_BZ2']
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000230 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000231 },
232 'msvc': {
233 'all': {
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000234 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000235 'CXXFLAGS': ['/GR-', '/Gy'],
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000236 'CPPDEFINES': ['WIN32'],
237 'LINKFLAGS': ['/INCREMENTAL:NO', '/NXCOMPAT', '/IGNORE:4221'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000238 'CCPDBFLAGS': ['/Zi']
239 },
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000240 'verbose:off': {
241 'DIALECTFLAGS': ['/nologo'],
242 'ARFLAGS': ['/NOLOGO']
243 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000244 'arch:ia32': {
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000245 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', '_USE_32BIT_TIME_T'],
246 'LINKFLAGS': ['/MACHINE:X86'],
247 'ARFLAGS': ['/MACHINE:X86']
248 },
249 'arch:x64': {
250 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
251 'LINKFLAGS': ['/MACHINE:X64'],
252 'ARFLAGS': ['/MACHINE:X64']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000253 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000254 'mode:debug': {
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000255 'CCFLAGS': ['/Od', '/Gm'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000256 'CPPDEFINES': ['_DEBUG', 'ENABLE_DISASSEMBLER', 'DEBUG'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000257 'LINKFLAGS': ['/DEBUG'],
258 'msvcrt:static': {
259 'CCFLAGS': ['/MTd']
260 },
261 'msvcrt:shared': {
262 'CCFLAGS': ['/MDd']
263 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000264 },
265 'mode:release': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000266 'CCFLAGS': ['/O2'],
267 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000268 'msvcrt:static': {
269 'CCFLAGS': ['/MT']
270 },
271 'msvcrt:shared': {
272 'CCFLAGS': ['/MD']
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000273 },
274 'msvcltcg:on': {
275 'CCFLAGS': ['/GL'],
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000276 'ARFLAGS': ['/LTCG'],
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000277 'pgo:off': {
278 'LINKFLAGS': ['/LTCG'],
279 },
280 'pgo:instrument': {
281 'LINKFLAGS': ['/LTCG:PGI']
282 },
283 'pgo:optimize': {
284 'LINKFLAGS': ['/LTCG:PGO']
285 }
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000286 }
ager@chromium.org5ec48922009-05-05 07:25:34 +0000287 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000288 }
289}
290
291
292V8_EXTRA_FLAGS = {
293 'gcc': {
294 'all': {
sgjesse@chromium.orgb9d7da12009-08-05 08:38:10 +0000295 'WARNINGFLAGS': ['-Wall',
296 '-Werror',
297 '-W',
298 '-Wno-unused-parameter',
299 '-Wnon-virtual-dtor']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000300 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000301 'os:win32': {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000302 'WARNINGFLAGS': ['-pedantic', '-Wno-long-long']
303 },
304 'os:linux': {
ager@chromium.org5ec48922009-05-05 07:25:34 +0000305 'WARNINGFLAGS': ['-pedantic'],
306 'library:shared': {
307 'soname:on': {
308 'LINKFLAGS': ['-Wl,-soname,${SONAME}']
309 }
310 }
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000311 },
312 'os:macos': {
313 'WARNINGFLAGS': ['-pedantic']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000314 },
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000315 'arch:arm': {
316 # This is to silence warnings about ABI changes that some versions of the
317 # CodeSourcery G++ tool chain produce for each occurrence of varargs.
318 'WARNINGFLAGS': ['-Wno-abi']
319 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000320 'disassembler:on': {
321 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
322 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000323 },
324 'msvc': {
325 'all': {
ager@chromium.org0ee099b2011-01-25 14:06:47 +0000326 'WARNINGFLAGS': ['/W3', '/WX', '/wd4351', '/wd4355', '/wd4800']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000327 },
sgjesse@chromium.org4e421f42009-09-07 07:18:16 +0000328 'library:shared': {
329 'CPPDEFINES': ['BUILDING_V8_SHARED'],
330 'LIBS': ['winmm', 'ws2_32']
331 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000332 'arch:arm': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000333 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
ager@chromium.org3bf7b912008-11-17 09:09:45 +0000334 # /wd4996 is to silence the warning about sscanf
335 # used by the arm simulator.
336 'WARNINGFLAGS': ['/wd4996']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000337 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000338 'arch:mips': {
339 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
lrn@chromium.org7516f052011-03-30 08:52:27 +0000340 'mips_arch_variant:mips32r2': {
341 'CPPDEFINES': ['_MIPS_ARCH_MIPS32R2']
342 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000343 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000344 'disassembler:on': {
345 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
346 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000347 }
348}
349
350
iposva@chromium.org245aa852009-02-10 00:49:54 +0000351MKSNAPSHOT_EXTRA_FLAGS = {
352 'gcc': {
353 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000354 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000355 },
356 'os:macos': {
357 'LIBS': ['pthread'],
358 },
359 'os:freebsd': {
ager@chromium.orge2902be2009-06-08 12:21:35 +0000360 'LIBS': ['execinfo', 'pthread']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000361 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000362 'os:solaris': {
363 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
364 'LINKFLAGS': ['-mt']
365 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000366 'os:openbsd': {
367 'LIBS': ['execinfo', 'pthread']
368 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000369 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000370 'LIBS': ['winmm', 'ws2_32'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000371 },
ricow@chromium.org27bf2882011-11-17 08:34:43 +0000372 'os:netbsd': {
373 'LIBS': ['execinfo', 'pthread']
374 },
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000375 'compress_startup_data:bz2': {
376 'os:linux': {
377 'LIBS': ['bz2']
378 }
379 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000380 },
381 'msvc': {
382 'all': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000383 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
ager@chromium.org381abbb2009-02-25 13:23:22 +0000384 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000385 }
386 }
387}
388
389
390DTOA_EXTRA_FLAGS = {
391 'gcc': {
392 'all': {
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000393 'WARNINGFLAGS': ['-Werror', '-Wno-uninitialized'],
394 'CCFLAGS': GCC_DTOA_EXTRA_CCFLAGS
ager@chromium.org236ad962008-09-25 09:45:57 +0000395 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000396 },
397 'msvc': {
398 'all': {
399 'WARNINGFLAGS': ['/WX', '/wd4018', '/wd4244']
400 }
401 }
402}
403
404
405CCTEST_EXTRA_FLAGS = {
406 'all': {
ulan@chromium.org2efb9002012-01-19 15:36:35 +0000407 'CPPPATH': [src_dir],
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000408 'library:shared': {
409 'CPPDEFINES': ['USING_V8_SHARED']
410 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000411 },
412 'gcc': {
413 'all': {
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000414 'LIBPATH': [abspath('.')],
415 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000416 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000417 'LINKFLAGS': ['$CCFLAGS'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000418 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000419 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000420 'LIBS': ['pthread'],
rossberg@chromium.org717967f2011-07-20 13:44:42 +0000421 'CCFLAGS': ['-Wno-unused-but-set-variable'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000422 },
423 'os:macos': {
424 'LIBS': ['pthread'],
425 },
426 'os:freebsd': {
427 'LIBS': ['execinfo', 'pthread']
428 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000429 'os:solaris': {
430 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
431 'LINKFLAGS': ['-mt']
432 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000433 'os:openbsd': {
434 'LIBS': ['execinfo', 'pthread']
435 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000436 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000437 'LIBS': ['winmm', 'ws2_32']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000438 },
ricow@chromium.org27bf2882011-11-17 08:34:43 +0000439 'os:netbsd': {
440 'LIBS': ['execinfo', 'pthread']
441 },
ricow@chromium.orgc9c80822010-04-21 08:22:37 +0000442 'arch:arm': {
443 'LINKFLAGS': ARM_LINK_FLAGS
444 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000445 },
446 'msvc': {
447 'all': {
iposva@chromium.org245aa852009-02-10 00:49:54 +0000448 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
ager@chromium.org381abbb2009-02-25 13:23:22 +0000449 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000450 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000451 'arch:ia32': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000452 'CPPDEFINES': ['V8_TARGET_ARCH_IA32']
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000453 },
454 'arch:x64': {
christian.plesner.hansen@gmail.com9d58c2b2009-10-16 11:48:38 +0000455 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +0000456 'LINKFLAGS': ['/STACK:2097152']
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000457 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000458 }
459}
460
461
462SAMPLE_FLAGS = {
463 'all': {
ulan@chromium.org2efb9002012-01-19 15:36:35 +0000464 'CPPPATH': [join(root_dir, 'include')],
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000465 'library:shared': {
466 'CPPDEFINES': ['USING_V8_SHARED']
467 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000468 },
469 'gcc': {
470 'all': {
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000471 'LIBPATH': ['.'],
472 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000473 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000474 'LINKFLAGS': ['$CCFLAGS'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000475 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000476 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000477 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000478 },
479 'os:macos': {
480 'LIBS': ['pthread'],
481 },
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000482 'os:freebsd': {
lrn@chromium.org7516f052011-03-30 08:52:27 +0000483 'LIBPATH' : ['/usr/local/lib'],
484 'LIBS': ['execinfo', 'pthread']
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000485 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000486 'os:solaris': {
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000487 # On Solaris, to get isinf, INFINITY, fpclassify and other macros one
488 # needs to define __C99FEATURES__.
489 'CPPDEFINES': ['__C99FEATURES__'],
lrn@chromium.org7516f052011-03-30 08:52:27 +0000490 'LIBPATH' : ['/usr/local/lib'],
491 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
492 'LINKFLAGS': ['-mt']
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000493 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000494 'os:openbsd': {
lrn@chromium.org7516f052011-03-30 08:52:27 +0000495 'LIBPATH' : ['/usr/local/lib'],
496 'LIBS': ['execinfo', 'pthread']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000497 },
498 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000499 'LIBS': ['winmm', 'ws2_32']
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000500 },
ricow@chromium.org27bf2882011-11-17 08:34:43 +0000501 'os:netbsd': {
502 'LIBPATH' : ['/usr/pkg/lib'],
503 'LIBS': ['execinfo', 'pthread']
504 },
ricow@chromium.orgc9c80822010-04-21 08:22:37 +0000505 'arch:arm': {
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000506 'LINKFLAGS': ARM_LINK_FLAGS,
507 'armeabi:soft' : {
508 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
509 'simulator:none': {
510 'CCFLAGS': ['-mfloat-abi=soft'],
511 }
512 },
513 'armeabi:softfp' : {
514 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
515 'simulator:none': {
516 'CCFLAGS': ['-mfloat-abi=softfp'],
517 }
518 },
519 'armeabi:hard' : {
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +0000520 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=1'],
521 'vfp3:on': {
522 'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
523 },
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000524 'simulator:none': {
525 'CCFLAGS': ['-mfloat-abi=hard'],
526 }
527 }
ricow@chromium.orgc9c80822010-04-21 08:22:37 +0000528 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000529 'arch:ia32': {
530 'CCFLAGS': ['-m32'],
531 'LINKFLAGS': ['-m32']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000532 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000533 'arch:x64': {
534 'CCFLAGS': ['-m64'],
535 'LINKFLAGS': ['-m64']
536 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000537 'arch:mips': {
538 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
danno@chromium.org40cb8782011-05-25 07:58:50 +0000539 'mips_arch_variant:mips32r2': {
540 'CPPDEFINES': ['_MIPS_ARCH_MIPS32R2']
541 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000542 'simulator:none': {
danno@chromium.org40cb8782011-05-25 07:58:50 +0000543 'CCFLAGS': ['-EL'],
ager@chromium.org5c838252010-02-19 08:53:10 +0000544 'LINKFLAGS': ['-EL'],
danno@chromium.org40cb8782011-05-25 07:58:50 +0000545 'mips_arch_variant:mips32r2': {
546 'CCFLAGS': ['-mips32r2', '-Wa,-mips32r2']
547 },
548 'mips_arch_variant:mips32r1': {
549 'CCFLAGS': ['-mips32', '-Wa,-mips32']
550 },
551 'library:static': {
552 'LINKFLAGS': ['-static', '-static-libgcc']
553 },
554 'mipsabi:softfloat': {
555 'CCFLAGS': ['-msoft-float'],
556 'LINKFLAGS': ['-msoft-float']
557 },
558 'mipsabi:hardfloat': {
559 'CCFLAGS': ['-mhard-float'],
560 'LINKFLAGS': ['-mhard-float']
561 }
ager@chromium.org5c838252010-02-19 08:53:10 +0000562 }
563 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000564 'simulator:arm': {
565 'CCFLAGS': ['-m32'],
566 'LINKFLAGS': ['-m32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000567 },
ager@chromium.org5c838252010-02-19 08:53:10 +0000568 'simulator:mips': {
569 'CCFLAGS': ['-m32'],
570 'LINKFLAGS': ['-m32']
571 },
ager@chromium.org236ad962008-09-25 09:45:57 +0000572 'mode:release': {
573 'CCFLAGS': ['-O2']
574 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000575 'mode:debug': {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000576 'CCFLAGS': ['-g', '-O0'],
577 'CPPDEFINES': ['DEBUG']
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000578 },
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000579 'compress_startup_data:bz2': {
580 'CPPDEFINES': ['COMPRESS_STARTUP_DATA_BZ2'],
581 'os:linux': {
582 'LIBS': ['bz2']
583 }
584 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000585 },
586 'msvc': {
587 'all': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000588 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000589 },
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000590 'verbose:off': {
591 'CCFLAGS': ['/nologo'],
592 'LINKFLAGS': ['/NOLOGO']
593 },
594 'verbose:on': {
595 'LINKFLAGS': ['/VERBOSE']
596 },
ager@chromium.org236ad962008-09-25 09:45:57 +0000597 'prof:on': {
598 'LINKFLAGS': ['/MAP']
599 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000600 'mode:release': {
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000601 'CCFLAGS': ['/O2'],
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000602 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000603 'msvcrt:static': {
604 'CCFLAGS': ['/MT']
605 },
606 'msvcrt:shared': {
607 'CCFLAGS': ['/MD']
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000608 },
609 'msvcltcg:on': {
610 'CCFLAGS': ['/GL'],
ager@chromium.orgce5e87b2010-03-10 10:24:18 +0000611 'pgo:off': {
612 'LINKFLAGS': ['/LTCG'],
613 },
614 },
615 'pgo:instrument': {
616 'LINKFLAGS': ['/LTCG:PGI']
617 },
618 'pgo:optimize': {
619 'LINKFLAGS': ['/LTCG:PGO']
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000620 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000621 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000622 'arch:ia32': {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000623 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', 'WIN32'],
ager@chromium.org18ad94b2009-09-02 08:22:29 +0000624 'LINKFLAGS': ['/MACHINE:X86']
625 },
626 'arch:x64': {
sgjesse@chromium.orgea88ce92011-03-23 11:19:56 +0000627 'CPPDEFINES': ['V8_TARGET_ARCH_X64', 'WIN32'],
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +0000628 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2097152']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000629 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000630 'mode:debug': {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000631 'CCFLAGS': ['/Od'],
632 'LINKFLAGS': ['/DEBUG'],
633 'CPPDEFINES': ['DEBUG'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000634 'msvcrt:static': {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000635 'CCFLAGS': ['/MTd']
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000636 },
637 'msvcrt:shared': {
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000638 'CCFLAGS': ['/MDd']
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000639 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000640 }
641 }
642}
643
644
lrn@chromium.org7516f052011-03-30 08:52:27 +0000645PREPARSER_FLAGS = {
646 'all': {
ulan@chromium.org2efb9002012-01-19 15:36:35 +0000647 'CPPPATH': [join(root_dir, 'include'), src_dir],
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000648 'library:shared': {
649 'CPPDEFINES': ['USING_V8_SHARED']
650 },
lrn@chromium.org7516f052011-03-30 08:52:27 +0000651 },
652 'gcc': {
653 'all': {
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000654 'LIBPATH': ['.'],
655 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000656 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000657 'LINKFLAGS': ['$CCFLAGS'],
lrn@chromium.org7516f052011-03-30 08:52:27 +0000658 },
659 'os:win32': {
660 'LIBS': ['winmm', 'ws2_32']
661 },
lrn@chromium.org7516f052011-03-30 08:52:27 +0000662 'arch:arm': {
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000663 'LINKFLAGS': ARM_LINK_FLAGS,
664 'armeabi:soft' : {
665 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
666 'simulator:none': {
667 'CCFLAGS': ['-mfloat-abi=soft'],
668 }
669 },
670 'armeabi:softfp' : {
671 'simulator:none': {
672 'CCFLAGS': ['-mfloat-abi=softfp'],
673 }
674 },
675 'armeabi:hard' : {
676 'simulator:none': {
677 'CCFLAGS': ['-mfloat-abi=hard'],
678 }
679 }
lrn@chromium.org7516f052011-03-30 08:52:27 +0000680 },
681 'arch:ia32': {
682 'CCFLAGS': ['-m32'],
683 'LINKFLAGS': ['-m32']
684 },
685 'arch:x64': {
686 'CCFLAGS': ['-m64'],
687 'LINKFLAGS': ['-m64']
688 },
689 'arch:mips': {
690 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
691 'mips_arch_variant:mips32r2': {
692 'CPPDEFINES': ['_MIPS_ARCH_MIPS32R2']
693 },
694 'simulator:none': {
695 'CCFLAGS': ['-EL'],
696 'LINKFLAGS': ['-EL'],
697 'mips_arch_variant:mips32r2': {
698 'CCFLAGS': ['-mips32r2', '-Wa,-mips32r2']
699 },
700 'mips_arch_variant:mips32r1': {
701 'CCFLAGS': ['-mips32', '-Wa,-mips32']
702 },
703 'library:static': {
704 'LINKFLAGS': ['-static', '-static-libgcc']
705 },
706 'mipsabi:softfloat': {
707 'CCFLAGS': ['-msoft-float'],
708 'LINKFLAGS': ['-msoft-float']
709 },
710 'mipsabi:hardfloat': {
711 'CCFLAGS': ['-mhard-float'],
712 'LINKFLAGS': ['-mhard-float']
713 }
714 }
715 },
716 'simulator:arm': {
717 'CCFLAGS': ['-m32'],
718 'LINKFLAGS': ['-m32']
719 },
720 'simulator:mips': {
721 'CCFLAGS': ['-m32'],
722 'LINKFLAGS': ['-m32'],
723 'mipsabi:softfloat': {
724 'CPPDEFINES': ['__mips_soft_float=1'],
danno@chromium.org40cb8782011-05-25 07:58:50 +0000725 },
726 'mipsabi:hardfloat': {
727 'CPPDEFINES': ['__mips_hard_float=1'],
lrn@chromium.org7516f052011-03-30 08:52:27 +0000728 }
729 },
730 'mode:release': {
731 'CCFLAGS': ['-O2']
732 },
733 'mode:debug': {
734 'CCFLAGS': ['-g', '-O0'],
735 'CPPDEFINES': ['DEBUG']
736 },
ager@chromium.org04921a82011-06-27 13:21:41 +0000737 'os:freebsd': {
738 'LIBPATH' : ['/usr/local/lib'],
739 },
lrn@chromium.org7516f052011-03-30 08:52:27 +0000740 },
741 'msvc': {
742 'all': {
743 'LIBS': ['winmm', 'ws2_32']
744 },
745 'verbose:off': {
746 'CCFLAGS': ['/nologo'],
747 'LINKFLAGS': ['/NOLOGO']
748 },
749 'verbose:on': {
750 'LINKFLAGS': ['/VERBOSE']
751 },
lrn@chromium.org7516f052011-03-30 08:52:27 +0000752 'prof:on': {
753 'LINKFLAGS': ['/MAP']
754 },
755 'mode:release': {
756 'CCFLAGS': ['/O2'],
757 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
758 'msvcrt:static': {
759 'CCFLAGS': ['/MT']
760 },
761 'msvcrt:shared': {
762 'CCFLAGS': ['/MD']
763 },
764 'msvcltcg:on': {
765 'CCFLAGS': ['/GL'],
766 'pgo:off': {
767 'LINKFLAGS': ['/LTCG'],
768 },
769 },
770 'pgo:instrument': {
771 'LINKFLAGS': ['/LTCG:PGI']
772 },
773 'pgo:optimize': {
774 'LINKFLAGS': ['/LTCG:PGO']
775 }
776 },
777 'arch:ia32': {
778 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', 'WIN32'],
779 'LINKFLAGS': ['/MACHINE:X86']
780 },
781 'arch:x64': {
782 'CPPDEFINES': ['V8_TARGET_ARCH_X64', 'WIN32'],
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +0000783 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2097152']
lrn@chromium.org7516f052011-03-30 08:52:27 +0000784 },
785 'mode:debug': {
786 'CCFLAGS': ['/Od'],
787 'LINKFLAGS': ['/DEBUG'],
788 'CPPDEFINES': ['DEBUG'],
789 'msvcrt:static': {
790 'CCFLAGS': ['/MTd']
791 },
792 'msvcrt:shared': {
793 'CCFLAGS': ['/MDd']
794 }
795 }
796 }
797}
798
799
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000800D8_FLAGS = {
svenpanne@chromium.org84bcc552011-07-18 09:50:57 +0000801 'all': {
802 'library:shared': {
803 'CPPDEFINES': ['V8_SHARED'],
804 'LIBS': ['v8'],
805 'LIBPATH': ['.']
806 },
807 },
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000808 'gcc': {
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000809 'all': {
810 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
ricow@chromium.org4f693d62011-07-04 14:01:31 +0000811 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +0000812 'LINKFLAGS': ['$CCFLAGS'],
813 },
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000814 'console:readline': {
815 'LIBS': ['readline']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000816 },
817 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000818 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000819 },
820 'os:macos': {
821 'LIBS': ['pthread'],
822 },
823 'os:freebsd': {
824 'LIBS': ['pthread'],
825 },
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +0000826 'os:solaris': {
827 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
828 'LINKFLAGS': ['-mt']
829 },
sgjesse@chromium.orgac6aa172009-12-04 12:29:05 +0000830 'os:openbsd': {
831 'LIBS': ['pthread'],
832 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000833 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000834 'LIBS': ['winmm', 'ws2_32'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000835 },
ricow@chromium.org27bf2882011-11-17 08:34:43 +0000836 'os:netbsd': {
837 'LIBS': ['pthread'],
838 },
whesse@chromium.orgba5a61b2010-07-26 11:44:40 +0000839 'arch:arm': {
840 'LINKFLAGS': ARM_LINK_FLAGS
841 },
svenpanne@chromium.org6d786c92011-06-15 10:58:27 +0000842 'compress_startup_data:bz2': {
843 'CPPDEFINES': ['COMPRESS_STARTUP_DATA_BZ2'],
844 'os:linux': {
845 'LIBS': ['bz2']
846 }
847 }
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000848 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000849 'msvc': {
850 'all': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000851 'LIBS': ['winmm', 'ws2_32']
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +0000852 },
853 'verbose:off': {
854 'CCFLAGS': ['/nologo'],
855 'LINKFLAGS': ['/NOLOGO']
856 },
857 'verbose:on': {
858 'LINKFLAGS': ['/VERBOSE']
859 },
860 'prof:on': {
861 'LINKFLAGS': ['/MAP']
862 },
863 'mode:release': {
864 'CCFLAGS': ['/O2'],
865 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
866 'msvcrt:static': {
867 'CCFLAGS': ['/MT']
868 },
869 'msvcrt:shared': {
870 'CCFLAGS': ['/MD']
871 },
872 'msvcltcg:on': {
873 'CCFLAGS': ['/GL'],
874 'pgo:off': {
875 'LINKFLAGS': ['/LTCG'],
876 },
877 },
878 'pgo:instrument': {
879 'LINKFLAGS': ['/LTCG:PGI']
880 },
881 'pgo:optimize': {
882 'LINKFLAGS': ['/LTCG:PGO']
883 }
884 },
885 'arch:ia32': {
886 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', 'WIN32'],
887 'LINKFLAGS': ['/MACHINE:X86']
888 },
889 'arch:x64': {
890 'CPPDEFINES': ['V8_TARGET_ARCH_X64', 'WIN32'],
891 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2097152']
892 },
893 'mode:debug': {
894 'CCFLAGS': ['/Od'],
895 'LINKFLAGS': ['/DEBUG'],
896 'CPPDEFINES': ['DEBUG'],
897 'msvcrt:static': {
898 'CCFLAGS': ['/MTd']
899 },
900 'msvcrt:shared': {
901 'CCFLAGS': ['/MDd']
902 }
iposva@chromium.org245aa852009-02-10 00:49:54 +0000903 }
904 }
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000905}
906
907
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000908SUFFIXES = {
909 'release': '',
910 'debug': '_g'
911}
912
913
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000914def Abort(message):
915 print message
916 sys.exit(1)
917
918
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +0000919def GuessOS(env):
920 return utils.GuessOS()
921
922
923def GuessArch(env):
924 return utils.GuessArchitecture()
925
926
927def GuessToolchain(env):
928 tools = env['TOOLS']
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000929 if 'gcc' in tools:
kasper.lund7276f142008-07-30 08:49:36 +0000930 return 'gcc'
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000931 elif 'msvc' in tools:
932 return 'msvc'
933 else:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000934 return None
935
936
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +0000937def GuessVisibility(env):
938 os = env['os']
939 toolchain = env['toolchain'];
fschneider@chromium.org3a5fd782011-02-24 10:10:44 +0000940 if (os == 'win32' or os == 'cygwin') and toolchain == 'gcc':
941 # MinGW / Cygwin can't do it.
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000942 return 'default'
sgjesse@chromium.orgc6c57182011-01-17 12:24:25 +0000943 elif os == 'solaris':
944 return 'default'
kasperl@chromium.orga5551262010-12-07 12:49:48 +0000945 else:
946 return 'hidden'
947
948
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +0000949def GuessStrictAliasing(env):
950 # There seems to be a problem with gcc 4.5.x.
951 # See http://code.google.com/p/v8/issues/detail?id=884
952 # It can be worked around by disabling strict aliasing.
953 toolchain = env['toolchain'];
954 if toolchain == 'gcc':
955 env = Environment(tools=['gcc'])
956 # The gcc version should be available in env['CCVERSION'],
957 # but when scons detects msvc this value is not set.
958 version = subprocess.Popen([env['CC'], '-dumpversion'],
959 stdout=subprocess.PIPE).communicate()[0]
960 if version.find('4.5') == 0:
961 return 'off'
962 return 'default'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000963
964
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +0000965PLATFORM_OPTIONS = {
966 'arch': {
967 'values': ['arm', 'ia32', 'x64', 'mips'],
968 'guess': GuessArch,
969 'help': 'the architecture to build for'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000970 },
971 'os': {
ricow@chromium.org27bf2882011-11-17 08:34:43 +0000972 'values': ['freebsd', 'linux', 'macos', 'win32', 'openbsd', 'solaris', 'cygwin', 'netbsd'],
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +0000973 'guess': GuessOS,
974 'help': 'the os to build for'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000975 },
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +0000976 'toolchain': {
977 'values': ['gcc', 'msvc'],
978 'guess': GuessToolchain,
979 'help': 'the toolchain to use'
980 }
981}
982
983SIMPLE_OPTIONS = {
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000984 'regexp': {
985 'values': ['native', 'interpreted'],
986 'default': 'native',
987 'help': 'Whether to use native or interpreted regexp implementation'
988 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000989 'snapshot': {
iposva@chromium.org245aa852009-02-10 00:49:54 +0000990 'values': ['on', 'off', 'nobuild'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000991 'default': 'off',
992 'help': 'build using snapshots for faster start-up'
993 },
ager@chromium.org236ad962008-09-25 09:45:57 +0000994 'prof': {
sgjesse@chromium.org496c03a2011-02-14 12:05:43 +0000995 'values': ['on', 'off'],
ager@chromium.org236ad962008-09-25 09:45:57 +0000996 'default': 'off',
997 'help': 'enable profiling of build target'
998 },
erik.corry@gmail.com0511e242011-01-19 11:11:08 +0000999 'gdbjit': {
1000 'values': ['on', 'off'],
1001 'default': 'off',
1002 'help': 'enable GDB JIT interface'
1003 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001004 'library': {
1005 'values': ['static', 'shared'],
1006 'default': 'static',
1007 'help': 'the type of library to produce'
1008 },
whesse@chromium.org023421e2010-12-21 12:19:12 +00001009 'objectprint': {
1010 'values': ['on', 'off'],
1011 'default': 'off',
1012 'help': 'enable object printing'
1013 },
ager@chromium.org4af710e2009-09-15 12:20:11 +00001014 'profilingsupport': {
1015 'values': ['on', 'off'],
1016 'default': 'on',
1017 'help': 'enable profiling of JavaScript code'
1018 },
1019 'debuggersupport': {
1020 'values': ['on', 'off'],
1021 'default': 'on',
1022 'help': 'enable debugging of JavaScript code'
1023 },
erik.corry@gmail.com0511e242011-01-19 11:11:08 +00001024 'inspector': {
1025 'values': ['on', 'off'],
1026 'default': 'off',
1027 'help': 'enable inspector features'
1028 },
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001029 'liveobjectlist': {
1030 'values': ['on', 'off'],
1031 'default': 'off',
1032 'help': 'enable live object list features in the debugger'
1033 },
ager@chromium.org5ec48922009-05-05 07:25:34 +00001034 'soname': {
1035 'values': ['on', 'off'],
1036 'default': 'off',
1037 'help': 'turn on setting soname for Linux shared library'
1038 },
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001039 'msvcrt': {
1040 'values': ['static', 'shared'],
1041 'default': 'static',
ager@chromium.org65dad4b2009-04-23 08:48:43 +00001042 'help': 'the type of Microsoft Visual C++ runtime library to use'
1043 },
1044 'msvcltcg': {
1045 'values': ['on', 'off'],
1046 'default': 'on',
1047 'help': 'use Microsoft Visual C++ link-time code generation'
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001048 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001049 'simulator': {
ager@chromium.org5c838252010-02-19 08:53:10 +00001050 'values': ['arm', 'mips', 'none'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001051 'default': 'none',
1052 'help': 'build with simulator'
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001053 },
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001054 'unalignedaccesses': {
1055 'values': ['default', 'on', 'off'],
1056 'default': 'default',
1057 'help': 'set whether the ARM target supports unaligned accesses'
1058 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001059 'disassembler': {
1060 'values': ['on', 'off'],
1061 'default': 'off',
1062 'help': 'enable the disassembler to inspect generated code'
1063 },
fschneider@chromium.org7979bbb2011-03-28 10:47:03 +00001064 'fasttls': {
1065 'values': ['on', 'off'],
1066 'default': 'on',
1067 'help': 'enable fast thread local storage support '
1068 '(if available on the current architecture/platform)'
1069 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001070 'sourcesignatures': {
1071 'values': ['MD5', 'timestamp'],
1072 'default': 'MD5',
1073 'help': 'set how the build system detects file changes'
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001074 },
1075 'console': {
1076 'values': ['dumb', 'readline'],
1077 'default': 'dumb',
1078 'help': 'the console to use for the d8 shell'
ager@chromium.org18ad94b2009-09-02 08:22:29 +00001079 },
1080 'verbose': {
1081 'values': ['on', 'off'],
1082 'default': 'off',
1083 'help': 'more output from compiler and linker'
ager@chromium.org4af710e2009-09-15 12:20:11 +00001084 },
1085 'visibility': {
1086 'values': ['default', 'hidden'],
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001087 'guess': GuessVisibility,
1088 'help': 'shared library symbol visibility'
1089 },
1090 'strictaliasing': {
1091 'values': ['default', 'off'],
1092 'guess': GuessStrictAliasing,
1093 'help': 'assume strict aliasing while optimizing'
kmillikin@chromium.org13bd2942009-12-16 15:36:05 +00001094 },
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001095 'pgo': {
1096 'values': ['off', 'instrument', 'optimize'],
1097 'default': 'off',
1098 'help': 'select profile guided optimization variant',
lrn@chromium.org7516f052011-03-30 08:52:27 +00001099 },
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00001100 'armeabi': {
1101 'values': ['hard', 'softfp', 'soft'],
1102 'default': 'softfp',
1103 'help': 'generate calling conventiont according to selected ARM EABI variant'
1104 },
lrn@chromium.org7516f052011-03-30 08:52:27 +00001105 'mipsabi': {
1106 'values': ['hardfloat', 'softfloat', 'none'],
1107 'default': 'hardfloat',
1108 'help': 'generate calling conventiont according to selected mips ABI'
1109 },
1110 'mips_arch_variant': {
1111 'values': ['mips32r2', 'mips32r1'],
1112 'default': 'mips32r2',
1113 'help': 'mips variant'
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00001114 },
1115 'compress_startup_data': {
1116 'values': ['off', 'bz2'],
1117 'default': 'off',
1118 'help': 'compress startup data (snapshot) [Linux only]'
1119 },
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001120 'vfp3': {
1121 'values': ['on', 'off'],
1122 'default': 'on',
1123 'help': 'use vfp3 instructions when building the snapshot [Arm only]'
1124 },
1125
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001126}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001127
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001128ALL_OPTIONS = dict(PLATFORM_OPTIONS, **SIMPLE_OPTIONS)
1129
1130
1131def AddOptions(options, result):
1132 guess_env = Environment(options=result)
1133 for (name, option) in options.iteritems():
1134 if 'guess' in option:
1135 # Option has a guess function
1136 guess = option.get('guess')
1137 default = guess(guess_env)
1138 else:
1139 # Option has a fixed default
1140 default = option.get('default')
1141 help = '%s (%s)' % (option.get('help'), ", ".join(option['values']))
1142 result.Add(name, help, default)
1143
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001144
1145def GetOptions():
1146 result = Options()
kasper.lund7276f142008-07-30 08:49:36 +00001147 result.Add('mode', 'compilation mode (debug, release)', 'release')
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00001148 result.Add('sample', 'build sample (shell, process, lineprocessor)', '')
ager@chromium.org2cc82ae2010-06-14 07:35:38 +00001149 result.Add('cache', 'directory to use for scons build cache', '')
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +00001150 result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '')
1151 result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '')
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001152 AddOptions(PLATFORM_OPTIONS, result)
1153 AddOptions(SIMPLE_OPTIONS, result)
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001154 return result
1155
1156
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001157def GetTools(opts):
1158 env = Environment(options=opts)
1159 os = env['os']
1160 toolchain = env['toolchain']
1161 if os == 'win32' and toolchain == 'gcc':
1162 return ['mingw']
1163 elif os == 'win32' and toolchain == 'msvc':
1164 return ['msvc', 'mslink', 'mslib', 'msvs']
1165 else:
1166 return ['default']
1167
1168
ager@chromium.org5ec48922009-05-05 07:25:34 +00001169def GetVersionComponents():
1170 MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)")
1171 MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)")
1172 BUILD_NUMBER_PATTERN = re.compile(r"#define\s+BUILD_NUMBER\s+(.*)")
1173 PATCH_LEVEL_PATTERN = re.compile(r"#define\s+PATCH_LEVEL\s+(.*)")
1174
1175 patterns = [MAJOR_VERSION_PATTERN,
1176 MINOR_VERSION_PATTERN,
1177 BUILD_NUMBER_PATTERN,
1178 PATCH_LEVEL_PATTERN]
1179
1180 source = open(join(root_dir, 'src', 'version.cc')).read()
1181 version_components = []
1182 for pattern in patterns:
1183 match = pattern.search(source)
1184 if match:
1185 version_components.append(match.group(1).strip())
1186 else:
1187 version_components.append('0')
1188
1189 return version_components
1190
1191
1192def GetVersion():
1193 version_components = GetVersionComponents()
ager@chromium.org5aa501c2009-06-23 07:57:28 +00001194
ager@chromium.org5ec48922009-05-05 07:25:34 +00001195 if version_components[len(version_components) - 1] == '0':
1196 version_components.pop()
1197 return '.'.join(version_components)
1198
1199
1200def GetSpecificSONAME():
1201 SONAME_PATTERN = re.compile(r"#define\s+SONAME\s+\"(.*)\"")
ager@chromium.org5aa501c2009-06-23 07:57:28 +00001202
ager@chromium.org5ec48922009-05-05 07:25:34 +00001203 source = open(join(root_dir, 'src', 'version.cc')).read()
1204 match = SONAME_PATTERN.search(source)
ager@chromium.org5aa501c2009-06-23 07:57:28 +00001205
ager@chromium.org5ec48922009-05-05 07:25:34 +00001206 if match:
1207 return match.group(1).strip()
1208 else:
1209 return ''
1210
1211
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001212def SplitList(str):
1213 return [ s for s in str.split(",") if len(s) > 0 ]
1214
1215
1216def IsLegal(env, option, values):
1217 str = env[option]
1218 for s in SplitList(str):
1219 if not s in values:
1220 Abort("Illegal value for option %s '%s'." % (option, s))
1221 return False
1222 return True
1223
1224
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001225def VerifyOptions(env):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001226 if not IsLegal(env, 'mode', ['debug', 'release']):
1227 return False
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00001228 if not IsLegal(env, 'sample', ["shell", "process", "lineprocessor"]):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001229 return False
kasperl@chromium.org68ac0092009-07-09 06:00:35 +00001230 if not IsLegal(env, 'regexp', ["native", "interpreted"]):
1231 return False
ager@chromium.org236ad962008-09-25 09:45:57 +00001232 if env['os'] == 'win32' and env['library'] == 'shared' and env['prof'] == 'on':
1233 Abort("Profiling on windows only supported for static library.")
ricow@chromium.org4f693d62011-07-04 14:01:31 +00001234 if env['gdbjit'] == 'on' and ((env['os'] != 'linux' and env['os'] != 'macos') or (env['arch'] != 'ia32' and env['arch'] != 'x64' and env['arch'] != 'arm')):
1235 Abort("GDBJIT interface is supported only for Intel-compatible (ia32 or x64) Linux/OSX target.")
ager@chromium.org5ec48922009-05-05 07:25:34 +00001236 if env['os'] == 'win32' and env['soname'] == 'on':
1237 Abort("Shared Object soname not applicable for Windows.")
1238 if env['soname'] == 'on' and env['library'] == 'static':
1239 Abort("Shared Object soname not applicable for static library.")
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001240 if env['os'] != 'win32' and env['pgo'] != 'off':
1241 Abort("Profile guided optimization only supported on Windows.")
ager@chromium.org2cc82ae2010-06-14 07:35:38 +00001242 if env['cache'] and not os.path.isdir(env['cache']):
1243 Abort("The specified cache directory does not exist.")
ricow@chromium.org30ce4112010-05-31 10:38:25 +00001244 if not (env['arch'] == 'arm' or env['simulator'] == 'arm') and ('unalignedaccesses' in ARGUMENTS):
1245 print env['arch']
1246 print env['simulator']
1247 Abort("Option unalignedaccesses only supported for the ARM architecture.")
sgjesse@chromium.org8e8294a2011-05-02 14:30:53 +00001248 if env['os'] != 'linux' and env['compress_startup_data'] != 'off':
1249 Abort("Startup data compression is only available on Linux")
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001250 for (name, option) in ALL_OPTIONS.iteritems():
1251 if (not name in env):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001252 message = ("A value for option %s must be specified (%s)." %
1253 (name, ", ".join(option['values'])))
1254 Abort(message)
1255 if not env[name] in option['values']:
1256 message = ("Unknown %s value '%s'. Possible values are (%s)." %
1257 (name, env[name], ", ".join(option['values'])))
1258 Abort(message)
1259
1260
1261class BuildContext(object):
1262
v8.team.kasperl727e9952008-09-02 14:56:44 +00001263 def __init__(self, options, env_overrides, samples):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001264 self.library_targets = []
iposva@chromium.org245aa852009-02-10 00:49:54 +00001265 self.mksnapshot_targets = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001266 self.cctest_targets = []
1267 self.sample_targets = []
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001268 self.d8_targets = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001269 self.options = options
v8.team.kasperl727e9952008-09-02 14:56:44 +00001270 self.env_overrides = env_overrides
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001271 self.samples = samples
lrn@chromium.org7516f052011-03-30 08:52:27 +00001272 self.preparser_targets = []
iposva@chromium.org245aa852009-02-10 00:49:54 +00001273 self.use_snapshot = (options['snapshot'] != 'off')
1274 self.build_snapshot = (options['snapshot'] == 'on')
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001275 self.flags = None
ager@chromium.org236ad962008-09-25 09:45:57 +00001276
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001277 def AddRelevantFlags(self, initial, flags):
1278 result = initial.copy()
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001279 toolchain = self.options['toolchain']
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001280 if toolchain in flags:
1281 self.AppendFlags(result, flags[toolchain].get('all'))
1282 for option in sorted(self.options.keys()):
1283 value = self.options[option]
1284 self.AppendFlags(result, flags[toolchain].get(option + ':' + value))
ager@chromium.org3a37e9b2009-04-27 09:26:21 +00001285 self.AppendFlags(result, flags.get('all'))
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001286 return result
1287
1288 def AddRelevantSubFlags(self, options, flags):
1289 self.AppendFlags(options, flags.get('all'))
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001290 for option in sorted(self.options.keys()):
1291 value = self.options[option]
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001292 self.AppendFlags(options, flags.get(option + ':' + value))
ager@chromium.org236ad962008-09-25 09:45:57 +00001293
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001294 def GetRelevantSources(self, source):
1295 result = []
1296 result += source.get('all', [])
ager@chromium.org236ad962008-09-25 09:45:57 +00001297 for (name, value) in self.options.iteritems():
sgjesse@chromium.org911335c2009-08-19 12:59:44 +00001298 source_value = source.get(name + ':' + value, [])
1299 if type(source_value) == dict:
1300 result += self.GetRelevantSources(source_value)
1301 else:
1302 result += source_value
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001303 return sorted(result)
1304
1305 def AppendFlags(self, options, added):
1306 if not added:
1307 return
ager@chromium.org236ad962008-09-25 09:45:57 +00001308 for (key, value) in added.iteritems():
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001309 if key.find(':') != -1:
1310 self.AddRelevantSubFlags(options, { key: value })
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001311 else:
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001312 if not key in options:
1313 options[key] = value
1314 else:
1315 prefix = options[key]
1316 if isinstance(prefix, StringTypes): prefix = prefix.split()
1317 options[key] = prefix + value
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001318
1319 def ConfigureObject(self, env, input, **kw):
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001320 if (kw.has_key('CPPPATH') and env.has_key('CPPPATH')):
1321 kw['CPPPATH'] += env['CPPPATH']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001322 if self.options['library'] == 'static':
1323 return env.StaticObject(input, **kw)
1324 else:
1325 return env.SharedObject(input, **kw)
1326
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001327 def ApplyEnvOverrides(self, env):
1328 if not self.env_overrides:
1329 return
1330 if type(env['ENV']) == DictType:
1331 env['ENV'].update(**self.env_overrides)
1332 else:
1333 env['ENV'] = self.env_overrides
1334
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001335
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001336def PostprocessOptions(options, os):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001337 # Adjust architecture if the simulator option has been set
1338 if (options['simulator'] != 'none') and (options['arch'] != options['simulator']):
1339 if 'arch' in ARGUMENTS:
1340 # Print a warning if arch has explicitly been set
1341 print "Warning: forcing architecture to match simulator (%s)" % options['simulator']
1342 options['arch'] = options['simulator']
ager@chromium.org4af710e2009-09-15 12:20:11 +00001343 if (options['prof'] != 'off') and (options['profilingsupport'] == 'off'):
1344 # Print a warning if profiling is enabled without profiling support
1345 print "Warning: forcing profilingsupport on when prof is on"
1346 options['profilingsupport'] = 'on'
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001347 if os == 'win32' and options['pgo'] != 'off' and options['msvcltcg'] == 'off':
1348 if 'msvcltcg' in ARGUMENTS:
1349 print "Warning: forcing msvcltcg on as it is required for pgo (%s)" % options['pgo']
1350 options['msvcltcg'] = 'on'
danno@chromium.org40cb8782011-05-25 07:58:50 +00001351 if (options['mipsabi'] != 'none') and (options['arch'] != 'mips') and (options['simulator'] != 'mips'):
1352 options['mipsabi'] = 'none'
vegorov@chromium.org0a4e9012011-01-24 12:33:13 +00001353 if options['liveobjectlist'] == 'on':
1354 if (options['debuggersupport'] != 'on') or (options['mode'] == 'release'):
1355 # Print a warning that liveobjectlist will implicitly enable the debugger
1356 print "Warning: forcing debuggersupport on for liveobjectlist"
1357 options['debuggersupport'] = 'on'
ager@chromium.org0ee099b2011-01-25 14:06:47 +00001358 options['inspector'] = 'on'
1359 options['objectprint'] = 'on'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001360
1361
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +00001362def ParseEnvOverrides(arg, imports):
1363 # The environment overrides are in the format NAME0:value0,NAME1:value1,...
1364 # The environment imports are in the format NAME0,NAME1,...
v8.team.kasperl727e9952008-09-02 14:56:44 +00001365 overrides = {}
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +00001366 for var in imports.split(','):
1367 if var in os.environ:
1368 overrides[var] = os.environ[var]
v8.team.kasperl727e9952008-09-02 14:56:44 +00001369 for override in arg.split(','):
1370 pos = override.find(':')
1371 if pos == -1:
1372 continue
1373 overrides[override[:pos].strip()] = override[pos+1:].strip()
1374 return overrides
1375
1376
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001377def BuildSpecific(env, mode, env_overrides, tools):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001378 options = {'mode': mode}
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001379 for option in ALL_OPTIONS:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001380 options[option] = env[option]
ager@chromium.orgce5e87b2010-03-10 10:24:18 +00001381 PostprocessOptions(options, env['os'])
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001382
v8.team.kasperl727e9952008-09-02 14:56:44 +00001383 context = BuildContext(options, env_overrides, samples=SplitList(env['sample']))
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001384
ager@chromium.orgab99eea2009-08-25 07:05:41 +00001385 # Remove variables which can't be imported from the user's external
1386 # environment into a construction environment.
1387 user_environ = os.environ.copy()
1388 try:
1389 del user_environ['ENV']
1390 except KeyError:
1391 pass
1392
1393 library_flags = context.AddRelevantFlags(user_environ, LIBRARY_FLAGS)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001394 v8_flags = context.AddRelevantFlags(library_flags, V8_EXTRA_FLAGS)
iposva@chromium.org245aa852009-02-10 00:49:54 +00001395 mksnapshot_flags = context.AddRelevantFlags(library_flags, MKSNAPSHOT_EXTRA_FLAGS)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001396 dtoa_flags = context.AddRelevantFlags(library_flags, DTOA_EXTRA_FLAGS)
ager@chromium.org236ad962008-09-25 09:45:57 +00001397 cctest_flags = context.AddRelevantFlags(v8_flags, CCTEST_EXTRA_FLAGS)
ager@chromium.orgab99eea2009-08-25 07:05:41 +00001398 sample_flags = context.AddRelevantFlags(user_environ, SAMPLE_FLAGS)
lrn@chromium.org7516f052011-03-30 08:52:27 +00001399 preparser_flags = context.AddRelevantFlags(user_environ, PREPARSER_FLAGS)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001400 d8_flags = context.AddRelevantFlags(library_flags, D8_FLAGS)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001401
1402 context.flags = {
1403 'v8': v8_flags,
iposva@chromium.org245aa852009-02-10 00:49:54 +00001404 'mksnapshot': mksnapshot_flags,
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001405 'dtoa': dtoa_flags,
1406 'cctest': cctest_flags,
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001407 'sample': sample_flags,
lrn@chromium.org7516f052011-03-30 08:52:27 +00001408 'd8': d8_flags,
1409 'preparser': preparser_flags
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001410 }
ager@chromium.org236ad962008-09-25 09:45:57 +00001411
ager@chromium.org5ec48922009-05-05 07:25:34 +00001412 # Generate library base name.
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001413 target_id = mode
1414 suffix = SUFFIXES[target_id]
1415 library_name = 'v8' + suffix
lrn@chromium.org7516f052011-03-30 08:52:27 +00001416 preparser_library_name = 'v8preparser' + suffix
ager@chromium.org5ec48922009-05-05 07:25:34 +00001417 version = GetVersion()
1418 if context.options['soname'] == 'on':
1419 # When building shared object with SONAME version the library name.
1420 library_name += '-' + version
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001421
ager@chromium.org5ec48922009-05-05 07:25:34 +00001422 # Generate library SONAME if required by the build.
1423 if context.options['soname'] == 'on':
1424 soname = GetSpecificSONAME()
1425 if soname == '':
1426 soname = 'lib' + library_name + '.so'
1427 env['SONAME'] = soname
1428
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001429 # Build the object files by invoking SCons recursively.
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001430 d8_env = Environment(tools=tools)
1431 d8_env.Replace(**context.flags['d8'])
lrn@chromium.org7516f052011-03-30 08:52:27 +00001432 (object_files, shell_files, mksnapshot, preparser_files) = env.SConscript(
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001433 join('src', 'SConscript'),
1434 build_dir=join('obj', target_id),
kmillikin@chromium.org7c2628c2011-08-10 11:27:35 +00001435 exports='context tools d8_env',
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001436 duplicate=False
1437 )
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001438
iposva@chromium.org245aa852009-02-10 00:49:54 +00001439 context.mksnapshot_targets.append(mksnapshot)
1440
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001441 # Link the object files into a library.
kasperl@chromium.orgb9123622008-09-17 14:05:56 +00001442 env.Replace(**context.flags['v8'])
sgjesse@chromium.orgb302e562010-02-03 11:26:59 +00001443
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001444 context.ApplyEnvOverrides(env)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001445 if context.options['library'] == 'static':
1446 library = env.StaticLibrary(library_name, object_files)
lrn@chromium.org7516f052011-03-30 08:52:27 +00001447 preparser_library = env.StaticLibrary(preparser_library_name,
1448 preparser_files)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001449 else:
1450 # There seems to be a glitch in the way scons decides where to put
1451 # PDB files when compiling using MSVC so we specify it manually.
1452 # This should not affect any other platforms.
1453 pdb_name = library_name + '.dll.pdb'
1454 library = env.SharedLibrary(library_name, object_files, PDB=pdb_name)
lrn@chromium.org7516f052011-03-30 08:52:27 +00001455 preparser_pdb_name = preparser_library_name + '.dll.pdb';
whesse@chromium.org7b260152011-06-20 15:33:18 +00001456 preparser_soname = 'lib' + preparser_library_name + '.so';
lrn@chromium.org7516f052011-03-30 08:52:27 +00001457 preparser_library = env.SharedLibrary(preparser_library_name,
1458 preparser_files,
whesse@chromium.org7b260152011-06-20 15:33:18 +00001459 PDB=preparser_pdb_name,
1460 SONAME=preparser_soname)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001461 context.library_targets.append(library)
lrn@chromium.org7516f052011-03-30 08:52:27 +00001462 context.library_targets.append(preparser_library)
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001463
fschneider@chromium.org0c20e672010-01-14 15:28:53 +00001464 context.ApplyEnvOverrides(d8_env)
svenpanne@chromium.org84bcc552011-07-18 09:50:57 +00001465 if context.options['library'] == 'static':
1466 shell = d8_env.Program('d8' + suffix, object_files + shell_files)
1467 else:
1468 shell = d8_env.Program('d8' + suffix, shell_files)
1469 d8_env.Depends(shell, library)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001470 context.d8_targets.append(shell)
1471
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001472 for sample in context.samples:
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001473 sample_env = Environment(tools=tools)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001474 sample_env.Replace(**context.flags['sample'])
sgjesse@chromium.orgdf7a2842010-03-25 14:34:15 +00001475 sample_env.Prepend(LIBS=[library_name])
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001476 context.ApplyEnvOverrides(sample_env)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001477 sample_object = sample_env.SConscript(
1478 join('samples', 'SConscript'),
1479 build_dir=join('obj', 'sample', sample, target_id),
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001480 exports='sample context tools',
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001481 duplicate=False
1482 )
1483 sample_name = sample + suffix
1484 sample_program = sample_env.Program(sample_name, sample_object)
1485 sample_env.Depends(sample_program, library)
1486 context.sample_targets.append(sample_program)
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001487
ager@chromium.orgb26c50a2010-03-26 09:27:16 +00001488 cctest_env = env.Copy()
1489 cctest_env.Prepend(LIBS=[library_name])
1490 cctest_program = cctest_env.SConscript(
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001491 join('test', 'cctest', 'SConscript'),
1492 build_dir=join('obj', 'test', target_id),
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001493 exports='context object_files tools',
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001494 duplicate=False
1495 )
1496 context.cctest_targets.append(cctest_program)
ager@chromium.orgbb29dc92009-03-24 13:25:23 +00001497
lrn@chromium.org7516f052011-03-30 08:52:27 +00001498 preparser_env = env.Copy()
1499 preparser_env.Replace(**context.flags['preparser'])
1500 preparser_env.Prepend(LIBS=[preparser_library_name])
1501 context.ApplyEnvOverrides(preparser_env)
1502 preparser_object = preparser_env.SConscript(
1503 join('preparser', 'SConscript'),
1504 build_dir=join('obj', 'preparser', target_id),
sgjesse@chromium.org6db88712011-07-11 11:41:22 +00001505 exports='context tools',
lrn@chromium.org7516f052011-03-30 08:52:27 +00001506 duplicate=False
1507 )
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001508 preparser_name = join('obj', 'preparser', target_id, 'preparser')
lrn@chromium.org7516f052011-03-30 08:52:27 +00001509 preparser_program = preparser_env.Program(preparser_name, preparser_object);
1510 preparser_env.Depends(preparser_program, preparser_library)
1511 context.preparser_targets.append(preparser_program)
1512
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001513 return context
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001514
1515
kasper.lund7276f142008-07-30 08:49:36 +00001516def Build():
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001517 opts = GetOptions()
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001518 tools = GetTools(opts)
1519 env = Environment(options=opts, tools=tools)
1520
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001521 Help(opts.GenerateHelpText(env))
1522 VerifyOptions(env)
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +00001523 env_overrides = ParseEnvOverrides(env['env'], env['importenv'])
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001524
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001525 SourceSignatures(env['sourcesignatures'])
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001526
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001527 libraries = []
iposva@chromium.org245aa852009-02-10 00:49:54 +00001528 mksnapshots = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001529 cctests = []
1530 samples = []
lrn@chromium.org7516f052011-03-30 08:52:27 +00001531 preparsers = []
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001532 d8s = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001533 modes = SplitList(env['mode'])
1534 for mode in modes:
kmillikin@chromium.orgc36ce6e2011-04-04 08:25:31 +00001535 context = BuildSpecific(env.Copy(), mode, env_overrides, tools)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001536 libraries += context.library_targets
iposva@chromium.org245aa852009-02-10 00:49:54 +00001537 mksnapshots += context.mksnapshot_targets
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001538 cctests += context.cctest_targets
1539 samples += context.sample_targets
lrn@chromium.org7516f052011-03-30 08:52:27 +00001540 preparsers += context.preparser_targets
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001541 d8s += context.d8_targets
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +00001542
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001543 env.Alias('library', libraries)
iposva@chromium.org245aa852009-02-10 00:49:54 +00001544 env.Alias('mksnapshot', mksnapshots)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001545 env.Alias('cctests', cctests)
1546 env.Alias('sample', samples)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +00001547 env.Alias('d8', d8s)
lrn@chromium.org7516f052011-03-30 08:52:27 +00001548 env.Alias('preparser', preparsers)
ager@chromium.orga74f0da2008-12-03 16:05:52 +00001549
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001550 if env['sample']:
1551 env.Default('sample')
kasper.lund7276f142008-07-30 08:49:36 +00001552 else:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +00001553 env.Default('library')
kasper.lund7276f142008-07-30 08:49:36 +00001554
ager@chromium.org2cc82ae2010-06-14 07:35:38 +00001555 if env['cache']:
1556 CacheDir(env['cache'])
kasper.lund7276f142008-07-30 08:49:36 +00001557
v8.team.kasperl727e9952008-09-02 14:56:44 +00001558# We disable deprecation warnings because we need to be able to use
1559# env.Copy without getting warnings for compatibility with older
1560# version of scons. Also, there's a bug in some revisions that
1561# doesn't allow this flag to be set, so we swallow any exceptions.
1562# Lovely.
1563try:
1564 SetOption('warn', 'no-deprecated')
1565except:
1566 pass
1567
1568
kasper.lund7276f142008-07-30 08:49:36 +00001569Build()