blob: dbcd616862e757c6f44618ad6ff189e41a78156f [file] [log] [blame]
ager@chromium.org9258b6b2008-09-11 09:11:10 +00001# Copyright 2008 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.org5ec48922009-05-05 07:25:34 +000038
ager@chromium.orgbb29dc92009-03-24 13:25:23 +000039# ANDROID_TOP is the top of the Android checkout, fetched from the environment
40# variable 'TOP'. You will also need to set the CXX, CC, AR and RANLIB
41# environment variables to the cross-compiling tools.
42ANDROID_TOP = os.environ.get('TOP')
43if ANDROID_TOP is None:
44 ANDROID_TOP=""
45
kasperl@chromium.org71affb52009-05-26 05:44:31 +000046# TODO: Sort these issues out properly but as a temporary solution for gcc 4.4
ager@chromium.orge2902be2009-06-08 12:21:35 +000047# on linux we need these compiler flags to avoid crashes in the v8 test suite
48# and avoid dtoa.c strict aliasing issues
kasperl@chromium.org71affb52009-05-26 05:44:31 +000049if os.environ.get('GCC_VERSION') == '44':
ager@chromium.orge2902be2009-06-08 12:21:35 +000050 GCC_EXTRA_CCFLAGS = ['-fno-tree-vrp']
kasperl@chromium.org71affb52009-05-26 05:44:31 +000051 GCC_DTOA_EXTRA_CCFLAGS = ['-fno-strict-aliasing']
52else:
53 GCC_EXTRA_CCFLAGS = []
54 GCC_DTOA_EXTRA_CCFLAGS = []
55
ager@chromium.orgbb29dc92009-03-24 13:25:23 +000056ANDROID_FLAGS = ['-march=armv5te',
57 '-mtune=xscale',
58 '-msoft-float',
59 '-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',
73 '-MD']
74
75ANDROID_INCLUDES = [ANDROID_TOP + '/bionic/libc/arch-arm/include',
76 ANDROID_TOP + '/bionic/libc/include',
77 ANDROID_TOP + '/bionic/libstdc++/include',
78 ANDROID_TOP + '/bionic/libc/kernel/common',
79 ANDROID_TOP + '/bionic/libc/kernel/arch-arm',
80 ANDROID_TOP + '/bionic/libm/include',
81 ANDROID_TOP + '/bionic/libm/include/arch/arm',
82 ANDROID_TOP + '/bionic/libthread_db/include']
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +000083
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +000084ANDROID_LINKFLAGS = ['-nostdlib',
85 '-Bdynamic',
86 '-Wl,-T,' + ANDROID_TOP + '/build/core/armelf.x',
87 '-Wl,-dynamic-linker,/system/bin/linker',
88 '-Wl,--gc-sections',
89 '-Wl,-z,nocopyreloc',
90 '-Wl,-rpath-link=' + ANDROID_TOP + '/out/target/product/generic/obj/lib',
91 ANDROID_TOP + '/out/target/product/generic/obj/lib/crtbegin_dynamic.o',
92 ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.2.1/lib/gcc/arm-eabi/4.2.1/interwork/libgcc.a',
93 ANDROID_TOP + '/out/target/product/generic/obj/lib/crtend_android.o'];
94
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +000095LIBRARY_FLAGS = {
96 'all': {
ager@chromium.org3a37e9b2009-04-27 09:26:21 +000097 'CPPDEFINES': ['ENABLE_LOGGING_AND_PROFILING'],
kasperl@chromium.org68ac0092009-07-09 06:00:35 +000098 'CPPPATH': [join(root_dir, 'src')],
99 'regexp:native': {
100 'arch:ia32' : {
101 'CPPDEFINES': ['V8_NATIVE_REGEXP']
102 }
103 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000104 },
105 'gcc': {
106 'all': {
kasperl@chromium.org41044eb2008-10-06 08:24:46 +0000107 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000108 'CXXFLAGS': ['$CCFLAGS', '-fno-rtti', '-fno-exceptions'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000109 },
110 'mode:debug': {
111 'CCFLAGS': ['-g', '-O0'],
ager@chromium.org71daaf62009-04-01 07:22:49 +0000112 'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'],
113 'os:android': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000114 'CPPDEFINES': ['ENABLE_DEBUGGER_SUPPORT'],
ager@chromium.org71daaf62009-04-01 07:22:49 +0000115 'CCFLAGS': ['-mthumb']
116 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000117 },
118 'mode:release': {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000119 'CCFLAGS': ['-O3', '-fomit-frame-pointer', '-fdata-sections',
120 '-ffunction-sections'],
121 'os:android': {
ager@chromium.org71daaf62009-04-01 07:22:49 +0000122 'CCFLAGS': ['-mthumb', '-Os'],
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000123 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG', 'ENABLE_DEBUGGER_SUPPORT']
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000124 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000125 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000126 'os:linux': {
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000127 'CCFLAGS': ['-ansi'] + GCC_EXTRA_CCFLAGS,
sgjesse@chromium.orgf8c81802009-03-30 07:19:14 +0000128 'library:shared': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000129 'LIBS': ['pthread']
sgjesse@chromium.orgf8c81802009-03-30 07:19:14 +0000130 }
iposva@chromium.org245aa852009-02-10 00:49:54 +0000131 },
132 'os:macos': {
ager@chromium.org5aa501c2009-06-23 07:57:28 +0000133 'CCFLAGS': ['-ansi', '-mmacosx-version-min=10.4'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000134 },
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000135 'os:freebsd': {
ager@chromium.orge2902be2009-06-08 12:21:35 +0000136 'CPPPATH' : ['/usr/local/include'],
137 'LIBPATH' : ['/usr/local/lib'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000138 'CCFLAGS': ['-ansi'],
139 },
140 'os:win32': {
141 'CCFLAGS': ['-DWIN32'],
142 'CXXFLAGS': ['-DWIN32'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000143 },
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000144 'os:android': {
145 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
146 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
147 'CCFLAGS': ANDROID_FLAGS,
148 'WARNINGFLAGS': ['-Wall', '-Wno-unused', '-Werror=return-type',
149 '-Wstrict-aliasing=2'],
150 'CPPPATH': ANDROID_INCLUDES,
151 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000152 'arch:ia32': {
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000153 'CPPDEFINES': ['V8_TARGET_ARCH_IA32'],
154 'CCFLAGS': ['-m32'],
155 'LINKFLAGS': ['-m32']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000156 },
157 'arch:arm': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000158 'CPPDEFINES': ['V8_TARGET_ARCH_ARM']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000159 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000160 'simulator:arm': {
161 'CCFLAGS': ['-m32'],
162 'LINKFLAGS': ['-m32']
163 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000164 'arch:x64': {
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000165 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
166 'CCFLAGS': ['-fno-strict-aliasing', '-m64'],
167 'LINKFLAGS': ['-m64'],
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000168 },
169 'prof:oprofile': {
170 'CPPDEFINES': ['ENABLE_OPROFILE_AGENT']
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000171 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000172 },
173 'msvc': {
174 'all': {
175 'DIALECTFLAGS': ['/nologo'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000176 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
v8.team.kasperl727e9952008-09-02 14:56:44 +0000177 'CXXFLAGS': ['$CCFLAGS', '/GR-', '/Gy'],
kasperl@chromium.orgacae3782009-04-11 09:17:08 +0000178 'CPPDEFINES': ['WIN32', '_USE_32BIT_TIME_T'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000179 'LINKFLAGS': ['/NOLOGO', '/MACHINE:X86', '/INCREMENTAL:NO',
180 '/NXCOMPAT', '/IGNORE:4221'],
181 'ARFLAGS': ['/NOLOGO'],
182 'CCPDBFLAGS': ['/Zi']
183 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000184 'arch:ia32': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000185 'CPPDEFINES': ['V8_TARGET_ARCH_IA32']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000186 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000187 'mode:debug': {
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000188 'CCFLAGS': ['/Od', '/Gm'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000189 'CPPDEFINES': ['_DEBUG', 'ENABLE_DISASSEMBLER', 'DEBUG'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000190 'LINKFLAGS': ['/DEBUG'],
191 'msvcrt:static': {
192 'CCFLAGS': ['/MTd']
193 },
194 'msvcrt:shared': {
195 'CCFLAGS': ['/MDd']
196 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000197 },
198 'mode:release': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000199 'CCFLAGS': ['/O2'],
200 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000201 'msvcrt:static': {
202 'CCFLAGS': ['/MT']
203 },
204 'msvcrt:shared': {
205 'CCFLAGS': ['/MD']
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000206 },
207 'msvcltcg:on': {
208 'CCFLAGS': ['/GL'],
209 'LINKFLAGS': ['/LTCG'],
210 'ARFLAGS': ['/LTCG'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000211 }
ager@chromium.org5ec48922009-05-05 07:25:34 +0000212 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000213 }
214}
215
216
217V8_EXTRA_FLAGS = {
218 'gcc': {
219 'all': {
220 'CXXFLAGS': [], #['-fvisibility=hidden'],
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000221 'WARNINGFLAGS': ['-Wall', '-Werror', '-W',
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000222 '-Wno-unused-parameter']
223 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000224 'os:win32': {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000225 'WARNINGFLAGS': ['-pedantic', '-Wno-long-long']
226 },
227 'os:linux': {
ager@chromium.org5ec48922009-05-05 07:25:34 +0000228 'WARNINGFLAGS': ['-pedantic'],
229 'library:shared': {
230 'soname:on': {
231 'LINKFLAGS': ['-Wl,-soname,${SONAME}']
232 }
233 }
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000234 },
235 'os:macos': {
236 'WARNINGFLAGS': ['-pedantic']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000237 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000238 'disassembler:on': {
239 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
240 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000241 },
242 'msvc': {
243 'all': {
244 'WARNINGFLAGS': ['/W3', '/WX', '/wd4355', '/wd4800']
245 },
246 'library:shared': {
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000247 'CPPDEFINES': ['BUILDING_V8_SHARED'],
248 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000249 },
250 'arch:arm': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000251 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
ager@chromium.org3bf7b912008-11-17 09:09:45 +0000252 # /wd4996 is to silence the warning about sscanf
253 # used by the arm simulator.
254 'WARNINGFLAGS': ['/wd4996']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000255 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000256 'disassembler:on': {
257 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
258 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000259 }
260}
261
262
iposva@chromium.org245aa852009-02-10 00:49:54 +0000263MKSNAPSHOT_EXTRA_FLAGS = {
264 'gcc': {
265 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000266 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000267 },
268 'os:macos': {
269 'LIBS': ['pthread'],
270 },
271 'os:freebsd': {
ager@chromium.orge2902be2009-06-08 12:21:35 +0000272 'LIBS': ['execinfo', 'pthread']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000273 },
274 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000275 'LIBS': ['winmm', 'ws2_32'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000276 },
277 },
278 'msvc': {
279 'all': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000280 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
ager@chromium.org381abbb2009-02-25 13:23:22 +0000281 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000282 }
283 }
284}
285
286
287DTOA_EXTRA_FLAGS = {
288 'gcc': {
289 'all': {
kasperl@chromium.org71affb52009-05-26 05:44:31 +0000290 'WARNINGFLAGS': ['-Werror', '-Wno-uninitialized'],
291 'CCFLAGS': GCC_DTOA_EXTRA_CCFLAGS
ager@chromium.org236ad962008-09-25 09:45:57 +0000292 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000293 },
294 'msvc': {
295 'all': {
296 'WARNINGFLAGS': ['/WX', '/wd4018', '/wd4244']
297 }
298 }
299}
300
301
302CCTEST_EXTRA_FLAGS = {
303 'all': {
304 'CPPPATH': [join(root_dir, 'src')],
305 'LIBS': ['$LIBRARY']
306 },
307 'gcc': {
308 'all': {
309 'LIBPATH': [abspath('.')]
310 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000311 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000312 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000313 },
314 'os:macos': {
315 'LIBS': ['pthread'],
316 },
317 'os:freebsd': {
318 'LIBS': ['execinfo', 'pthread']
319 },
320 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000321 'LIBS': ['winmm', 'ws2_32']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000322 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000323 'os:android': {
324 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
325 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
326 'CCFLAGS': ANDROID_FLAGS,
327 'CPPPATH': ANDROID_INCLUDES,
328 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib'],
329 'LINKFLAGS': ANDROID_LINKFLAGS,
330 'LIBS': ['c', 'stdc++', 'm'],
331 'mode:release': {
332 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
333 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000334 },
335 },
336 'msvc': {
337 'all': {
iposva@chromium.org245aa852009-02-10 00:49:54 +0000338 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
ager@chromium.org381abbb2009-02-25 13:23:22 +0000339 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000340 },
341 'library:shared': {
342 'CPPDEFINES': ['USING_V8_SHARED']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000343 },
344 'arch:ia32': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000345 'CPPDEFINES': ['V8_TARGET_ARCH_IA32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000346 }
347 }
348}
349
350
351SAMPLE_FLAGS = {
352 'all': {
v8.team.kasperl727e9952008-09-02 14:56:44 +0000353 'CPPPATH': [join(abspath('.'), 'include')],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000354 'LIBS': ['$LIBRARY'],
355 },
356 'gcc': {
357 'all': {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000358 'LIBPATH': ['.'],
359 'CCFLAGS': ['-fno-rtti', '-fno-exceptions']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000360 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000361 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000362 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000363 },
364 'os:macos': {
365 'LIBS': ['pthread'],
366 },
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000367 'os:freebsd': {
ager@chromium.orge2902be2009-06-08 12:21:35 +0000368 'LIBPATH' : ['/usr/local/lib'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000369 'LIBS': ['execinfo', 'pthread']
370 },
371 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000372 'LIBS': ['winmm', 'ws2_32']
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000373 },
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000374 'os:android': {
375 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
376 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
377 'CCFLAGS': ANDROID_FLAGS,
378 'CPPPATH': ANDROID_INCLUDES,
379 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib'],
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +0000380 'LINKFLAGS': ANDROID_LINKFLAGS,
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000381 'LIBS': ['c', 'stdc++', 'm'],
382 'mode:release': {
383 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
384 }
385 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000386 'arch:ia32': {
387 'CCFLAGS': ['-m32'],
388 'LINKFLAGS': ['-m32']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000389 },
kasperl@chromium.orge959c182009-07-27 08:59:04 +0000390 'arch:x64': {
391 'CCFLAGS': ['-m64'],
392 'LINKFLAGS': ['-m64']
393 },
394 'simulator:arm': {
395 'CCFLAGS': ['-m32'],
396 'LINKFLAGS': ['-m32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000397 },
ager@chromium.org236ad962008-09-25 09:45:57 +0000398 'mode:release': {
399 'CCFLAGS': ['-O2']
400 },
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000401 'mode:debug': {
402 'CCFLAGS': ['-g', '-O0']
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000403 },
404 'prof:oprofile': {
405 'LIBPATH': ['/usr/lib32', '/usr/lib32/oprofile'],
406 'LIBS': ['opagent']
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000407 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000408 },
409 'msvc': {
410 'all': {
411 'CCFLAGS': ['/nologo'],
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000412 'LINKFLAGS': ['/nologo'],
ager@chromium.org381abbb2009-02-25 13:23:22 +0000413 'LIBS': ['winmm', 'ws2_32']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000414 },
415 'library:shared': {
416 'CPPDEFINES': ['USING_V8_SHARED']
417 },
ager@chromium.org236ad962008-09-25 09:45:57 +0000418 'prof:on': {
419 'LINKFLAGS': ['/MAP']
420 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000421 'mode:release': {
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000422 'CCFLAGS': ['/O2'],
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000423 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000424 'msvcrt:static': {
425 'CCFLAGS': ['/MT']
426 },
427 'msvcrt:shared': {
428 'CCFLAGS': ['/MD']
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000429 },
430 'msvcltcg:on': {
431 'CCFLAGS': ['/GL'],
432 'LINKFLAGS': ['/LTCG'],
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000433 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000434 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000435 'arch:ia32': {
ager@chromium.org9085a012009-05-11 19:22:57 +0000436 'CPPDEFINES': ['V8_TARGET_ARCH_IA32']
ager@chromium.org5ec48922009-05-05 07:25:34 +0000437 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000438 'mode:debug': {
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000439 'CCFLAGS': ['/Od'],
440 'LINKFLAGS': ['/DEBUG'],
441 'msvcrt:static': {
442 'CCFLAGS': ['/MTd']
443 },
444 'msvcrt:shared': {
445 'CCFLAGS': ['/MDd']
446 }
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000447 }
448 }
449}
450
451
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000452D8_FLAGS = {
453 'gcc': {
454 'console:readline': {
455 'LIBS': ['readline']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000456 },
457 'os:linux': {
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000458 'LIBS': ['pthread'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000459 },
460 'os:macos': {
461 'LIBS': ['pthread'],
462 },
463 'os:freebsd': {
464 'LIBS': ['pthread'],
465 },
kasperl@chromium.orgf5aa8372009-03-24 14:47:14 +0000466 'os:android': {
467 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib'],
468 'LINKFLAGS': ANDROID_LINKFLAGS,
469 'LIBS': ['c', 'stdc++', 'm'],
470 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000471 'os:win32': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000472 'LIBS': ['winmm', 'ws2_32'],
iposva@chromium.org245aa852009-02-10 00:49:54 +0000473 },
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000474 },
iposva@chromium.org245aa852009-02-10 00:49:54 +0000475 'msvc': {
476 'all': {
ager@chromium.org381abbb2009-02-25 13:23:22 +0000477 'LIBS': ['winmm', 'ws2_32']
iposva@chromium.org245aa852009-02-10 00:49:54 +0000478 }
479 }
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000480}
481
482
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000483SUFFIXES = {
484 'release': '',
485 'debug': '_g'
486}
487
488
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000489def Abort(message):
490 print message
491 sys.exit(1)
492
493
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000494def GuessToolchain(os):
495 tools = Environment()['TOOLS']
496 if 'gcc' in tools:
kasper.lund7276f142008-07-30 08:49:36 +0000497 return 'gcc'
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000498 elif 'msvc' in tools:
499 return 'msvc'
500 else:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000501 return None
502
503
ager@chromium.org870a0b62008-11-04 11:43:05 +0000504OS_GUESS = utils.GuessOS()
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000505TOOLCHAIN_GUESS = GuessToolchain(OS_GUESS)
ager@chromium.orgc27e4e72008-09-04 13:52:27 +0000506ARCH_GUESS = utils.GuessArchitecture()
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000507
508
509SIMPLE_OPTIONS = {
510 'toolchain': {
511 'values': ['gcc', 'msvc'],
512 'default': TOOLCHAIN_GUESS,
ager@chromium.org5ec48922009-05-05 07:25:34 +0000513 'help': 'the toolchain to use (' + TOOLCHAIN_GUESS + ')'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000514 },
515 'os': {
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000516 'values': ['freebsd', 'linux', 'macos', 'win32', 'android'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000517 'default': OS_GUESS,
ager@chromium.org5ec48922009-05-05 07:25:34 +0000518 'help': 'the os to build for (' + OS_GUESS + ')'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000519 },
520 'arch': {
ager@chromium.org5ec48922009-05-05 07:25:34 +0000521 'values':['arm', 'ia32', 'x64'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000522 'default': ARCH_GUESS,
ager@chromium.org5ec48922009-05-05 07:25:34 +0000523 'help': 'the architecture to build for (' + ARCH_GUESS + ')'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000524 },
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000525 'regexp': {
526 'values': ['native', 'interpreted'],
527 'default': 'native',
528 'help': 'Whether to use native or interpreted regexp implementation'
529 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000530 'snapshot': {
iposva@chromium.org245aa852009-02-10 00:49:54 +0000531 'values': ['on', 'off', 'nobuild'],
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000532 'default': 'off',
533 'help': 'build using snapshots for faster start-up'
534 },
ager@chromium.org236ad962008-09-25 09:45:57 +0000535 'prof': {
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000536 'values': ['on', 'off', 'oprofile'],
ager@chromium.org236ad962008-09-25 09:45:57 +0000537 'default': 'off',
538 'help': 'enable profiling of build target'
539 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000540 'library': {
541 'values': ['static', 'shared'],
542 'default': 'static',
543 'help': 'the type of library to produce'
544 },
ager@chromium.org5ec48922009-05-05 07:25:34 +0000545 'soname': {
546 'values': ['on', 'off'],
547 'default': 'off',
548 'help': 'turn on setting soname for Linux shared library'
549 },
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000550 'msvcrt': {
551 'values': ['static', 'shared'],
552 'default': 'static',
ager@chromium.org65dad4b2009-04-23 08:48:43 +0000553 'help': 'the type of Microsoft Visual C++ runtime library to use'
554 },
555 'msvcltcg': {
556 'values': ['on', 'off'],
557 'default': 'on',
558 'help': 'use Microsoft Visual C++ link-time code generation'
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000559 },
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000560 'simulator': {
561 'values': ['arm', 'none'],
562 'default': 'none',
563 'help': 'build with simulator'
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000564 },
565 'disassembler': {
566 'values': ['on', 'off'],
567 'default': 'off',
568 'help': 'enable the disassembler to inspect generated code'
569 },
570 'sourcesignatures': {
571 'values': ['MD5', 'timestamp'],
572 'default': 'MD5',
573 'help': 'set how the build system detects file changes'
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000574 },
575 'console': {
576 'values': ['dumb', 'readline'],
577 'default': 'dumb',
578 'help': 'the console to use for the d8 shell'
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000579 }
580}
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000581
582
583def GetOptions():
584 result = Options()
kasper.lund7276f142008-07-30 08:49:36 +0000585 result.Add('mode', 'compilation mode (debug, release)', 'release')
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000586 result.Add('sample', 'build sample (shell, process)', '')
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +0000587 result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '')
588 result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '')
ager@chromium.org236ad962008-09-25 09:45:57 +0000589 for (name, option) in SIMPLE_OPTIONS.iteritems():
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000590 help = '%s (%s)' % (name, ", ".join(option['values']))
591 result.Add(name, help, option.get('default'))
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000592 return result
593
594
ager@chromium.org5ec48922009-05-05 07:25:34 +0000595def GetVersionComponents():
596 MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)")
597 MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)")
598 BUILD_NUMBER_PATTERN = re.compile(r"#define\s+BUILD_NUMBER\s+(.*)")
599 PATCH_LEVEL_PATTERN = re.compile(r"#define\s+PATCH_LEVEL\s+(.*)")
600
601 patterns = [MAJOR_VERSION_PATTERN,
602 MINOR_VERSION_PATTERN,
603 BUILD_NUMBER_PATTERN,
604 PATCH_LEVEL_PATTERN]
605
606 source = open(join(root_dir, 'src', 'version.cc')).read()
607 version_components = []
608 for pattern in patterns:
609 match = pattern.search(source)
610 if match:
611 version_components.append(match.group(1).strip())
612 else:
613 version_components.append('0')
614
615 return version_components
616
617
618def GetVersion():
619 version_components = GetVersionComponents()
ager@chromium.org5aa501c2009-06-23 07:57:28 +0000620
ager@chromium.org5ec48922009-05-05 07:25:34 +0000621 if version_components[len(version_components) - 1] == '0':
622 version_components.pop()
623 return '.'.join(version_components)
624
625
626def GetSpecificSONAME():
627 SONAME_PATTERN = re.compile(r"#define\s+SONAME\s+\"(.*)\"")
ager@chromium.org5aa501c2009-06-23 07:57:28 +0000628
ager@chromium.org5ec48922009-05-05 07:25:34 +0000629 source = open(join(root_dir, 'src', 'version.cc')).read()
630 match = SONAME_PATTERN.search(source)
ager@chromium.org5aa501c2009-06-23 07:57:28 +0000631
ager@chromium.org5ec48922009-05-05 07:25:34 +0000632 if match:
633 return match.group(1).strip()
634 else:
635 return ''
636
637
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000638def SplitList(str):
639 return [ s for s in str.split(",") if len(s) > 0 ]
640
641
642def IsLegal(env, option, values):
643 str = env[option]
644 for s in SplitList(str):
645 if not s in values:
646 Abort("Illegal value for option %s '%s'." % (option, s))
647 return False
648 return True
649
650
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000651def VerifyOptions(env):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000652 if not IsLegal(env, 'mode', ['debug', 'release']):
653 return False
654 if not IsLegal(env, 'sample', ["shell", "process"]):
655 return False
kasperl@chromium.org68ac0092009-07-09 06:00:35 +0000656 if not IsLegal(env, 'regexp', ["native", "interpreted"]):
657 return False
ager@chromium.org236ad962008-09-25 09:45:57 +0000658 if env['os'] == 'win32' and env['library'] == 'shared' and env['prof'] == 'on':
659 Abort("Profiling on windows only supported for static library.")
kasperl@chromium.org7be3c992009-03-12 07:19:55 +0000660 if env['prof'] == 'oprofile' and env['os'] != 'linux':
661 Abort("OProfile is only supported on Linux.")
ager@chromium.org5ec48922009-05-05 07:25:34 +0000662 if env['os'] == 'win32' and env['soname'] == 'on':
663 Abort("Shared Object soname not applicable for Windows.")
664 if env['soname'] == 'on' and env['library'] == 'static':
665 Abort("Shared Object soname not applicable for static library.")
ager@chromium.org236ad962008-09-25 09:45:57 +0000666 for (name, option) in SIMPLE_OPTIONS.iteritems():
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000667 if (not option.get('default')) and (name not in ARGUMENTS):
668 message = ("A value for option %s must be specified (%s)." %
669 (name, ", ".join(option['values'])))
670 Abort(message)
671 if not env[name] in option['values']:
672 message = ("Unknown %s value '%s'. Possible values are (%s)." %
673 (name, env[name], ", ".join(option['values'])))
674 Abort(message)
675
676
677class BuildContext(object):
678
v8.team.kasperl727e9952008-09-02 14:56:44 +0000679 def __init__(self, options, env_overrides, samples):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000680 self.library_targets = []
iposva@chromium.org245aa852009-02-10 00:49:54 +0000681 self.mksnapshot_targets = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000682 self.cctest_targets = []
683 self.sample_targets = []
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000684 self.d8_targets = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000685 self.options = options
v8.team.kasperl727e9952008-09-02 14:56:44 +0000686 self.env_overrides = env_overrides
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000687 self.samples = samples
iposva@chromium.org245aa852009-02-10 00:49:54 +0000688 self.use_snapshot = (options['snapshot'] != 'off')
689 self.build_snapshot = (options['snapshot'] == 'on')
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000690 self.flags = None
ager@chromium.org236ad962008-09-25 09:45:57 +0000691
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000692 def AddRelevantFlags(self, initial, flags):
693 result = initial.copy()
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000694 toolchain = self.options['toolchain']
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000695 if toolchain in flags:
696 self.AppendFlags(result, flags[toolchain].get('all'))
697 for option in sorted(self.options.keys()):
698 value = self.options[option]
699 self.AppendFlags(result, flags[toolchain].get(option + ':' + value))
ager@chromium.org3a37e9b2009-04-27 09:26:21 +0000700 self.AppendFlags(result, flags.get('all'))
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000701 return result
702
703 def AddRelevantSubFlags(self, options, flags):
704 self.AppendFlags(options, flags.get('all'))
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000705 for option in sorted(self.options.keys()):
706 value = self.options[option]
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000707 self.AppendFlags(options, flags.get(option + ':' + value))
ager@chromium.org236ad962008-09-25 09:45:57 +0000708
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000709 def GetRelevantSources(self, source):
710 result = []
711 result += source.get('all', [])
ager@chromium.org236ad962008-09-25 09:45:57 +0000712 for (name, value) in self.options.iteritems():
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000713 result += source.get(name + ':' + value, [])
714 return sorted(result)
715
716 def AppendFlags(self, options, added):
717 if not added:
718 return
ager@chromium.org236ad962008-09-25 09:45:57 +0000719 for (key, value) in added.iteritems():
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000720 if key.find(':') != -1:
721 self.AddRelevantSubFlags(options, { key: value })
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000722 else:
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000723 if not key in options:
724 options[key] = value
725 else:
726 prefix = options[key]
727 if isinstance(prefix, StringTypes): prefix = prefix.split()
728 options[key] = prefix + value
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000729
730 def ConfigureObject(self, env, input, **kw):
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000731 if (kw.has_key('CPPPATH') and env.has_key('CPPPATH')):
732 kw['CPPPATH'] += env['CPPPATH']
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000733 if self.options['library'] == 'static':
734 return env.StaticObject(input, **kw)
735 else:
736 return env.SharedObject(input, **kw)
737
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000738 def ApplyEnvOverrides(self, env):
739 if not self.env_overrides:
740 return
741 if type(env['ENV']) == DictType:
742 env['ENV'].update(**self.env_overrides)
743 else:
744 env['ENV'] = self.env_overrides
745
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000746
747def PostprocessOptions(options):
748 # Adjust architecture if the simulator option has been set
749 if (options['simulator'] != 'none') and (options['arch'] != options['simulator']):
750 if 'arch' in ARGUMENTS:
751 # Print a warning if arch has explicitly been set
752 print "Warning: forcing architecture to match simulator (%s)" % options['simulator']
753 options['arch'] = options['simulator']
754
755
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +0000756def ParseEnvOverrides(arg, imports):
757 # The environment overrides are in the format NAME0:value0,NAME1:value1,...
758 # The environment imports are in the format NAME0,NAME1,...
v8.team.kasperl727e9952008-09-02 14:56:44 +0000759 overrides = {}
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +0000760 for var in imports.split(','):
761 if var in os.environ:
762 overrides[var] = os.environ[var]
v8.team.kasperl727e9952008-09-02 14:56:44 +0000763 for override in arg.split(','):
764 pos = override.find(':')
765 if pos == -1:
766 continue
767 overrides[override[:pos].strip()] = override[pos+1:].strip()
768 return overrides
769
770
771def BuildSpecific(env, mode, env_overrides):
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000772 options = {'mode': mode}
773 for option in SIMPLE_OPTIONS:
774 options[option] = env[option]
775 PostprocessOptions(options)
776
v8.team.kasperl727e9952008-09-02 14:56:44 +0000777 context = BuildContext(options, env_overrides, samples=SplitList(env['sample']))
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000778
779 library_flags = context.AddRelevantFlags(os.environ, LIBRARY_FLAGS)
780 v8_flags = context.AddRelevantFlags(library_flags, V8_EXTRA_FLAGS)
iposva@chromium.org245aa852009-02-10 00:49:54 +0000781 mksnapshot_flags = context.AddRelevantFlags(library_flags, MKSNAPSHOT_EXTRA_FLAGS)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000782 dtoa_flags = context.AddRelevantFlags(library_flags, DTOA_EXTRA_FLAGS)
ager@chromium.org236ad962008-09-25 09:45:57 +0000783 cctest_flags = context.AddRelevantFlags(v8_flags, CCTEST_EXTRA_FLAGS)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000784 sample_flags = context.AddRelevantFlags(os.environ, SAMPLE_FLAGS)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000785 d8_flags = context.AddRelevantFlags(library_flags, D8_FLAGS)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000786
787 context.flags = {
788 'v8': v8_flags,
iposva@chromium.org245aa852009-02-10 00:49:54 +0000789 'mksnapshot': mksnapshot_flags,
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000790 'dtoa': dtoa_flags,
791 'cctest': cctest_flags,
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000792 'sample': sample_flags,
793 'd8': d8_flags
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000794 }
ager@chromium.org236ad962008-09-25 09:45:57 +0000795
ager@chromium.org5ec48922009-05-05 07:25:34 +0000796 # Generate library base name.
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000797 target_id = mode
798 suffix = SUFFIXES[target_id]
799 library_name = 'v8' + suffix
ager@chromium.org5ec48922009-05-05 07:25:34 +0000800 version = GetVersion()
801 if context.options['soname'] == 'on':
802 # When building shared object with SONAME version the library name.
803 library_name += '-' + version
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000804 env['LIBRARY'] = library_name
805
ager@chromium.org5ec48922009-05-05 07:25:34 +0000806 # Generate library SONAME if required by the build.
807 if context.options['soname'] == 'on':
808 soname = GetSpecificSONAME()
809 if soname == '':
810 soname = 'lib' + library_name + '.so'
811 env['SONAME'] = soname
812
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000813 # Build the object files by invoking SCons recursively.
iposva@chromium.org245aa852009-02-10 00:49:54 +0000814 (object_files, shell_files, mksnapshot) = env.SConscript(
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000815 join('src', 'SConscript'),
816 build_dir=join('obj', target_id),
817 exports='context',
818 duplicate=False
819 )
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000820
iposva@chromium.org245aa852009-02-10 00:49:54 +0000821 context.mksnapshot_targets.append(mksnapshot)
822
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000823 # Link the object files into a library.
kasperl@chromium.orgb9123622008-09-17 14:05:56 +0000824 env.Replace(**context.flags['v8'])
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000825 context.ApplyEnvOverrides(env)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000826 if context.options['library'] == 'static':
827 library = env.StaticLibrary(library_name, object_files)
828 else:
829 # There seems to be a glitch in the way scons decides where to put
830 # PDB files when compiling using MSVC so we specify it manually.
831 # This should not affect any other platforms.
832 pdb_name = library_name + '.dll.pdb'
833 library = env.SharedLibrary(library_name, object_files, PDB=pdb_name)
834 context.library_targets.append(library)
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000835
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000836 d8_env = Environment()
837 d8_env.Replace(**context.flags['d8'])
838 shell = d8_env.Program('d8' + suffix, object_files + shell_files)
839 context.d8_targets.append(shell)
840
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000841 for sample in context.samples:
842 sample_env = Environment(LIBRARY=library_name)
843 sample_env.Replace(**context.flags['sample'])
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000844 context.ApplyEnvOverrides(sample_env)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000845 sample_object = sample_env.SConscript(
846 join('samples', 'SConscript'),
847 build_dir=join('obj', 'sample', sample, target_id),
848 exports='sample context',
849 duplicate=False
850 )
851 sample_name = sample + suffix
852 sample_program = sample_env.Program(sample_name, sample_object)
853 sample_env.Depends(sample_program, library)
854 context.sample_targets.append(sample_program)
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000855
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000856 cctest_program = env.SConscript(
857 join('test', 'cctest', 'SConscript'),
858 build_dir=join('obj', 'test', target_id),
859 exports='context object_files',
860 duplicate=False
861 )
862 context.cctest_targets.append(cctest_program)
ager@chromium.orgbb29dc92009-03-24 13:25:23 +0000863
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000864 return context
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000865
866
kasper.lund7276f142008-07-30 08:49:36 +0000867def Build():
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000868 opts = GetOptions()
869 env = Environment(options=opts)
870 Help(opts.GenerateHelpText(env))
871 VerifyOptions(env)
kasperl@chromium.org8ccb0be2009-04-07 07:21:39 +0000872 env_overrides = ParseEnvOverrides(env['env'], env['importenv'])
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000873
ager@chromium.org9258b6b2008-09-11 09:11:10 +0000874 SourceSignatures(env['sourcesignatures'])
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000875
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000876 libraries = []
iposva@chromium.org245aa852009-02-10 00:49:54 +0000877 mksnapshots = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000878 cctests = []
879 samples = []
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000880 d8s = []
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000881 modes = SplitList(env['mode'])
882 for mode in modes:
v8.team.kasperl727e9952008-09-02 14:56:44 +0000883 context = BuildSpecific(env.Copy(), mode, env_overrides)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000884 libraries += context.library_targets
iposva@chromium.org245aa852009-02-10 00:49:54 +0000885 mksnapshots += context.mksnapshot_targets
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000886 cctests += context.cctest_targets
887 samples += context.sample_targets
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000888 d8s += context.d8_targets
christian.plesner.hansen43d26ec2008-07-03 15:10:15 +0000889
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000890 env.Alias('library', libraries)
iposva@chromium.org245aa852009-02-10 00:49:54 +0000891 env.Alias('mksnapshot', mksnapshots)
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000892 env.Alias('cctests', cctests)
893 env.Alias('sample', samples)
kasperl@chromium.org5a8ca6c2008-10-23 13:57:19 +0000894 env.Alias('d8', d8s)
ager@chromium.orga74f0da2008-12-03 16:05:52 +0000895
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000896 if env['sample']:
897 env.Default('sample')
kasper.lund7276f142008-07-30 08:49:36 +0000898 else:
mads.s.ager@gmail.com9a4089a2008-09-01 08:55:01 +0000899 env.Default('library')
kasper.lund7276f142008-07-30 08:49:36 +0000900
901
v8.team.kasperl727e9952008-09-02 14:56:44 +0000902# We disable deprecation warnings because we need to be able to use
903# env.Copy without getting warnings for compatibility with older
904# version of scons. Also, there's a bug in some revisions that
905# doesn't allow this flag to be set, so we swallow any exceptions.
906# Lovely.
907try:
908 SetOption('warn', 'no-deprecated')
909except:
910 pass
911
912
kasper.lund7276f142008-07-30 08:49:36 +0000913Build()