blob: e84db844d56819c528a84ee1ce24e985344f89e3 [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'],
Ben Murdochb8e0da22011-05-16 14:20:40 +0100127 },
128 'inspector:on': {
129 'CPPDEFINES': ['INSPECTOR'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000130 }
131 },
132 'gcc': {
133 'all': {
134 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
135 'CXXFLAGS': ['$CCFLAGS', '-fno-rtti', '-fno-exceptions'],
136 },
137 'visibility:hidden': {
138 # Use visibility=default to disable this.
139 'CXXFLAGS': ['-fvisibility=hidden']
140 },
141 'mode:debug': {
142 'CCFLAGS': ['-g', '-O0'],
143 'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'],
144 'os:android': {
145 'CCFLAGS': ['-mthumb']
146 }
147 },
148 'mode:release': {
149 'CCFLAGS': ['-O3', '-fomit-frame-pointer', '-fdata-sections',
150 '-ffunction-sections'],
151 'os:android': {
152 'CCFLAGS': ['-mthumb', '-Os'],
153 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
154 }
155 },
156 'os:linux': {
157 'CCFLAGS': ['-ansi'] + GCC_EXTRA_CCFLAGS,
158 'library:shared': {
159 'CPPDEFINES': ['V8_SHARED'],
160 'LIBS': ['pthread']
161 }
162 },
163 'os:macos': {
164 'CCFLAGS': ['-ansi', '-mmacosx-version-min=10.4'],
Leon Clarkee46be812010-01-19 14:06:41 +0000165 'library:shared': {
166 'CPPDEFINES': ['V8_SHARED']
167 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000168 },
169 'os:freebsd': {
170 'CPPPATH' : ['/usr/local/include'],
171 'LIBPATH' : ['/usr/local/lib'],
172 'CCFLAGS': ['-ansi'],
173 },
Steve Blockd0582a62009-12-15 09:54:21 +0000174 'os:openbsd': {
175 'CPPPATH' : ['/usr/local/include'],
176 'LIBPATH' : ['/usr/local/lib'],
177 'CCFLAGS': ['-ansi'],
178 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000179 'os:solaris': {
Kristian Monsen25f61362010-05-21 11:50:48 +0100180 # On Solaris, to get isinf, INFINITY, fpclassify and other macros one
181 # needs to define __C99FEATURES__.
182 'CPPDEFINES': ['__C99FEATURES__'],
Leon Clarked91b9f72010-01-27 17:25:45 +0000183 'CPPPATH' : ['/usr/local/include'],
184 'LIBPATH' : ['/usr/local/lib'],
185 'CCFLAGS': ['-ansi'],
186 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000187 'os:win32': {
188 'CCFLAGS': ['-DWIN32'],
189 'CXXFLAGS': ['-DWIN32'],
190 },
191 'os:android': {
192 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
193 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
194 'CCFLAGS': ANDROID_FLAGS,
195 'WARNINGFLAGS': ['-Wall', '-Wno-unused', '-Werror=return-type',
196 '-Wstrict-aliasing=2'],
197 'CPPPATH': ANDROID_INCLUDES,
198 },
199 'arch:ia32': {
200 'CPPDEFINES': ['V8_TARGET_ARCH_IA32'],
201 'CCFLAGS': ['-m32'],
202 'LINKFLAGS': ['-m32']
203 },
204 'arch:arm': {
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100205 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
206 'unalignedaccesses:on' : {
207 'CPPDEFINES' : ['CAN_USE_UNALIGNED_ACCESSES=1']
208 },
209 'unalignedaccesses:off' : {
210 'CPPDEFINES' : ['CAN_USE_UNALIGNED_ACCESSES=0']
211 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000212 },
213 'simulator:arm': {
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100214 'CCFLAGS': ['-m32'],
Ben Murdochf87a2032010-10-22 12:50:53 +0100215 'LINKFLAGS': ['-m32'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000216 },
Andrei Popescu31002712010-02-23 13:46:05 +0000217 'arch:mips': {
218 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
219 'simulator:none': {
220 'CCFLAGS': ['-EL', '-mips32r2', '-Wa,-mips32r2', '-fno-inline'],
221 'LDFLAGS': ['-EL']
222 }
223 },
224 'simulator:mips': {
225 'CCFLAGS': ['-m32'],
Ben Murdochf87a2032010-10-22 12:50:53 +0100226 'LINKFLAGS': ['-m32'],
Andrei Popescu31002712010-02-23 13:46:05 +0000227 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000228 'arch:x64': {
229 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
230 'CCFLAGS': ['-m64'],
231 'LINKFLAGS': ['-m64'],
232 },
233 'prof:oprofile': {
234 'CPPDEFINES': ['ENABLE_OPROFILE_AGENT']
Ben Murdochb8e0da22011-05-16 14:20:40 +0100235 },
236 'gdbjit:on': {
237 'CPPDEFINES': ['ENABLE_GDB_JIT_INTERFACE']
Steve Blocka7e24c12009-10-30 11:49:00 +0000238 }
239 },
240 'msvc': {
241 'all': {
242 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
243 'CXXFLAGS': ['$CCFLAGS', '/GR-', '/Gy'],
244 'CPPDEFINES': ['WIN32'],
245 'LINKFLAGS': ['/INCREMENTAL:NO', '/NXCOMPAT', '/IGNORE:4221'],
246 'CCPDBFLAGS': ['/Zi']
247 },
248 'verbose:off': {
249 'DIALECTFLAGS': ['/nologo'],
250 'ARFLAGS': ['/NOLOGO']
251 },
252 'arch:ia32': {
253 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', '_USE_32BIT_TIME_T'],
254 'LINKFLAGS': ['/MACHINE:X86'],
255 'ARFLAGS': ['/MACHINE:X86']
256 },
257 'arch:x64': {
258 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
259 'LINKFLAGS': ['/MACHINE:X64'],
260 'ARFLAGS': ['/MACHINE:X64']
261 },
262 'mode:debug': {
263 'CCFLAGS': ['/Od', '/Gm'],
264 'CPPDEFINES': ['_DEBUG', 'ENABLE_DISASSEMBLER', 'DEBUG'],
265 'LINKFLAGS': ['/DEBUG'],
266 'msvcrt:static': {
267 'CCFLAGS': ['/MTd']
268 },
269 'msvcrt:shared': {
270 'CCFLAGS': ['/MDd']
271 }
272 },
273 'mode:release': {
274 'CCFLAGS': ['/O2'],
275 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
276 'msvcrt:static': {
277 'CCFLAGS': ['/MT']
278 },
279 'msvcrt:shared': {
280 'CCFLAGS': ['/MD']
281 },
282 'msvcltcg:on': {
283 'CCFLAGS': ['/GL'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000284 'ARFLAGS': ['/LTCG'],
Steve Block6ded16b2010-05-10 14:33:55 +0100285 'pgo:off': {
286 'LINKFLAGS': ['/LTCG'],
287 },
288 'pgo:instrument': {
289 'LINKFLAGS': ['/LTCG:PGI']
290 },
291 'pgo:optimize': {
292 'LINKFLAGS': ['/LTCG:PGO']
293 }
Steve Blocka7e24c12009-10-30 11:49:00 +0000294 }
295 }
296 }
297}
298
299
300V8_EXTRA_FLAGS = {
301 'gcc': {
302 'all': {
303 'WARNINGFLAGS': ['-Wall',
304 '-Werror',
305 '-W',
306 '-Wno-unused-parameter',
307 '-Wnon-virtual-dtor']
308 },
309 'os:win32': {
310 'WARNINGFLAGS': ['-pedantic', '-Wno-long-long']
311 },
312 'os:linux': {
313 'WARNINGFLAGS': ['-pedantic'],
314 'library:shared': {
315 'soname:on': {
316 'LINKFLAGS': ['-Wl,-soname,${SONAME}']
317 }
318 }
319 },
320 'os:macos': {
321 'WARNINGFLAGS': ['-pedantic']
322 },
323 'disassembler:on': {
324 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
325 }
326 },
327 'msvc': {
328 'all': {
Leon Clarked91b9f72010-01-27 17:25:45 +0000329 'WARNINGFLAGS': ['/W3', '/WX', '/wd4355', '/wd4800']
Steve Blocka7e24c12009-10-30 11:49:00 +0000330 },
331 'library:shared': {
332 'CPPDEFINES': ['BUILDING_V8_SHARED'],
333 'LIBS': ['winmm', 'ws2_32']
334 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000335 'arch:arm': {
336 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
337 # /wd4996 is to silence the warning about sscanf
338 # used by the arm simulator.
339 'WARNINGFLAGS': ['/wd4996']
340 },
Andrei Popescu31002712010-02-23 13:46:05 +0000341 'arch:mips': {
342 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
343 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000344 'disassembler:on': {
345 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
346 }
347 }
348}
349
350
351MKSNAPSHOT_EXTRA_FLAGS = {
352 'gcc': {
353 'os:linux': {
354 'LIBS': ['pthread'],
355 },
356 'os:macos': {
357 'LIBS': ['pthread'],
358 },
359 'os:freebsd': {
360 'LIBS': ['execinfo', 'pthread']
361 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000362 'os:solaris': {
363 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
364 'LINKFLAGS': ['-mt']
365 },
Steve Blockd0582a62009-12-15 09:54:21 +0000366 'os:openbsd': {
367 'LIBS': ['execinfo', 'pthread']
368 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000369 'os:win32': {
370 'LIBS': ['winmm', 'ws2_32'],
371 },
372 },
373 'msvc': {
374 'all': {
375 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
376 'LIBS': ['winmm', 'ws2_32']
377 }
378 }
379}
380
381
382DTOA_EXTRA_FLAGS = {
383 'gcc': {
384 'all': {
385 'WARNINGFLAGS': ['-Werror', '-Wno-uninitialized'],
386 'CCFLAGS': GCC_DTOA_EXTRA_CCFLAGS
387 }
388 },
389 'msvc': {
390 'all': {
391 'WARNINGFLAGS': ['/WX', '/wd4018', '/wd4244']
392 }
393 }
394}
395
396
397CCTEST_EXTRA_FLAGS = {
398 'all': {
399 'CPPPATH': [join(root_dir, 'src')],
Steve Blocka7e24c12009-10-30 11:49:00 +0000400 },
401 'gcc': {
402 'all': {
403 'LIBPATH': [abspath('.')]
404 },
405 'os:linux': {
406 'LIBS': ['pthread'],
407 },
408 'os:macos': {
409 'LIBS': ['pthread'],
410 },
411 'os:freebsd': {
412 'LIBS': ['execinfo', 'pthread']
413 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000414 'os:solaris': {
415 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
416 'LINKFLAGS': ['-mt']
417 },
Steve Blockd0582a62009-12-15 09:54:21 +0000418 'os:openbsd': {
419 'LIBS': ['execinfo', 'pthread']
420 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000421 'os:win32': {
422 'LIBS': ['winmm', 'ws2_32']
423 },
424 'os:android': {
425 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
426 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
427 'CCFLAGS': ANDROID_FLAGS,
428 'CPPPATH': ANDROID_INCLUDES,
Steve Block6ded16b2010-05-10 14:33:55 +0100429 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib',
430 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 +0000431 'LINKFLAGS': ANDROID_LINKFLAGS,
Steve Block6ded16b2010-05-10 14:33:55 +0100432 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000433 'mode:release': {
434 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
435 }
436 },
Steve Block6ded16b2010-05-10 14:33:55 +0100437 'arch:arm': {
438 'LINKFLAGS': ARM_LINK_FLAGS
439 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000440 },
441 'msvc': {
442 'all': {
443 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
444 'LIBS': ['winmm', 'ws2_32']
445 },
446 'library:shared': {
447 'CPPDEFINES': ['USING_V8_SHARED']
448 },
449 'arch:ia32': {
450 'CPPDEFINES': ['V8_TARGET_ARCH_IA32']
451 },
452 'arch:x64': {
Steve Block3ce2e202009-11-05 08:53:23 +0000453 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
454 'LINKFLAGS': ['/STACK:2091752']
Steve Blocka7e24c12009-10-30 11:49:00 +0000455 },
456 }
457}
458
459
460SAMPLE_FLAGS = {
461 'all': {
462 'CPPPATH': [join(abspath('.'), 'include')],
Steve Blocka7e24c12009-10-30 11:49:00 +0000463 },
464 'gcc': {
465 'all': {
466 'LIBPATH': ['.'],
467 'CCFLAGS': ['-fno-rtti', '-fno-exceptions']
468 },
469 'os:linux': {
470 'LIBS': ['pthread'],
471 },
472 'os:macos': {
473 'LIBS': ['pthread'],
474 },
475 'os:freebsd': {
476 'LIBPATH' : ['/usr/local/lib'],
Steve Blockd0582a62009-12-15 09:54:21 +0000477 'LIBS': ['execinfo', 'pthread']
478 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000479 'os:solaris': {
480 'LIBPATH' : ['/usr/local/lib'],
481 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
482 'LINKFLAGS': ['-mt']
483 },
Steve Blockd0582a62009-12-15 09:54:21 +0000484 'os:openbsd': {
485 'LIBPATH' : ['/usr/local/lib'],
486 'LIBS': ['execinfo', 'pthread']
Steve Blocka7e24c12009-10-30 11:49:00 +0000487 },
488 'os:win32': {
489 'LIBS': ['winmm', 'ws2_32']
490 },
491 'os:android': {
492 'CPPDEFINES': ['ANDROID', '__ARM_ARCH_5__', '__ARM_ARCH_5T__',
493 '__ARM_ARCH_5E__', '__ARM_ARCH_5TE__'],
494 'CCFLAGS': ANDROID_FLAGS,
495 'CPPPATH': ANDROID_INCLUDES,
Steve Block6ded16b2010-05-10 14:33:55 +0100496 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib',
497 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 +0000498 'LINKFLAGS': ANDROID_LINKFLAGS,
Steve Block6ded16b2010-05-10 14:33:55 +0100499 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000500 'mode:release': {
501 'CPPDEFINES': ['SK_RELEASE', 'NDEBUG']
502 }
503 },
Steve Block6ded16b2010-05-10 14:33:55 +0100504 'arch:arm': {
505 'LINKFLAGS': ARM_LINK_FLAGS
506 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000507 'arch:ia32': {
508 'CCFLAGS': ['-m32'],
509 'LINKFLAGS': ['-m32']
510 },
511 'arch:x64': {
512 'CCFLAGS': ['-m64'],
513 'LINKFLAGS': ['-m64']
514 },
Andrei Popescu31002712010-02-23 13:46:05 +0000515 'arch:mips': {
516 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
517 'simulator:none': {
518 'CCFLAGS': ['-EL', '-mips32r2', '-Wa,-mips32r2', '-fno-inline'],
519 'LINKFLAGS': ['-EL'],
520 'LDFLAGS': ['-EL']
521 }
522 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000523 'simulator:arm': {
524 'CCFLAGS': ['-m32'],
525 'LINKFLAGS': ['-m32']
526 },
Andrei Popescu31002712010-02-23 13:46:05 +0000527 'simulator:mips': {
528 'CCFLAGS': ['-m32'],
529 'LINKFLAGS': ['-m32']
530 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000531 'mode:release': {
532 'CCFLAGS': ['-O2']
533 },
534 'mode:debug': {
Ben Murdochb0fe1622011-05-05 13:52:32 +0100535 'CCFLAGS': ['-g', '-O0'],
536 'CPPDEFINES': ['DEBUG']
Steve Blocka7e24c12009-10-30 11:49:00 +0000537 },
538 'prof:oprofile': {
539 'LIBPATH': ['/usr/lib32', '/usr/lib32/oprofile'],
540 'LIBS': ['opagent']
541 }
542 },
543 'msvc': {
544 'all': {
545 'LIBS': ['winmm', 'ws2_32']
546 },
547 'verbose:off': {
548 'CCFLAGS': ['/nologo'],
549 'LINKFLAGS': ['/NOLOGO']
550 },
551 'verbose:on': {
552 'LINKFLAGS': ['/VERBOSE']
553 },
554 'library:shared': {
555 'CPPDEFINES': ['USING_V8_SHARED']
556 },
557 'prof:on': {
558 'LINKFLAGS': ['/MAP']
559 },
560 'mode:release': {
561 'CCFLAGS': ['/O2'],
562 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
563 'msvcrt:static': {
564 'CCFLAGS': ['/MT']
565 },
566 'msvcrt:shared': {
567 'CCFLAGS': ['/MD']
568 },
569 'msvcltcg:on': {
570 'CCFLAGS': ['/GL'],
Steve Block6ded16b2010-05-10 14:33:55 +0100571 'pgo:off': {
572 'LINKFLAGS': ['/LTCG'],
573 },
574 },
575 'pgo:instrument': {
576 'LINKFLAGS': ['/LTCG:PGI']
577 },
578 'pgo:optimize': {
579 'LINKFLAGS': ['/LTCG:PGO']
Steve Blocka7e24c12009-10-30 11:49:00 +0000580 }
581 },
582 'arch:ia32': {
583 'CPPDEFINES': ['V8_TARGET_ARCH_IA32'],
584 'LINKFLAGS': ['/MACHINE:X86']
585 },
586 'arch:x64': {
587 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
Steve Block3ce2e202009-11-05 08:53:23 +0000588 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2091752']
Steve Blocka7e24c12009-10-30 11:49:00 +0000589 },
590 'mode:debug': {
Ben Murdochb0fe1622011-05-05 13:52:32 +0100591 'CCFLAGS': ['/Od'],
592 'LINKFLAGS': ['/DEBUG'],
593 'CPPDEFINES': ['DEBUG'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000594 'msvcrt:static': {
Ben Murdochb0fe1622011-05-05 13:52:32 +0100595 'CCFLAGS': ['/MTd']
Steve Blocka7e24c12009-10-30 11:49:00 +0000596 },
597 'msvcrt:shared': {
Ben Murdochb0fe1622011-05-05 13:52:32 +0100598 'CCFLAGS': ['/MDd']
Steve Blocka7e24c12009-10-30 11:49:00 +0000599 }
600 }
601 }
602}
603
604
605D8_FLAGS = {
606 'gcc': {
607 'console:readline': {
608 'LIBS': ['readline']
609 },
610 'os:linux': {
611 'LIBS': ['pthread'],
612 },
613 'os:macos': {
614 'LIBS': ['pthread'],
615 },
616 'os:freebsd': {
617 'LIBS': ['pthread'],
618 },
Leon Clarked91b9f72010-01-27 17:25:45 +0000619 'os:solaris': {
620 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
621 'LINKFLAGS': ['-mt']
622 },
Steve Blockd0582a62009-12-15 09:54:21 +0000623 'os:openbsd': {
624 'LIBS': ['pthread'],
625 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000626 'os:android': {
Steve Block6ded16b2010-05-10 14:33:55 +0100627 'LIBPATH': [ANDROID_TOP + '/out/target/product/generic/obj/lib',
628 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 +0000629 'LINKFLAGS': ANDROID_LINKFLAGS,
Steve Block6ded16b2010-05-10 14:33:55 +0100630 'LIBS': ['log', 'c', 'stdc++', 'm', 'gcc'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000631 },
632 'os:win32': {
633 'LIBS': ['winmm', 'ws2_32'],
634 },
Kristian Monsen50ef84f2010-07-29 15:18:00 +0100635 'arch:arm': {
636 'LINKFLAGS': ARM_LINK_FLAGS
637 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000638 },
639 'msvc': {
640 'all': {
641 'LIBS': ['winmm', 'ws2_32']
642 }
643 }
644}
645
646
647SUFFIXES = {
648 'release': '',
649 'debug': '_g'
650}
651
652
653def Abort(message):
654 print message
655 sys.exit(1)
656
657
658def GuessToolchain(os):
659 tools = Environment()['TOOLS']
660 if 'gcc' in tools:
661 return 'gcc'
662 elif 'msvc' in tools:
663 return 'msvc'
664 else:
665 return None
666
667
Ben Murdochb0fe1622011-05-05 13:52:32 +0100668def GuessVisibility(os, toolchain):
669 if os == 'win32' and toolchain == 'gcc':
670 # MinGW can't do it.
671 return 'default'
Ben Murdochb8e0da22011-05-16 14:20:40 +0100672 elif os == 'solaris':
673 return 'default'
Ben Murdochb0fe1622011-05-05 13:52:32 +0100674 else:
675 return 'hidden'
676
677
Steve Blocka7e24c12009-10-30 11:49:00 +0000678OS_GUESS = utils.GuessOS()
679TOOLCHAIN_GUESS = GuessToolchain(OS_GUESS)
680ARCH_GUESS = utils.GuessArchitecture()
Ben Murdochb0fe1622011-05-05 13:52:32 +0100681VISIBILITY_GUESS = GuessVisibility(OS_GUESS, TOOLCHAIN_GUESS)
Steve Blocka7e24c12009-10-30 11:49:00 +0000682
683
684SIMPLE_OPTIONS = {
685 'toolchain': {
686 'values': ['gcc', 'msvc'],
687 'default': TOOLCHAIN_GUESS,
Ben Murdochf87a2032010-10-22 12:50:53 +0100688 'help': 'the toolchain to use (%s)' % TOOLCHAIN_GUESS
Steve Blocka7e24c12009-10-30 11:49:00 +0000689 },
690 'os': {
Leon Clarked91b9f72010-01-27 17:25:45 +0000691 'values': ['freebsd', 'linux', 'macos', 'win32', 'android', 'openbsd', 'solaris'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000692 'default': OS_GUESS,
Ben Murdochf87a2032010-10-22 12:50:53 +0100693 'help': 'the os to build for (%s)' % OS_GUESS
Steve Blocka7e24c12009-10-30 11:49:00 +0000694 },
695 'arch': {
Andrei Popescu31002712010-02-23 13:46:05 +0000696 'values':['arm', 'ia32', 'x64', 'mips'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000697 'default': ARCH_GUESS,
Ben Murdochf87a2032010-10-22 12:50:53 +0100698 'help': 'the architecture to build for (%s)' % ARCH_GUESS
Steve Blocka7e24c12009-10-30 11:49:00 +0000699 },
700 'regexp': {
701 'values': ['native', 'interpreted'],
702 'default': 'native',
703 'help': 'Whether to use native or interpreted regexp implementation'
704 },
705 'snapshot': {
706 'values': ['on', 'off', 'nobuild'],
707 'default': 'off',
708 'help': 'build using snapshots for faster start-up'
709 },
710 'prof': {
711 'values': ['on', 'off', 'oprofile'],
712 'default': 'off',
713 'help': 'enable profiling of build target'
714 },
Ben Murdochb8e0da22011-05-16 14:20:40 +0100715 'gdbjit': {
716 'values': ['on', 'off'],
717 'default': 'off',
718 'help': 'enable GDB JIT interface'
719 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000720 'library': {
721 'values': ['static', 'shared'],
722 'default': 'static',
723 'help': 'the type of library to produce'
724 },
Steve Block6ded16b2010-05-10 14:33:55 +0100725 'vmstate': {
726 'values': ['on', 'off'],
727 'default': 'off',
728 'help': 'enable VM state tracking'
729 },
Ben Murdochb0fe1622011-05-05 13:52:32 +0100730 'objectprint': {
731 'values': ['on', 'off'],
732 'default': 'off',
733 'help': 'enable object printing'
734 },
Steve Block6ded16b2010-05-10 14:33:55 +0100735 'protectheap': {
736 'values': ['on', 'off'],
737 'default': 'off',
738 'help': 'enable heap protection'
739 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000740 'profilingsupport': {
741 'values': ['on', 'off'],
742 'default': 'on',
743 'help': 'enable profiling of JavaScript code'
744 },
745 'debuggersupport': {
746 'values': ['on', 'off'],
747 'default': 'on',
748 'help': 'enable debugging of JavaScript code'
749 },
Ben Murdochb8e0da22011-05-16 14:20:40 +0100750 'inspector': {
751 'values': ['on', 'off'],
752 'default': 'off',
753 'help': 'enable inspector features'
754 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000755 'soname': {
756 'values': ['on', 'off'],
757 'default': 'off',
758 'help': 'turn on setting soname for Linux shared library'
759 },
760 'msvcrt': {
761 'values': ['static', 'shared'],
762 'default': 'static',
763 'help': 'the type of Microsoft Visual C++ runtime library to use'
764 },
765 'msvcltcg': {
766 'values': ['on', 'off'],
767 'default': 'on',
768 'help': 'use Microsoft Visual C++ link-time code generation'
769 },
770 'simulator': {
Andrei Popescu31002712010-02-23 13:46:05 +0000771 'values': ['arm', 'mips', 'none'],
Steve Blocka7e24c12009-10-30 11:49:00 +0000772 'default': 'none',
773 'help': 'build with simulator'
774 },
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100775 'unalignedaccesses': {
776 'values': ['default', 'on', 'off'],
777 'default': 'default',
778 'help': 'set whether the ARM target supports unaligned accesses'
779 },
Steve Blocka7e24c12009-10-30 11:49:00 +0000780 'disassembler': {
781 'values': ['on', 'off'],
782 'default': 'off',
783 'help': 'enable the disassembler to inspect generated code'
784 },
785 'sourcesignatures': {
786 'values': ['MD5', 'timestamp'],
787 'default': 'MD5',
788 'help': 'set how the build system detects file changes'
789 },
790 'console': {
791 'values': ['dumb', 'readline'],
792 'default': 'dumb',
793 'help': 'the console to use for the d8 shell'
794 },
795 'verbose': {
796 'values': ['on', 'off'],
797 'default': 'off',
798 'help': 'more output from compiler and linker'
799 },
800 'visibility': {
801 'values': ['default', 'hidden'],
Ben Murdochb0fe1622011-05-05 13:52:32 +0100802 'default': VISIBILITY_GUESS,
803 'help': 'shared library symbol visibility (%s)' % VISIBILITY_GUESS
Leon Clarkee46be812010-01-19 14:06:41 +0000804 },
Steve Block6ded16b2010-05-10 14:33:55 +0100805 'pgo': {
806 'values': ['off', 'instrument', 'optimize'],
807 'default': 'off',
808 'help': 'select profile guided optimization variant',
Steve Blocka7e24c12009-10-30 11:49:00 +0000809 }
810}
811
812
813def GetOptions():
814 result = Options()
815 result.Add('mode', 'compilation mode (debug, release)', 'release')
Leon Clarkee46be812010-01-19 14:06:41 +0000816 result.Add('sample', 'build sample (shell, process, lineprocessor)', '')
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100817 result.Add('cache', 'directory to use for scons build cache', '')
Steve Blocka7e24c12009-10-30 11:49:00 +0000818 result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,...)', '')
819 result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '')
820 for (name, option) in SIMPLE_OPTIONS.iteritems():
821 help = '%s (%s)' % (name, ", ".join(option['values']))
822 result.Add(name, help, option.get('default'))
823 return result
824
825
826def GetVersionComponents():
827 MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)")
828 MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)")
829 BUILD_NUMBER_PATTERN = re.compile(r"#define\s+BUILD_NUMBER\s+(.*)")
830 PATCH_LEVEL_PATTERN = re.compile(r"#define\s+PATCH_LEVEL\s+(.*)")
831
832 patterns = [MAJOR_VERSION_PATTERN,
833 MINOR_VERSION_PATTERN,
834 BUILD_NUMBER_PATTERN,
835 PATCH_LEVEL_PATTERN]
836
837 source = open(join(root_dir, 'src', 'version.cc')).read()
838 version_components = []
839 for pattern in patterns:
840 match = pattern.search(source)
841 if match:
842 version_components.append(match.group(1).strip())
843 else:
844 version_components.append('0')
845
846 return version_components
847
848
849def GetVersion():
850 version_components = GetVersionComponents()
851
852 if version_components[len(version_components) - 1] == '0':
853 version_components.pop()
854 return '.'.join(version_components)
855
856
857def GetSpecificSONAME():
858 SONAME_PATTERN = re.compile(r"#define\s+SONAME\s+\"(.*)\"")
859
860 source = open(join(root_dir, 'src', 'version.cc')).read()
861 match = SONAME_PATTERN.search(source)
862
863 if match:
864 return match.group(1).strip()
865 else:
866 return ''
867
868
869def SplitList(str):
870 return [ s for s in str.split(",") if len(s) > 0 ]
871
872
873def IsLegal(env, option, values):
874 str = env[option]
875 for s in SplitList(str):
876 if not s in values:
877 Abort("Illegal value for option %s '%s'." % (option, s))
878 return False
879 return True
880
881
882def VerifyOptions(env):
883 if not IsLegal(env, 'mode', ['debug', 'release']):
884 return False
Leon Clarkee46be812010-01-19 14:06:41 +0000885 if not IsLegal(env, 'sample', ["shell", "process", "lineprocessor"]):
Steve Blocka7e24c12009-10-30 11:49:00 +0000886 return False
887 if not IsLegal(env, 'regexp', ["native", "interpreted"]):
888 return False
889 if env['os'] == 'win32' and env['library'] == 'shared' and env['prof'] == 'on':
890 Abort("Profiling on windows only supported for static library.")
Ben Murdochb8e0da22011-05-16 14:20:40 +0100891 if env['gdbjit'] == 'on' and (env['os'] != 'linux' or (env['arch'] != 'ia32' and env['arch'] != 'x64')):
892 Abort("GDBJIT interface is supported only for Intel-compatible (ia32 or x64) Linux target.")
Steve Blocka7e24c12009-10-30 11:49:00 +0000893 if env['prof'] == 'oprofile' and env['os'] != 'linux':
894 Abort("OProfile is only supported on Linux.")
895 if env['os'] == 'win32' and env['soname'] == 'on':
896 Abort("Shared Object soname not applicable for Windows.")
897 if env['soname'] == 'on' and env['library'] == 'static':
898 Abort("Shared Object soname not applicable for static library.")
Steve Block6ded16b2010-05-10 14:33:55 +0100899 if env['os'] != 'win32' and env['pgo'] != 'off':
900 Abort("Profile guided optimization only supported on Windows.")
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +0100901 if env['cache'] and not os.path.isdir(env['cache']):
902 Abort("The specified cache directory does not exist.")
903 if not (env['arch'] == 'arm' or env['simulator'] == 'arm') and ('unalignedaccesses' in ARGUMENTS):
904 print env['arch']
905 print env['simulator']
906 Abort("Option unalignedaccesses only supported for the ARM architecture.")
Steve Blocka7e24c12009-10-30 11:49:00 +0000907 for (name, option) in SIMPLE_OPTIONS.iteritems():
908 if (not option.get('default')) and (name not in ARGUMENTS):
909 message = ("A value for option %s must be specified (%s)." %
910 (name, ", ".join(option['values'])))
911 Abort(message)
912 if not env[name] in option['values']:
913 message = ("Unknown %s value '%s'. Possible values are (%s)." %
914 (name, env[name], ", ".join(option['values'])))
915 Abort(message)
916
917
918class BuildContext(object):
919
920 def __init__(self, options, env_overrides, samples):
921 self.library_targets = []
922 self.mksnapshot_targets = []
923 self.cctest_targets = []
924 self.sample_targets = []
925 self.d8_targets = []
926 self.options = options
927 self.env_overrides = env_overrides
928 self.samples = samples
929 self.use_snapshot = (options['snapshot'] != 'off')
930 self.build_snapshot = (options['snapshot'] == 'on')
931 self.flags = None
932
933 def AddRelevantFlags(self, initial, flags):
934 result = initial.copy()
935 toolchain = self.options['toolchain']
936 if toolchain in flags:
937 self.AppendFlags(result, flags[toolchain].get('all'))
938 for option in sorted(self.options.keys()):
939 value = self.options[option]
940 self.AppendFlags(result, flags[toolchain].get(option + ':' + value))
941 self.AppendFlags(result, flags.get('all'))
942 return result
943
944 def AddRelevantSubFlags(self, options, flags):
945 self.AppendFlags(options, flags.get('all'))
946 for option in sorted(self.options.keys()):
947 value = self.options[option]
948 self.AppendFlags(options, flags.get(option + ':' + value))
949
950 def GetRelevantSources(self, source):
951 result = []
952 result += source.get('all', [])
953 for (name, value) in self.options.iteritems():
954 source_value = source.get(name + ':' + value, [])
955 if type(source_value) == dict:
956 result += self.GetRelevantSources(source_value)
957 else:
958 result += source_value
959 return sorted(result)
960
961 def AppendFlags(self, options, added):
962 if not added:
963 return
964 for (key, value) in added.iteritems():
965 if key.find(':') != -1:
966 self.AddRelevantSubFlags(options, { key: value })
967 else:
968 if not key in options:
969 options[key] = value
970 else:
971 prefix = options[key]
972 if isinstance(prefix, StringTypes): prefix = prefix.split()
973 options[key] = prefix + value
974
975 def ConfigureObject(self, env, input, **kw):
976 if (kw.has_key('CPPPATH') and env.has_key('CPPPATH')):
977 kw['CPPPATH'] += env['CPPPATH']
978 if self.options['library'] == 'static':
979 return env.StaticObject(input, **kw)
980 else:
981 return env.SharedObject(input, **kw)
982
983 def ApplyEnvOverrides(self, env):
984 if not self.env_overrides:
985 return
986 if type(env['ENV']) == DictType:
987 env['ENV'].update(**self.env_overrides)
988 else:
989 env['ENV'] = self.env_overrides
990
991
Steve Block6ded16b2010-05-10 14:33:55 +0100992def PostprocessOptions(options, os):
Steve Blocka7e24c12009-10-30 11:49:00 +0000993 # Adjust architecture if the simulator option has been set
994 if (options['simulator'] != 'none') and (options['arch'] != options['simulator']):
995 if 'arch' in ARGUMENTS:
996 # Print a warning if arch has explicitly been set
997 print "Warning: forcing architecture to match simulator (%s)" % options['simulator']
998 options['arch'] = options['simulator']
999 if (options['prof'] != 'off') and (options['profilingsupport'] == 'off'):
1000 # Print a warning if profiling is enabled without profiling support
1001 print "Warning: forcing profilingsupport on when prof is on"
1002 options['profilingsupport'] = 'on'
Steve Block6ded16b2010-05-10 14:33:55 +01001003 if os == 'win32' and options['pgo'] != 'off' and options['msvcltcg'] == 'off':
1004 if 'msvcltcg' in ARGUMENTS:
1005 print "Warning: forcing msvcltcg on as it is required for pgo (%s)" % options['pgo']
1006 options['msvcltcg'] = 'on'
Andrei Popescu31002712010-02-23 13:46:05 +00001007 if options['arch'] == 'mips':
1008 if ('regexp' in ARGUMENTS) and options['regexp'] == 'native':
1009 # Print a warning if native regexp is specified for mips
1010 print "Warning: forcing regexp to interpreted for mips"
1011 options['regexp'] = 'interpreted'
Steve Blocka7e24c12009-10-30 11:49:00 +00001012
1013
1014def ParseEnvOverrides(arg, imports):
1015 # The environment overrides are in the format NAME0:value0,NAME1:value1,...
1016 # The environment imports are in the format NAME0,NAME1,...
1017 overrides = {}
1018 for var in imports.split(','):
1019 if var in os.environ:
1020 overrides[var] = os.environ[var]
1021 for override in arg.split(','):
1022 pos = override.find(':')
1023 if pos == -1:
1024 continue
1025 overrides[override[:pos].strip()] = override[pos+1:].strip()
1026 return overrides
1027
1028
1029def BuildSpecific(env, mode, env_overrides):
1030 options = {'mode': mode}
1031 for option in SIMPLE_OPTIONS:
1032 options[option] = env[option]
Steve Block6ded16b2010-05-10 14:33:55 +01001033 PostprocessOptions(options, env['os'])
Steve Blocka7e24c12009-10-30 11:49:00 +00001034
1035 context = BuildContext(options, env_overrides, samples=SplitList(env['sample']))
1036
1037 # Remove variables which can't be imported from the user's external
1038 # environment into a construction environment.
1039 user_environ = os.environ.copy()
1040 try:
1041 del user_environ['ENV']
1042 except KeyError:
1043 pass
1044
1045 library_flags = context.AddRelevantFlags(user_environ, LIBRARY_FLAGS)
1046 v8_flags = context.AddRelevantFlags(library_flags, V8_EXTRA_FLAGS)
1047 mksnapshot_flags = context.AddRelevantFlags(library_flags, MKSNAPSHOT_EXTRA_FLAGS)
1048 dtoa_flags = context.AddRelevantFlags(library_flags, DTOA_EXTRA_FLAGS)
1049 cctest_flags = context.AddRelevantFlags(v8_flags, CCTEST_EXTRA_FLAGS)
1050 sample_flags = context.AddRelevantFlags(user_environ, SAMPLE_FLAGS)
1051 d8_flags = context.AddRelevantFlags(library_flags, D8_FLAGS)
1052
1053 context.flags = {
1054 'v8': v8_flags,
1055 'mksnapshot': mksnapshot_flags,
1056 'dtoa': dtoa_flags,
1057 'cctest': cctest_flags,
1058 'sample': sample_flags,
1059 'd8': d8_flags
1060 }
1061
1062 # Generate library base name.
1063 target_id = mode
1064 suffix = SUFFIXES[target_id]
1065 library_name = 'v8' + suffix
1066 version = GetVersion()
1067 if context.options['soname'] == 'on':
1068 # When building shared object with SONAME version the library name.
1069 library_name += '-' + version
Steve Blocka7e24c12009-10-30 11:49:00 +00001070
1071 # Generate library SONAME if required by the build.
1072 if context.options['soname'] == 'on':
1073 soname = GetSpecificSONAME()
1074 if soname == '':
1075 soname = 'lib' + library_name + '.so'
1076 env['SONAME'] = soname
1077
1078 # Build the object files by invoking SCons recursively.
1079 (object_files, shell_files, mksnapshot) = env.SConscript(
1080 join('src', 'SConscript'),
1081 build_dir=join('obj', target_id),
1082 exports='context',
1083 duplicate=False
1084 )
1085
1086 context.mksnapshot_targets.append(mksnapshot)
1087
1088 # Link the object files into a library.
1089 env.Replace(**context.flags['v8'])
Leon Clarked91b9f72010-01-27 17:25:45 +00001090
Steve Blocka7e24c12009-10-30 11:49:00 +00001091 context.ApplyEnvOverrides(env)
1092 if context.options['library'] == 'static':
1093 library = env.StaticLibrary(library_name, object_files)
1094 else:
1095 # There seems to be a glitch in the way scons decides where to put
1096 # PDB files when compiling using MSVC so we specify it manually.
1097 # This should not affect any other platforms.
1098 pdb_name = library_name + '.dll.pdb'
1099 library = env.SharedLibrary(library_name, object_files, PDB=pdb_name)
1100 context.library_targets.append(library)
1101
1102 d8_env = Environment()
1103 d8_env.Replace(**context.flags['d8'])
Leon Clarkee46be812010-01-19 14:06:41 +00001104 context.ApplyEnvOverrides(d8_env)
Steve Blocka7e24c12009-10-30 11:49:00 +00001105 shell = d8_env.Program('d8' + suffix, object_files + shell_files)
1106 context.d8_targets.append(shell)
1107
1108 for sample in context.samples:
Steve Block6ded16b2010-05-10 14:33:55 +01001109 sample_env = Environment()
Steve Blocka7e24c12009-10-30 11:49:00 +00001110 sample_env.Replace(**context.flags['sample'])
Steve Block6ded16b2010-05-10 14:33:55 +01001111 sample_env.Prepend(LIBS=[library_name])
Steve Blocka7e24c12009-10-30 11:49:00 +00001112 context.ApplyEnvOverrides(sample_env)
1113 sample_object = sample_env.SConscript(
1114 join('samples', 'SConscript'),
1115 build_dir=join('obj', 'sample', sample, target_id),
1116 exports='sample context',
1117 duplicate=False
1118 )
1119 sample_name = sample + suffix
1120 sample_program = sample_env.Program(sample_name, sample_object)
1121 sample_env.Depends(sample_program, library)
1122 context.sample_targets.append(sample_program)
1123
Steve Block6ded16b2010-05-10 14:33:55 +01001124 cctest_env = env.Copy()
1125 cctest_env.Prepend(LIBS=[library_name])
1126 cctest_program = cctest_env.SConscript(
Steve Blocka7e24c12009-10-30 11:49:00 +00001127 join('test', 'cctest', 'SConscript'),
1128 build_dir=join('obj', 'test', target_id),
1129 exports='context object_files',
1130 duplicate=False
1131 )
1132 context.cctest_targets.append(cctest_program)
1133
1134 return context
1135
1136
1137def Build():
1138 opts = GetOptions()
1139 env = Environment(options=opts)
1140 Help(opts.GenerateHelpText(env))
1141 VerifyOptions(env)
1142 env_overrides = ParseEnvOverrides(env['env'], env['importenv'])
1143
1144 SourceSignatures(env['sourcesignatures'])
1145
1146 libraries = []
1147 mksnapshots = []
1148 cctests = []
1149 samples = []
1150 d8s = []
1151 modes = SplitList(env['mode'])
1152 for mode in modes:
1153 context = BuildSpecific(env.Copy(), mode, env_overrides)
1154 libraries += context.library_targets
1155 mksnapshots += context.mksnapshot_targets
1156 cctests += context.cctest_targets
1157 samples += context.sample_targets
1158 d8s += context.d8_targets
1159
1160 env.Alias('library', libraries)
1161 env.Alias('mksnapshot', mksnapshots)
1162 env.Alias('cctests', cctests)
1163 env.Alias('sample', samples)
1164 env.Alias('d8', d8s)
1165
1166 if env['sample']:
1167 env.Default('sample')
1168 else:
1169 env.Default('library')
1170
Ben Murdoch7f4d5bd2010-06-15 11:15:29 +01001171 if env['cache']:
1172 CacheDir(env['cache'])
Steve Blocka7e24c12009-10-30 11:49:00 +00001173
1174# We disable deprecation warnings because we need to be able to use
1175# env.Copy without getting warnings for compatibility with older
1176# version of scons. Also, there's a bug in some revisions that
1177# doesn't allow this flag to be set, so we swallow any exceptions.
1178# Lovely.
1179try:
1180 SetOption('warn', 'no-deprecated')
1181except:
1182 pass
1183
1184
1185Build()