blob: f6d1385a62eaa2d8b506190600a7af3352c72823 [file] [log] [blame]
Steve Block6ded16b2010-05-10 14:33:55 +01001# Copyright 2010 the V8 project authors. All rights reserved.
Steve Blocka7e24c12009-10-30 11:49:00 +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
29import re
30import sys
31import os
32from os.path import join, dirname, abspath
33from types import DictType, StringTypes
34root_dir = dirname(File('SConstruct').rfile().abspath)
35sys.path.append(join(root_dir, 'tools'))
36import js2c, utils
37
Steve Blocka7e24c12009-10-30 11:49:00 +000038# ANDROID_TOP is the top of the Android checkout, fetched from the environment
39# variable 'TOP'. You will also need to set the CXX, CC, AR and RANLIB
40# environment variables to the cross-compiling tools.
41ANDROID_TOP = os.environ.get('TOP')
42if ANDROID_TOP is None:
43 ANDROID_TOP=""
44
Steve Block6ded16b2010-05-10 14:33:55 +010045# ARM_TARGET_LIB is the path to the dynamic library to use on the target
Kristian Monsen50ef84f2010-07-29 15:18:00 +010046# machine if cross-compiling to an arm machine. You will also need to set
Steve Block6ded16b2010-05-10 14:33:55 +010047# the additional cross-compiling environment variables to the cross compiler.
48ARM_TARGET_LIB = os.environ.get('ARM_TARGET_LIB')
49if ARM_TARGET_LIB:
50 ARM_LINK_FLAGS = ['-Wl,-rpath=' + ARM_TARGET_LIB + '/lib:' +
51 ARM_TARGET_LIB + '/usr/lib',
52 '-Wl,--dynamic-linker=' + ARM_TARGET_LIB +
53 '/lib/ld-linux.so.3']
54else:
55 ARM_LINK_FLAGS = []
56
Iain Merrick75681382010-08-19 15:07:18 +010057GCC_EXTRA_CCFLAGS = []
58GCC_DTOA_EXTRA_CCFLAGS = []
Steve Blocka7e24c12009-10-30 11:49:00 +000059
Steve Block6ded16b2010-05-10 14:33:55 +010060ANDROID_FLAGS = ['-march=armv7-a',
61 '-mtune=cortex-a8',
62 '-mfloat-abi=softfp',
63 '-mfpu=vfp',
Steve Blocka7e24c12009-10-30 11:49:00 +000064 '-fpic',
65 '-mthumb-interwork',
66 '-funwind-tables',
67 '-fstack-protector',
68 '-fno-short-enums',
69 '-fmessage-length=0',
70 '-finline-functions',
71 '-fno-inline-functions-called-once',
72 '-fgcse-after-reload',
73 '-frerun-cse-after-loop',
74 '-frename-registers',
75 '-fomit-frame-pointer',
Steve Blocka7e24c12009-10-30 11:49:00 +000076 '-finline-limit=64',
Steve Block6ded16b2010-05-10 14:33:55 +010077 '-DCAN_USE_VFP_INSTRUCTIONS=1',
78 '-DCAN_USE_ARMV7_INSTRUCTIONS=1',
Kristian Monsen25f61362010-05-21 11:50:48 +010079 '-DCAN_USE_UNALIGNED_ACCESSES=1',
Steve Blocka7e24c12009-10-30 11:49:00 +000080 '-MD']
81
82ANDROID_INCLUDES = [ANDROID_TOP + '/bionic/libc/arch-arm/include',
83 ANDROID_TOP + '/bionic/libc/include',
84 ANDROID_TOP + '/bionic/libstdc++/include',
85 ANDROID_TOP + '/bionic/libc/kernel/common',
86 ANDROID_TOP + '/bionic/libc/kernel/arch-arm',
87 ANDROID_TOP + '/bionic/libm/include',
88 ANDROID_TOP + '/bionic/libm/include/arch/arm',
89 ANDROID_TOP + '/bionic/libthread_db/include',
90 ANDROID_TOP + '/frameworks/base/include',
91 ANDROID_TOP + '/system/core/include']
92
93ANDROID_LINKFLAGS = ['-nostdlib',
94 '-Bdynamic',
95 '-Wl,-T,' + ANDROID_TOP + '/build/core/armelf.x',
96 '-Wl,-dynamic-linker,/system/bin/linker',
97 '-Wl,--gc-sections',
98 '-Wl,-z,nocopyreloc',
99 '-Wl,-rpath-link=' + ANDROID_TOP + '/out/target/product/generic/obj/lib',
100 ANDROID_TOP + '/out/target/product/generic/obj/lib/crtbegin_dynamic.o',
Steve Block6ded16b2010-05-10 14:33:55 +0100101 ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork/libgcc.a',
Steve Blocka7e24c12009-10-30 11:49:00 +0000102 ANDROID_TOP + '/out/target/product/generic/obj/lib/crtend_android.o'];
103
104LIBRARY_FLAGS = {
105 'all': {
106 'CPPPATH': [join(root_dir, 'src')],
Steve Block6ded16b2010-05-10 14:33:55 +0100107 'regexp:interpreted': {
108 'CPPDEFINES': ['V8_INTERPRETED_REGEXP']
Steve Blocka7e24c12009-10-30 11:49:00 +0000109 },
110 'mode:debug': {
Ben Murdochb0fe1622011-05-05 13:52:32 +0100111 'CPPDEFINES': ['V8_ENABLE_CHECKS', 'OBJECT_PRINT']
Steve Blocka7e24c12009-10-30 11:49:00 +0000112 },
Steve Block6ded16b2010-05-10 14:33:55 +0100113 'vmstate:on': {
114 'CPPDEFINES': ['ENABLE_VMSTATE_TRACKING'],
115 },
Ben Murdochb0fe1622011-05-05 13:52:32 +0100116 'objectprint:on': {
117 'CPPDEFINES': ['OBJECT_PRINT'],
118 },
Steve Block6ded16b2010-05-10 14:33:55 +0100119 'protectheap:on': {
120 'CPPDEFINES': ['ENABLE_VMSTATE_TRACKING', 'ENABLE_HEAP_PROTECTION'],
121 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000122 'profilingsupport:on': {
Steve Block6ded16b2010-05-10 14:33:55 +0100123 'CPPDEFINES': ['ENABLE_VMSTATE_TRACKING', 'ENABLE_LOGGING_AND_PROFILING'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000124 },
125 'debuggersupport:on': {
126 'CPPDEFINES': ['ENABLE_DEBUGGER_SUPPORT'],
127 }
128 },
129 'gcc': {
130 'all': {
131 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
132 'CXXFLAGS': ['$CCFLAGS', '-fno-rtti', '-fno-exceptions'],
133 },
134 'visibility:hidden': {
135 # Use visibility=default to disable this.
136 'CXXFLAGS': ['-fvisibility=hidden']
137 },
138 'mode:debug': {
139 'CCFLAGS': ['-g', '-O0'],
140 'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'],
141 'os:android': {
142 'CCFLAGS': ['-mthumb']
143 }
144 },
145 'mode:release': {
146 'CCFLAGS': ['-O3', '-fomit-frame-pointer', '-fdata-sections',
147 '-ffunction-sections'],
148 'os:android': {
149 'CCFLAGS': ['-mthumb', '-Os'],
150 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
151 }
152 },
153 'os:linux': {
154 'CCFLAGS': ['-ansi'] + GCC_EXTRA_CCFLAGS,
155 'library:shared': {
156 'CPPDEFINES': ['V8_SHARED'],
157 'LIBS': ['pthread']
158 }
159 },
160 'os:macos': {
161 'CCFLAGS': ['-ansi', '-mmacosx-version-min=10.4'],
Leon Clarkee46be812010-01-19 14:06:41 +0000162 'library:shared': {
163 'CPPDEFINES': ['V8_SHARED']
164 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000165 },
166 'os:freebsd': {
167 'CPPPATH' : ['/usr/local/include'],
168 'LIBPATH' : ['/usr/local/lib'],
169 'CCFLAGS': ['-ansi'],
170 },
Steve Blockd0582a62009-12-15 09:54:21 +0000171 'os:openbsd': {
172 'CPPPATH' : ['/usr/local/include'],
173 'LIBPATH' : ['/usr/local/lib'],
174 'CCFLAGS': ['-ansi'],
175 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000176 'os:solaris': {
Kristian Monsen25f61362010-05-21 11:50:48 +0100177 # On Solaris, to get isinf, INFINITY, fpclassify and other macros one
178 # needs to define __C99FEATURES__.
179 'CPPDEFINES': ['__C99FEATURES__'],
Leon Clarked91b9f72010-01-27 17:25:45 +0000180 'CPPPATH' : ['/usr/local/include'],
181 'LIBPATH' : ['/usr/local/lib'],
182 'CCFLAGS': ['-ansi'],
183 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000184 'os:win32': {
185 'CCFLAGS': ['-DWIN32'],
186 'CXXFLAGS': ['-DWIN32'],
187 },
188 'os:android': {
189 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
190 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
191 'CCFLAGS': ANDROID_FLAGS,
192 'WARNINGFLAGS': ['-Wall', '-Wno-unused', '-Werror=return-type',
193 '-Wstrict-aliasing=2'],
194 'CPPPATH': ANDROID_INCLUDES,
195 },
196 'arch:ia32': {
197 'CPPDEFINES': ['V8_TARGET_ARCH_IA32'],
198 'CCFLAGS': ['-m32'],
199 'LINKFLAGS': ['-m32']
200 },
201 'arch:arm': {
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100202 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
203 'unalignedaccesses:on' : {
204 'CPPDEFINES' : ['CAN_USE_UNALIGNED_ACCESSES=1']
205 },
206 'unalignedaccesses:off' : {
207 'CPPDEFINES' : ['CAN_USE_UNALIGNED_ACCESSES=0']
208 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000209 },
210 'simulator:arm': {
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100211 'CCFLAGS': ['-m32'],
Ben Murdochf87a2032010-10-22 12:50:53 +0100212 'LINKFLAGS': ['-m32'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000213 },
Andrei Popescu31002712010-02-23 13:46:05 +0000214 'arch:mips': {
215 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
216 'simulator:none': {
217 'CCFLAGS': ['-EL', '-mips32r2', '-Wa,-mips32r2', '-fno-inline'],
218 'LDFLAGS': ['-EL']
219 }
220 },
221 'simulator:mips': {
222 'CCFLAGS': ['-m32'],
Ben Murdochf87a2032010-10-22 12:50:53 +0100223 'LINKFLAGS': ['-m32'],
Andrei Popescu31002712010-02-23 13:46:05 +0000224 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000225 'arch:x64': {
226 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
227 'CCFLAGS': ['-m64'],
228 'LINKFLAGS': ['-m64'],
229 },
230 'prof:oprofile': {
231 'CPPDEFINES': ['ENABLE_OPROFILE_AGENT']
232 }
233 },
234 'msvc': {
235 'all': {
236 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
237 'CXXFLAGS': ['$CCFLAGS', '/GR-', '/Gy'],
238 'CPPDEFINES': ['WIN32'],
239 'LINKFLAGS': ['/INCREMENTAL:NO', '/NXCOMPAT', '/IGNORE:4221'],
240 'CCPDBFLAGS': ['/Zi']
241 },
242 'verbose:off': {
243 'DIALECTFLAGS': ['/nologo'],
244 'ARFLAGS': ['/NOLOGO']
245 },
246 'arch:ia32': {
247 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', '_USE_32BIT_TIME_T'],
248 'LINKFLAGS': ['/MACHINE:X86'],
249 'ARFLAGS': ['/MACHINE:X86']
250 },
251 'arch:x64': {
252 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
253 'LINKFLAGS': ['/MACHINE:X64'],
254 'ARFLAGS': ['/MACHINE:X64']
255 },
256 'mode:debug': {
257 'CCFLAGS': ['/Od', '/Gm'],
258 'CPPDEFINES': ['_DEBUG', 'ENABLE_DISASSEMBLER', 'DEBUG'],
259 'LINKFLAGS': ['/DEBUG'],
260 'msvcrt:static': {
261 'CCFLAGS': ['/MTd']
262 },
263 'msvcrt:shared': {
264 'CCFLAGS': ['/MDd']
265 }
266 },
267 'mode:release': {
268 'CCFLAGS': ['/O2'],
269 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
270 'msvcrt:static': {
271 'CCFLAGS': ['/MT']
272 },
273 'msvcrt:shared': {
274 'CCFLAGS': ['/MD']
275 },
276 'msvcltcg:on': {
277 'CCFLAGS': ['/GL'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000278 'ARFLAGS': ['/LTCG'],
Steve Block6ded16b2010-05-10 14:33:55 +0100279 'pgo:off': {
280 'LINKFLAGS': ['/LTCG'],
281 },
282 'pgo:instrument': {
283 'LINKFLAGS': ['/LTCG:PGI']
284 },
285 'pgo:optimize': {
286 'LINKFLAGS': ['/LTCG:PGO']
287 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000288 }
289 }
290 }
291}
292
293
294V8_EXTRA_FLAGS = {
295 'gcc': {
296 'all': {
297 'WARNINGFLAGS': ['-Wall',
298 '-Werror',
299 '-W',
300 '-Wno-unused-parameter',
301 '-Wnon-virtual-dtor']
302 },
303 'os:win32': {
304 'WARNINGFLAGS': ['-pedantic', '-Wno-long-long']
305 },
306 'os:linux': {
307 'WARNINGFLAGS': ['-pedantic'],
308 'library:shared': {
309 'soname:on': {
310 'LINKFLAGS': ['-Wl,-soname,${SONAME}']
311 }
312 }
313 },
314 'os:macos': {
315 'WARNINGFLAGS': ['-pedantic']
316 },
317 'disassembler:on': {
318 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
319 }
320 },
321 'msvc': {
322 'all': {
Leon Clarked91b9f72010-01-27 17:25:45 +0000323 'WARNINGFLAGS': ['/W3', '/WX', '/wd4355', '/wd4800']
Steve Blocka7e24c12009-10-30 11:49:00 +0000324 },
325 'library:shared': {
326 'CPPDEFINES': ['BUILDING_V8_SHARED'],
327 'LIBS': ['winmm', 'ws2_32']
328 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000329 'arch:arm': {
330 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
331 # /wd4996 is to silence the warning about sscanf
332 # used by the arm simulator.
333 'WARNINGFLAGS': ['/wd4996']
334 },
Andrei Popescu31002712010-02-23 13:46:05 +0000335 'arch:mips': {
336 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
337 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000338 'disassembler:on': {
339 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
340 }
341 }
342}
343
344
345MKSNAPSHOT_EXTRA_FLAGS = {
346 'gcc': {
347 'os:linux': {
348 'LIBS': ['pthread'],
349 },
350 'os:macos': {
351 'LIBS': ['pthread'],
352 },
353 'os:freebsd': {
354 'LIBS': ['execinfo', 'pthread']
355 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000356 'os:solaris': {
357 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
358 'LINKFLAGS': ['-mt']
359 },
Steve Blockd0582a62009-12-15 09:54:21 +0000360 'os:openbsd': {
361 'LIBS': ['execinfo', 'pthread']
362 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000363 'os:win32': {
364 'LIBS': ['winmm', 'ws2_32'],
365 },
366 },
367 'msvc': {
368 'all': {
369 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
370 'LIBS': ['winmm', 'ws2_32']
371 }
372 }
373}
374
375
376DTOA_EXTRA_FLAGS = {
377 'gcc': {
378 'all': {
379 'WARNINGFLAGS': ['-Werror', '-Wno-uninitialized'],
380 'CCFLAGS': GCC_DTOA_EXTRA_CCFLAGS
381 }
382 },
383 'msvc': {
384 'all': {
385 'WARNINGFLAGS': ['/WX', '/wd4018', '/wd4244']
386 }
387 }
388}
389
390
391CCTEST_EXTRA_FLAGS = {
392 'all': {
393 'CPPPATH': [join(root_dir, 'src')],
Steve Blocka7e24c12009-10-30 11:49:00 +0000394 },
395 'gcc': {
396 'all': {
397 'LIBPATH': [abspath('.')]
398 },
399 'os:linux': {
400 'LIBS': ['pthread'],
401 },
402 'os:macos': {
403 'LIBS': ['pthread'],
404 },
405 'os:freebsd': {
406 'LIBS': ['execinfo', 'pthread']
407 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000408 'os:solaris': {
409 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
410 'LINKFLAGS': ['-mt']
411 },
Steve Blockd0582a62009-12-15 09:54:21 +0000412 'os:openbsd': {
413 'LIBS': ['execinfo', 'pthread']
414 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000415 'os:win32': {
416 'LIBS': ['winmm', 'ws2_32']
417 },
418 'os:android': {
419 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
420 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
421 'CCFLAGS': ANDROID_FLAGS,
422 'CPPPATH': ANDROID_INCLUDES,
Steve Block6ded16b2010-05-10 14:33:55 +0100423 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib',
424 ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000425 'LINKFLAGS': ANDROID_LINKFLAGS,
Steve Block6ded16b2010-05-10 14:33:55 +0100426 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000427 'mode:release': {
428 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
429 }
430 },
Steve Block6ded16b2010-05-10 14:33:55 +0100431 'arch:arm': {
432 'LINKFLAGS': ARM_LINK_FLAGS
433 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000434 },
435 'msvc': {
436 'all': {
437 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
438 'LIBS': ['winmm', 'ws2_32']
439 },
440 'library:shared': {
441 'CPPDEFINES': ['USING_V8_SHARED']
442 },
443 'arch:ia32': {
444 'CPPDEFINES': ['V8_TARGET_ARCH_IA32']
445 },
446 'arch:x64': {
Steve Block3ce2e202009-11-05 08:53:23 +0000447 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
448 'LINKFLAGS': ['/STACK:2091752']
Steve Blocka7e24c12009-10-30 11:49:00 +0000449 },
450 }
451}
452
453
454SAMPLE_FLAGS = {
455 'all': {
456 'CPPPATH': [join(abspath('.'), 'include')],
Steve Blocka7e24c12009-10-30 11:49:00 +0000457 },
458 'gcc': {
459 'all': {
460 'LIBPATH': ['.'],
461 'CCFLAGS': ['-fno-rtti', '-fno-exceptions']
462 },
463 'os:linux': {
464 'LIBS': ['pthread'],
465 },
466 'os:macos': {
467 'LIBS': ['pthread'],
468 },
469 'os:freebsd': {
470 'LIBPATH' : ['/usr/local/lib'],
Steve Blockd0582a62009-12-15 09:54:21 +0000471 'LIBS': ['execinfo', 'pthread']
472 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000473 'os:solaris': {
474 'LIBPATH' : ['/usr/local/lib'],
475 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
476 'LINKFLAGS': ['-mt']
477 },
Steve Blockd0582a62009-12-15 09:54:21 +0000478 'os:openbsd': {
479 'LIBPATH' : ['/usr/local/lib'],
480 'LIBS': ['execinfo', 'pthread']
Steve Blocka7e24c12009-10-30 11:49:00 +0000481 },
482 'os:win32': {
483 'LIBS': ['winmm', 'ws2_32']
484 },
485 'os:android': {
486 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
487 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
488 'CCFLAGS': ANDROID_FLAGS,
489 'CPPPATH': ANDROID_INCLUDES,
Steve Block6ded16b2010-05-10 14:33:55 +0100490 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib',
491 ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000492 'LINKFLAGS': ANDROID_LINKFLAGS,
Steve Block6ded16b2010-05-10 14:33:55 +0100493 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000494 'mode:release': {
495 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
496 }
497 },
Steve Block6ded16b2010-05-10 14:33:55 +0100498 'arch:arm': {
499 'LINKFLAGS': ARM_LINK_FLAGS
500 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000501 'arch:ia32': {
502 'CCFLAGS': ['-m32'],
503 'LINKFLAGS': ['-m32']
504 },
505 'arch:x64': {
506 'CCFLAGS': ['-m64'],
507 'LINKFLAGS': ['-m64']
508 },
Andrei Popescu31002712010-02-23 13:46:05 +0000509 'arch:mips': {
510 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
511 'simulator:none': {
512 'CCFLAGS': ['-EL', '-mips32r2', '-Wa,-mips32r2', '-fno-inline'],
513 'LINKFLAGS': ['-EL'],
514 'LDFLAGS': ['-EL']
515 }
516 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000517 'simulator:arm': {
518 'CCFLAGS': ['-m32'],
519 'LINKFLAGS': ['-m32']
520 },
Andrei Popescu31002712010-02-23 13:46:05 +0000521 'simulator:mips': {
522 'CCFLAGS': ['-m32'],
523 'LINKFLAGS': ['-m32']
524 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000525 'mode:release': {
526 'CCFLAGS': ['-O2']
527 },
528 'mode:debug': {
Ben Murdochb0fe1622011-05-05 13:52:32 +0100529 'CCFLAGS': ['-g', '-O0'],
530 'CPPDEFINES': ['DEBUG']
Steve Blocka7e24c12009-10-30 11:49:00 +0000531 },
532 'prof:oprofile': {
533 'LIBPATH': ['/usr/lib32', '/usr/lib32/oprofile'],
534 'LIBS': ['opagent']
535 }
536 },
537 'msvc': {
538 'all': {
539 'LIBS': ['winmm', 'ws2_32']
540 },
541 'verbose:off': {
542 'CCFLAGS': ['/nologo'],
543 'LINKFLAGS': ['/NOLOGO']
544 },
545 'verbose:on': {
546 'LINKFLAGS': ['/VERBOSE']
547 },
548 'library:shared': {
549 'CPPDEFINES': ['USING_V8_SHARED']
550 },
551 'prof:on': {
552 'LINKFLAGS': ['/MAP']
553 },
554 'mode:release': {
555 'CCFLAGS': ['/O2'],
556 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
557 'msvcrt:static': {
558 'CCFLAGS': ['/MT']
559 },
560 'msvcrt:shared': {
561 'CCFLAGS': ['/MD']
562 },
563 'msvcltcg:on': {
564 'CCFLAGS': ['/GL'],
Steve Block6ded16b2010-05-10 14:33:55 +0100565 'pgo:off': {
566 'LINKFLAGS': ['/LTCG'],
567 },
568 },
569 'pgo:instrument': {
570 'LINKFLAGS': ['/LTCG:PGI']
571 },
572 'pgo:optimize': {
573 'LINKFLAGS': ['/LTCG:PGO']
Steve Blocka7e24c12009-10-30 11:49:00 +0000574 }
575 },
576 'arch:ia32': {
577 'CPPDEFINES': ['V8_TARGET_ARCH_IA32'],
578 'LINKFLAGS': ['/MACHINE:X86']
579 },
580 'arch:x64': {
581 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
Steve Block3ce2e202009-11-05 08:53:23 +0000582 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2091752']
Steve Blocka7e24c12009-10-30 11:49:00 +0000583 },
584 'mode:debug': {
Ben Murdochb0fe1622011-05-05 13:52:32 +0100585 'CCFLAGS': ['/Od'],
586 'LINKFLAGS': ['/DEBUG'],
587 'CPPDEFINES': ['DEBUG'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000588 'msvcrt:static': {
Ben Murdochb0fe1622011-05-05 13:52:32 +0100589 'CCFLAGS': ['/MTd']
Steve Blocka7e24c12009-10-30 11:49:00 +0000590 },
591 'msvcrt:shared': {
Ben Murdochb0fe1622011-05-05 13:52:32 +0100592 'CCFLAGS': ['/MDd']
Steve Blocka7e24c12009-10-30 11:49:00 +0000593 }
594 }
595 }
596}
597
598
599D8_FLAGS = {
600 'gcc': {
601 'console:readline': {
602 'LIBS': ['readline']
603 },
604 'os:linux': {
605 'LIBS': ['pthread'],
606 },
607 'os:macos': {
608 'LIBS': ['pthread'],
609 },
610 'os:freebsd': {
611 'LIBS': ['pthread'],
612 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000613 'os:solaris': {
614 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
615 'LINKFLAGS': ['-mt']
616 },
Steve Blockd0582a62009-12-15 09:54:21 +0000617 'os:openbsd': {
618 'LIBS': ['pthread'],
619 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000620 'os:android': {
Steve Block6ded16b2010-05-10 14:33:55 +0100621 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib',
622 ANDROID_TOP + '/prebuilt/linux-x86/toolchain/arm-eabi-4.4.0/lib/gcc/arm-eabi/4.4.0/interwork'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000623 'LINKFLAGS': ANDROID_LINKFLAGS,
Steve Block6ded16b2010-05-10 14:33:55 +0100624 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000625 },
626 'os:win32': {
627 'LIBS': ['winmm', 'ws2_32'],
628 },
Kristian Monsen50ef84f2010-07-29 15:18:00 +0100629 'arch:arm': {
630 'LINKFLAGS': ARM_LINK_FLAGS
631 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000632 },
633 'msvc': {
634 'all': {
635 'LIBS': ['winmm', 'ws2_32']
636 }
637 }
638}
639
640
641SUFFIXES = {
642 'release': '',
643 'debug': '_g'
644}
645
646
647def Abort(message):
648 print message
649 sys.exit(1)
650
651
652def GuessToolchain(os):
653 tools = Environment()['TOOLS']
654 if 'gcc' in tools:
655 return 'gcc'
656 elif 'msvc' in tools:
657 return 'msvc'
658 else:
659 return None
660
661
Ben Murdochb0fe1622011-05-05 13:52:32 +0100662def GuessVisibility(os, toolchain):
663 if os == 'win32' and toolchain == 'gcc':
664 # MinGW can't do it.
665 return 'default'
666 else:
667 return 'hidden'
668
669
Steve Blocka7e24c12009-10-30 11:49:00 +0000670OS_GUESS = utils.GuessOS()
671TOOLCHAIN_GUESS = GuessToolchain(OS_GUESS)
672ARCH_GUESS = utils.GuessArchitecture()
Ben Murdochb0fe1622011-05-05 13:52:32 +0100673VISIBILITY_GUESS = GuessVisibility(OS_GUESS, TOOLCHAIN_GUESS)
Steve Blocka7e24c12009-10-30 11:49:00 +0000674
675
676SIMPLE_OPTIONS = {
677 'toolchain': {
678 'values': ['gcc', 'msvc'],
679 'default': TOOLCHAIN_GUESS,
Ben Murdochf87a2032010-10-22 12:50:53 +0100680 'help': 'the toolchain to use (%s)' % TOOLCHAIN_GUESS
Steve Blocka7e24c12009-10-30 11:49:00 +0000681 },
682 'os': {
Leon Clarked91b9f72010-01-27 17:25:45 +0000683 'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'solaris'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000684 'default': OS_GUESS,
Ben Murdochf87a2032010-10-22 12:50:53 +0100685 'help': 'the os to build for (%s)' % OS_GUESS
Steve Blocka7e24c12009-10-30 11:49:00 +0000686 },
687 'arch': {
Andrei Popescu31002712010-02-23 13:46:05 +0000688 'values':['arm', 'ia32', 'x64', 'mips'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000689 'default': ARCH_GUESS,
Ben Murdochf87a2032010-10-22 12:50:53 +0100690 'help': 'the architecture to build for (%s)' % ARCH_GUESS
Steve Blocka7e24c12009-10-30 11:49:00 +0000691 },
692 'regexp': {
693 'values': ['native', 'interpreted'],
694 'default': 'native',
695 'help': 'Whether to use native or interpreted regexp implementation'
696 },
697 'snapshot': {
698 'values': ['on', 'off', 'nobuild'],
699 'default': 'off',
700 'help': 'build using snapshots for faster start-up'
701 },
702 'prof': {
703 'values': ['on', 'off', 'oprofile'],
704 'default': 'off',
705 'help': 'enable profiling of build target'
706 },
707 'library': {
708 'values': ['static', 'shared'],
709 'default': 'static',
710 'help': 'the type of library to produce'
711 },
Steve Block6ded16b2010-05-10 14:33:55 +0100712 'vmstate': {
713 'values': ['on', 'off'],
714 'default': 'off',
715 'help': 'enable VM state tracking'
716 },
Ben Murdochb0fe1622011-05-05 13:52:32 +0100717 'objectprint': {
718 'values': ['on', 'off'],
719 'default': 'off',
720 'help': 'enable object printing'
721 },
Steve Block6ded16b2010-05-10 14:33:55 +0100722 'protectheap': {
723 'values': ['on', 'off'],
724 'default': 'off',
725 'help': 'enable heap protection'
726 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000727 'profilingsupport': {
728 'values': ['on', 'off'],
729 'default': 'on',
730 'help': 'enable profiling of JavaScript code'
731 },
732 'debuggersupport': {
733 'values': ['on', 'off'],
734 'default': 'on',
735 'help': 'enable debugging of JavaScript code'
736 },
737 'soname': {
738 'values': ['on', 'off'],
739 'default': 'off',
740 'help': 'turn on setting soname for Linux shared library'
741 },
742 'msvcrt': {
743 'values': ['static', 'shared'],
744 'default': 'static',
745 'help': 'the type of Microsoft Visual C++ runtime library to use'
746 },
747 'msvcltcg': {
748 'values': ['on', 'off'],
749 'default': 'on',
750 'help': 'use Microsoft Visual C++ link-time code generation'
751 },
752 'simulator': {
Andrei Popescu31002712010-02-23 13:46:05 +0000753 'values': ['arm', 'mips', 'none'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000754 'default': 'none',
755 'help': 'build with simulator'
756 },
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100757 'unalignedaccesses': {
758 'values': ['default', 'on', 'off'],
759 'default': 'default',
760 'help': 'set whether the ARM target supports unaligned accesses'
761 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000762 'disassembler': {
763 'values': ['on', 'off'],
764 'default': 'off',
765 'help': 'enable the disassembler to inspect generated code'
766 },
767 'sourcesignatures': {
768 'values': ['MD5', 'timestamp'],
769 'default': 'MD5',
770 'help': 'set how the build system detects file changes'
771 },
772 'console': {
773 'values': ['dumb', 'readline'],
774 'default': 'dumb',
775 'help': 'the console to use for the d8 shell'
776 },
777 'verbose': {
778 'values': ['on', 'off'],
779 'default': 'off',
780 'help': 'more output from compiler and linker'
781 },
782 'visibility': {
783 'values': ['default', 'hidden'],
Ben Murdochb0fe1622011-05-05 13:52:32 +0100784 'default': VISIBILITY_GUESS,
785 'help': 'shared library symbol visibility (%s)' % VISIBILITY_GUESS
Leon Clarkee46be812010-01-19 14:06:41 +0000786 },
Steve Block6ded16b2010-05-10 14:33:55 +0100787 'pgo': {
788 'values': ['off', 'instrument', 'optimize'],
789 'default': 'off',
790 'help': 'select profile guided optimization variant',
Steve Blocka7e24c12009-10-30 11:49:00 +0000791 }
792}
793
794
795def GetOptions():
796 result = Options()
797 result.Add('mode', 'compilation mode (debug, release)', 'release')
Leon Clarkee46be812010-01-19 14:06:41 +0000798 result.Add('sample', 'build sample (shell, process, lineprocessor)', '')
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100799 result.Add('cache', 'directory to use for scons build cache', '')
Steve Blocka7e24c12009-10-30 11:49:00 +0000800 result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '')
801 result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '')
802 for (name, option) in SIMPLE_OPTIONS.iteritems():
803 help = '%s (%s)' % (name, ", ".join(option['values']))
804 result.Add(name, help, option.get('default'))
805 return result
806
807
808def GetVersionComponents():
809 MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)")
810 MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)")
811 BUILD_NUMBER_PATTERN = re.compile(r"#define\s+BUILD_NUMBER\s+(.*)")
812 PATCH_LEVEL_PATTERN = re.compile(r"#define\s+PATCH_LEVEL\s+(.*)")
813
814 patterns = [MAJOR_VERSION_PATTERN,
815 MINOR_VERSION_PATTERN,
816 BUILD_NUMBER_PATTERN,
817 PATCH_LEVEL_PATTERN]
818
819 source = open(join(root_dir, 'src', 'version.cc')).read()
820 version_components = []
821 for pattern in patterns:
822 match = pattern.search(source)
823 if match:
824 version_components.append(match.group(1).strip())
825 else:
826 version_components.append('0')
827
828 return version_components
829
830
831def GetVersion():
832 version_components = GetVersionComponents()
833
834 if version_components[len(version_components) - 1] == '0':
835 version_components.pop()
836 return '.'.join(version_components)
837
838
839def GetSpecificSONAME():
840 SONAME_PATTERN = re.compile(r"#define\s+SONAME\s+\"(.*)\"")
841
842 source = open(join(root_dir, 'src', 'version.cc')).read()
843 match = SONAME_PATTERN.search(source)
844
845 if match:
846 return match.group(1).strip()
847 else:
848 return ''
849
850
851def SplitList(str):
852 return [ s for s in str.split(",") if len(s) > 0 ]
853
854
855def IsLegal(env, option, values):
856 str = env[option]
857 for s in SplitList(str):
858 if not s in values:
859 Abort("Illegal value for option %s '%s'." % (option, s))
860 return False
861 return True
862
863
864def VerifyOptions(env):
865 if not IsLegal(env, 'mode', ['debug', 'release']):
866 return False
Leon Clarkee46be812010-01-19 14:06:41 +0000867 if not IsLegal(env, 'sample', ["shell", "process", "lineprocessor"]):
Steve Blocka7e24c12009-10-30 11:49:00 +0000868 return False
869 if not IsLegal(env, 'regexp', ["native", "interpreted"]):
870 return False
871 if env['os'] == 'win32' and env['library'] == 'shared' and env['prof'] == 'on':
872 Abort("Profiling on windows only supported for static library.")
873 if env['prof'] == 'oprofile' and env['os'] != 'linux':
874 Abort("OProfile is only supported on Linux.")
875 if env['os'] == 'win32' and env['soname'] == 'on':
876 Abort("Shared Object soname not applicable for Windows.")
877 if env['soname'] == 'on' and env['library'] == 'static':
878 Abort("Shared Object soname not applicable for static library.")
Steve Block6ded16b2010-05-10 14:33:55 +0100879 if env['os'] != 'win32' and env['pgo'] != 'off':
880 Abort("Profile guided optimization only supported on Windows.")
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100881 if env['cache'] and not os.path.isdir(env['cache']):
882 Abort("The specified cache directory does not exist.")
883 if not (env['arch'] == 'arm' or env['simulator'] == 'arm') and ('unalignedaccesses' in ARGUMENTS):
884 print env['arch']
885 print env['simulator']
886 Abort("Option unalignedaccesses only supported for the ARM architecture.")
Steve Blocka7e24c12009-10-30 11:49:00 +0000887 for (name, option) in SIMPLE_OPTIONS.iteritems():
888 if (not option.get('default')) and (name not in ARGUMENTS):
889 message = ("A value for option %s must be specified (%s)." %
890 (name, ", ".join(option['values'])))
891 Abort(message)
892 if not env[name] in option['values']:
893 message = ("Unknown %s value '%s'. Possible values are (%s)." %
894 (name, env[name], ", ".join(option['values'])))
895 Abort(message)
896
897
898class BuildContext(object):
899
900 def __init__(self, options, env_overrides, samples):
901 self.library_targets = []
902 self.mksnapshot_targets = []
903 self.cctest_targets = []
904 self.sample_targets = []
905 self.d8_targets = []
906 self.options = options
907 self.env_overrides = env_overrides
908 self.samples = samples
909 self.use_snapshot = (options['snapshot'] != 'off')
910 self.build_snapshot = (options['snapshot'] == 'on')
911 self.flags = None
912
913 def AddRelevantFlags(self, initial, flags):
914 result = initial.copy()
915 toolchain = self.options['toolchain']
916 if toolchain in flags:
917 self.AppendFlags(result, flags[toolchain].get('all'))
918 for option in sorted(self.options.keys()):
919 value = self.options[option]
920 self.AppendFlags(result, flags[toolchain].get(option + ':' + value))
921 self.AppendFlags(result, flags.get('all'))
922 return result
923
924 def AddRelevantSubFlags(self, options, flags):
925 self.AppendFlags(options, flags.get('all'))
926 for option in sorted(self.options.keys()):
927 value = self.options[option]
928 self.AppendFlags(options, flags.get(option + ':' + value))
929
930 def GetRelevantSources(self, source):
931 result = []
932 result += source.get('all', [])
933 for (name, value) in self.options.iteritems():
934 source_value = source.get(name + ':' + value, [])
935 if type(source_value) == dict:
936 result += self.GetRelevantSources(source_value)
937 else:
938 result += source_value
939 return sorted(result)
940
941 def AppendFlags(self, options, added):
942 if not added:
943 return
944 for (key, value) in added.iteritems():
945 if key.find(':') != -1:
946 self.AddRelevantSubFlags(options, { key: value })
947 else:
948 if not key in options:
949 options[key] = value
950 else:
951 prefix = options[key]
952 if isinstance(prefix, StringTypes): prefix = prefix.split()
953 options[key] = prefix + value
954
955 def ConfigureObject(self, env, input, **kw):
956 if (kw.has_key('CPPPATH') and env.has_key('CPPPATH')):
957 kw['CPPPATH'] += env['CPPPATH']
958 if self.options['library'] == 'static':
959 return env.StaticObject(input, **kw)
960 else:
961 return env.SharedObject(input, **kw)
962
963 def ApplyEnvOverrides(self, env):
964 if not self.env_overrides:
965 return
966 if type(env['ENV']) == DictType:
967 env['ENV'].update(**self.env_overrides)
968 else:
969 env['ENV'] = self.env_overrides
970
971
Steve Block6ded16b2010-05-10 14:33:55 +0100972def PostprocessOptions(options, os):
Steve Blocka7e24c12009-10-30 11:49:00 +0000973 # Adjust architecture if the simulator option has been set
974 if (options['simulator'] != 'none') and (options['arch'] != options['simulator']):
975 if 'arch' in ARGUMENTS:
976 # Print a warning if arch has explicitly been set
977 print "Warning: forcing architecture to match simulator (%s)" % options['simulator']
978 options['arch'] = options['simulator']
979 if (options['prof'] != 'off') and (options['profilingsupport'] == 'off'):
980 # Print a warning if profiling is enabled without profiling support
981 print "Warning: forcing profilingsupport on when prof is on"
982 options['profilingsupport'] = 'on'
Steve Block6ded16b2010-05-10 14:33:55 +0100983 if os == 'win32' and options['pgo'] != 'off' and options['msvcltcg'] == 'off':
984 if 'msvcltcg' in ARGUMENTS:
985 print "Warning: forcing msvcltcg on as it is required for pgo (%s)" % options['pgo']
986 options['msvcltcg'] = 'on'
Andrei Popescu31002712010-02-23 13:46:05 +0000987 if options['arch'] == 'mips':
988 if ('regexp' in ARGUMENTS) and options['regexp'] == 'native':
989 # Print a warning if native regexp is specified for mips
990 print "Warning: forcing regexp to interpreted for mips"
991 options['regexp'] = 'interpreted'
Steve Blocka7e24c12009-10-30 11:49:00 +0000992
993
994def ParseEnvOverrides(arg, imports):
995 # The environment overrides are in the format NAME0:value0,NAME1:value1,...
996 # The environment imports are in the format NAME0,NAME1,...
997 overrides = {}
998 for var in imports.split(','):
999 if var in os.environ:
1000 overrides[var] = os.environ[var]
1001 for override in arg.split(','):
1002 pos = override.find(':')
1003 if pos == -1:
1004 continue
1005 overrides[override[:pos].strip()] = override[pos+1:].strip()
1006 return overrides
1007
1008
1009def BuildSpecific(env, mode, env_overrides):
1010 options = {'mode': mode}
1011 for option in SIMPLE_OPTIONS:
1012 options[option] = env[option]
Steve Block6ded16b2010-05-10 14:33:55 +01001013 PostprocessOptions(options, env['os'])
Steve Blocka7e24c12009-10-30 11:49:00 +00001014
1015 context = BuildContext(options, env_overrides, samples=SplitList(env['sample']))
1016
1017 # Remove variables which can't be imported from the user's external
1018 # environment into a construction environment.
1019 user_environ = os.environ.copy()
1020 try:
1021 del user_environ['ENV']
1022 except KeyError:
1023 pass
1024
1025 library_flags = context.AddRelevantFlags(user_environ, LIBRARY_FLAGS)
1026 v8_flags = context.AddRelevantFlags(library_flags, V8_EXTRA_FLAGS)
1027 mksnapshot_flags = context.AddRelevantFlags(library_flags, MKSNAPSHOT_EXTRA_FLAGS)
1028 dtoa_flags = context.AddRelevantFlags(library_flags, DTOA_EXTRA_FLAGS)
1029 cctest_flags = context.AddRelevantFlags(v8_flags, CCTEST_EXTRA_FLAGS)
1030 sample_flags = context.AddRelevantFlags(user_environ, SAMPLE_FLAGS)
1031 d8_flags = context.AddRelevantFlags(library_flags, D8_FLAGS)
1032
1033 context.flags = {
1034 'v8': v8_flags,
1035 'mksnapshot': mksnapshot_flags,
1036 'dtoa': dtoa_flags,
1037 'cctest': cctest_flags,
1038 'sample': sample_flags,
1039 'd8': d8_flags
1040 }
1041
1042 # Generate library base name.
1043 target_id = mode
1044 suffix = SUFFIXES[target_id]
1045 library_name = 'v8' + suffix
1046 version = GetVersion()
1047 if context.options['soname'] == 'on':
1048 # When building shared object with SONAME version the library name.
1049 library_name += '-' + version
Steve Blocka7e24c12009-10-30 11:49:00 +00001050
1051 # Generate library SONAME if required by the build.
1052 if context.options['soname'] == 'on':
1053 soname = GetSpecificSONAME()
1054 if soname == '':
1055 soname = 'lib' + library_name + '.so'
1056 env['SONAME'] = soname
1057
1058 # Build the object files by invoking SCons recursively.
1059 (object_files, shell_files, mksnapshot) = env.SConscript(
1060 join('src', 'SConscript'),
1061 build_dir=join('obj', target_id),
1062 exports='context',
1063 duplicate=False
1064 )
1065
1066 context.mksnapshot_targets.append(mksnapshot)
1067
1068 # Link the object files into a library.
1069 env.Replace(**context.flags['v8'])
Leon Clarked91b9f72010-01-27 17:25:45 +00001070
Steve Blocka7e24c12009-10-30 11:49:00 +00001071 context.ApplyEnvOverrides(env)
1072 if context.options['library'] == 'static':
1073 library = env.StaticLibrary(library_name, object_files)
1074 else:
1075 # There seems to be a glitch in the way scons decides where to put
1076 # PDB files when compiling using MSVC so we specify it manually.
1077 # This should not affect any other platforms.
1078 pdb_name = library_name + '.dll.pdb'
1079 library = env.SharedLibrary(library_name, object_files, PDB=pdb_name)
1080 context.library_targets.append(library)
1081
1082 d8_env = Environment()
1083 d8_env.Replace(**context.flags['d8'])
Leon Clarkee46be812010-01-19 14:06:41 +00001084 context.ApplyEnvOverrides(d8_env)
Steve Blocka7e24c12009-10-30 11:49:00 +00001085 shell = d8_env.Program('d8' + suffix, object_files + shell_files)
1086 context.d8_targets.append(shell)
1087
1088 for sample in context.samples:
Steve Block6ded16b2010-05-10 14:33:55 +01001089 sample_env = Environment()
Steve Blocka7e24c12009-10-30 11:49:00 +00001090 sample_env.Replace(**context.flags['sample'])
Steve Block6ded16b2010-05-10 14:33:55 +01001091 sample_env.Prepend(LIBS=[library_name])
Steve Blocka7e24c12009-10-30 11:49:00 +00001092 context.ApplyEnvOverrides(sample_env)
1093 sample_object = sample_env.SConscript(
1094 join('samples', 'SConscript'),
1095 build_dir=join('obj', 'sample', sample, target_id),
1096 exports='sample context',
1097 duplicate=False
1098 )
1099 sample_name = sample + suffix
1100 sample_program = sample_env.Program(sample_name, sample_object)
1101 sample_env.Depends(sample_program, library)
1102 context.sample_targets.append(sample_program)
1103
Steve Block6ded16b2010-05-10 14:33:55 +01001104 cctest_env = env.Copy()
1105 cctest_env.Prepend(LIBS=[library_name])
1106 cctest_program = cctest_env.SConscript(
Steve Blocka7e24c12009-10-30 11:49:00 +00001107 join('test', 'cctest', 'SConscript'),
1108 build_dir=join('obj', 'test', target_id),
1109 exports='context object_files',
1110 duplicate=False
1111 )
1112 context.cctest_targets.append(cctest_program)
1113
1114 return context
1115
1116
1117def Build():
1118 opts = GetOptions()
1119 env = Environment(options=opts)
1120 Help(opts.GenerateHelpText(env))
1121 VerifyOptions(env)
1122 env_overrides = ParseEnvOverrides(env['env'], env['importenv'])
1123
1124 SourceSignatures(env['sourcesignatures'])
1125
1126 libraries = []
1127 mksnapshots = []
1128 cctests = []
1129 samples = []
1130 d8s = []
1131 modes = SplitList(env['mode'])
1132 for mode in modes:
1133 context = BuildSpecific(env.Copy(), mode, env_overrides)
1134 libraries += context.library_targets
1135 mksnapshots += context.mksnapshot_targets
1136 cctests += context.cctest_targets
1137 samples += context.sample_targets
1138 d8s += context.d8_targets
1139
1140 env.Alias('library', libraries)
1141 env.Alias('mksnapshot', mksnapshots)
1142 env.Alias('cctests', cctests)
1143 env.Alias('sample', samples)
1144 env.Alias('d8', d8s)
1145
1146 if env['sample']:
1147 env.Default('sample')
1148 else:
1149 env.Default('library')
1150
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +01001151 if env['cache']:
1152 CacheDir(env['cache'])
Steve Blocka7e24c12009-10-30 11:49:00 +00001153
1154# We disable deprecation warnings because we need to be able to use
1155# env.Copy without getting warnings for compatibility with older
1156# version of scons. Also, there's a bug in some revisions that
1157# doesn't allow this flag to be set, so we swallow any exceptions.
1158# Lovely.
1159try:
1160 SetOption('warn', 'no-deprecated')
1161except:
1162 pass
1163
1164
1165Build()