Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(104)

Side by Side Diff: SConstruct

Issue 14348002: Remove SCons related files (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: fixed os.path.join occurrences that depended on old imports Created 7 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « no previous file | preparser/SConscript » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
(Empty)
1 # Copyright 2012 the V8 project authors. All rights reserved.
2 # 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
28 import platform
29 import re
30 import subprocess
31 import sys
32 import os
33 from os.path import join, dirname, abspath
34 from types import DictType, StringTypes
35 root_dir = dirname(File('SConstruct').rfile().abspath)
36 src_dir = join(root_dir, 'src')
37 sys.path.insert(0, join(root_dir, 'tools'))
38 import js2c, utils
39
40 # ARM_TARGET_LIB is the path to the dynamic library to use on the target
41 # machine if cross-compiling to an arm machine. You will also need to set
42 # the additional cross-compiling environment variables to the cross compiler.
43 ARM_TARGET_LIB = os.environ.get('ARM_TARGET_LIB')
44 if ARM_TARGET_LIB:
45 ARM_LINK_FLAGS = ['-Wl,-rpath=' + ARM_TARGET_LIB + '/lib:' +
46 ARM_TARGET_LIB + '/usr/lib',
47 '-Wl,--dynamic-linker=' + ARM_TARGET_LIB +
48 '/lib/ld-linux.so.3']
49 else:
50 ARM_LINK_FLAGS = []
51
52 GCC_EXTRA_CCFLAGS = []
53 GCC_DTOA_EXTRA_CCFLAGS = []
54
55 LIBRARY_FLAGS = {
56 'all': {
57 'CPPPATH': [src_dir],
58 'regexp:interpreted': {
59 'CPPDEFINES': ['V8_INTERPRETED_REGEXP']
60 },
61 'mode:debug': {
62 'CPPDEFINES': ['V8_ENABLE_CHECKS', 'OBJECT_PRINT', 'VERIFY_HEAP']
63 },
64 'objectprint:on': {
65 'CPPDEFINES': ['OBJECT_PRINT'],
66 },
67 'debuggersupport:on': {
68 'CPPDEFINES': ['ENABLE_DEBUGGER_SUPPORT'],
69 },
70 'fasttls:off': {
71 'CPPDEFINES': ['V8_NO_FAST_TLS'],
72 },
73 },
74 'gcc': {
75 'all': {
76 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
77 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
78 },
79 'visibility:hidden': {
80 # Use visibility=default to disable this.
81 'CXXFLAGS': ['-fvisibility=hidden']
82 },
83 'strictaliasing:off': {
84 'CCFLAGS': ['-fno-strict-aliasing']
85 },
86 'mode:debug': {
87 'CCFLAGS': ['-g', '-O0'],
88 'CPPDEFINES': ['ENABLE_DISASSEMBLER', 'DEBUG'],
89 },
90 'mode:release': {
91 'CCFLAGS': ['-O3', '-fomit-frame-pointer', '-fdata-sections',
92 '-ffunction-sections'],
93 },
94 'os:linux': {
95 'CCFLAGS': ['-ansi'] + GCC_EXTRA_CCFLAGS,
96 'library:shared': {
97 'CPPDEFINES': ['V8_SHARED', 'BUILDING_V8_SHARED'],
98 'LIBS': ['pthread']
99 }
100 },
101 'os:macos': {
102 'CCFLAGS': ['-ansi', '-mmacosx-version-min=10.4'],
103 'library:shared': {
104 'CPPDEFINES': ['V8_SHARED', 'BUILDING_V8_SHARED'],
105 }
106 },
107 'os:freebsd': {
108 'CPPPATH' : [src_dir, '/usr/local/include'],
109 'LIBPATH' : ['/usr/local/lib'],
110 'CCFLAGS': ['-ansi'],
111 'LIBS': ['execinfo']
112 },
113 'os:openbsd': {
114 'CPPPATH' : [src_dir, '/usr/local/include'],
115 'LIBPATH' : ['/usr/local/lib'],
116 'CCFLAGS': ['-ansi'],
117 },
118 'os:solaris': {
119 # On Solaris, to get isinf, INFINITY, fpclassify and other macros one
120 # needs to define __C99FEATURES__.
121 'CPPDEFINES': ['__C99FEATURES__'],
122 'CPPPATH' : [src_dir, '/usr/local/include'],
123 'LIBPATH' : ['/usr/local/lib'],
124 'CCFLAGS': ['-ansi'],
125 },
126 'os:netbsd': {
127 'CPPPATH' : [src_dir, '/usr/pkg/include'],
128 'LIBPATH' : ['/usr/pkg/lib'],
129 },
130 'os:win32': {
131 'CCFLAGS': ['-DWIN32'],
132 'CXXFLAGS': ['-DWIN32'],
133 },
134 'arch:ia32': {
135 'CPPDEFINES': ['V8_TARGET_ARCH_IA32'],
136 'CCFLAGS': ['-m32'],
137 'LINKFLAGS': ['-m32']
138 },
139 'arch:arm': {
140 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
141 'unalignedaccesses:on' : {
142 'CPPDEFINES' : ['CAN_USE_UNALIGNED_ACCESSES=1']
143 },
144 'unalignedaccesses:off' : {
145 'CPPDEFINES' : ['CAN_USE_UNALIGNED_ACCESSES=0']
146 },
147 'armeabi:soft' : {
148 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
149 'simulator:none': {
150 'CCFLAGS': ['-mfloat-abi=soft'],
151 }
152 },
153 'armeabi:softfp' : {
154 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
155 'vfp3:on': {
156 'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
157 },
158 'simulator:none': {
159 'CCFLAGS': ['-mfloat-abi=softfp'],
160 }
161 },
162 'armeabi:hard' : {
163 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=1'],
164 'vfp3:on': {
165 'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
166 },
167 'simulator:none': {
168 'CCFLAGS': ['-mfloat-abi=hard'],
169 }
170 }
171 },
172 'simulator:arm': {
173 'CCFLAGS': ['-m32'],
174 'LINKFLAGS': ['-m32'],
175 },
176 'arch:mips': {
177 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
178 'mips_arch_variant:mips32r2': {
179 'CPPDEFINES': ['_MIPS_ARCH_MIPS32R2']
180 },
181 'mips_arch_variant:loongson': {
182 'CPPDEFINES': ['_MIPS_ARCH_LOONGSON']
183 },
184 'simulator:none': {
185 'CCFLAGS': ['-EL'],
186 'LINKFLAGS': ['-EL'],
187 'mips_arch_variant:mips32r2': {
188 'CCFLAGS': ['-mips32r2', '-Wa,-mips32r2']
189 },
190 'mips_arch_variant:mips32r1': {
191 'CCFLAGS': ['-mips32', '-Wa,-mips32']
192 },
193 'mips_arch_variant:loongson': {
194 'CCFLAGS': ['-march=mips3', '-Wa,-march=mips3']
195 },
196 'library:static': {
197 'LINKFLAGS': ['-static', '-static-libgcc']
198 },
199 'mipsabi:softfloat': {
200 'CCFLAGS': ['-msoft-float'],
201 'LINKFLAGS': ['-msoft-float']
202 },
203 'mipsabi:hardfloat': {
204 'CCFLAGS': ['-mhard-float'],
205 'LINKFLAGS': ['-mhard-float']
206 }
207 }
208 },
209 'simulator:mips': {
210 'CCFLAGS': ['-m32'],
211 'LINKFLAGS': ['-m32'],
212 'mipsabi:softfloat': {
213 'CPPDEFINES': ['__mips_soft_float=1'],
214 'fpu:on': {
215 'CPPDEFINES' : ['CAN_USE_FPU_INSTRUCTIONS']
216 }
217 },
218 'mipsabi:hardfloat': {
219 'CPPDEFINES': ['__mips_hard_float=1', 'CAN_USE_FPU_INSTRUCTIONS'],
220 }
221 },
222 'arch:x64': {
223 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
224 'CCFLAGS': ['-m64'],
225 'LINKFLAGS': ['-m64'],
226 },
227 'gdbjit:on': {
228 'CPPDEFINES': ['ENABLE_GDB_JIT_INTERFACE']
229 },
230 'compress_startup_data:bz2': {
231 'CPPDEFINES': ['COMPRESS_STARTUP_DATA_BZ2']
232 }
233 },
234 'msvc': {
235 'all': {
236 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
237 'CXXFLAGS': ['/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'],
278 'ARFLAGS': ['/LTCG'],
279 'pgo:off': {
280 'LINKFLAGS': ['/LTCG'],
281 },
282 'pgo:instrument': {
283 'LINKFLAGS': ['/LTCG:PGI']
284 },
285 'pgo:optimize': {
286 'LINKFLAGS': ['/LTCG:PGO']
287 }
288 }
289 }
290 }
291 }
292
293
294 V8_EXTRA_FLAGS = {
295 'gcc': {
296 'all': {
297 'WARNINGFLAGS': ['-Wall',
298 '-Werror',
299 '-W',
300 '-Wno-unused-parameter',
301 '-Woverloaded-virtual',
302 '-Wnon-virtual-dtor']
303 },
304 'os:win32': {
305 'WARNINGFLAGS': ['-pedantic',
306 '-Wno-long-long',
307 '-Wno-pedantic-ms-format'],
308 'library:shared': {
309 'LIBS': ['winmm', 'ws2_32']
310 }
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 'arch:arm': {
324 # This is to silence warnings about ABI changes that some versions of the
325 # CodeSourcery G++ tool chain produce for each occurrence of varargs.
326 'WARNINGFLAGS': ['-Wno-abi']
327 },
328 'disassembler:on': {
329 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
330 }
331 },
332 'msvc': {
333 'all': {
334 'WARNINGFLAGS': ['/W3', '/WX', '/wd4351', '/wd4355', '/wd4800']
335 },
336 'library:shared': {
337 'CPPDEFINES': ['BUILDING_V8_SHARED'],
338 'LIBS': ['winmm', 'ws2_32']
339 },
340 'arch:arm': {
341 'CPPDEFINES': ['V8_TARGET_ARCH_ARM'],
342 # /wd4996 is to silence the warning about sscanf
343 # used by the arm simulator.
344 'WARNINGFLAGS': ['/wd4996']
345 },
346 'arch:mips': {
347 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
348 'mips_arch_variant:mips32r2': {
349 'CPPDEFINES': ['_MIPS_ARCH_MIPS32R2']
350 },
351 },
352 'disassembler:on': {
353 'CPPDEFINES': ['ENABLE_DISASSEMBLER']
354 }
355 }
356 }
357
358
359 MKSNAPSHOT_EXTRA_FLAGS = {
360 'gcc': {
361 'os:linux': {
362 'LIBS': ['pthread'],
363 },
364 'os:macos': {
365 'LIBS': ['pthread'],
366 },
367 'os:freebsd': {
368 'LIBS': ['execinfo', 'pthread']
369 },
370 'os:solaris': {
371 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
372 'LINKFLAGS': ['-mt']
373 },
374 'os:openbsd': {
375 'LIBS': ['execinfo', 'pthread']
376 },
377 'os:win32': {
378 'LIBS': ['winmm', 'ws2_32'],
379 },
380 'os:netbsd': {
381 'LIBS': ['execinfo', 'pthread']
382 },
383 'compress_startup_data:bz2': {
384 'os:linux': {
385 'LIBS': ['bz2']
386 }
387 },
388 },
389 'msvc': {
390 'all': {
391 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
392 'LIBS': ['winmm', 'ws2_32']
393 }
394 }
395 }
396
397
398 DTOA_EXTRA_FLAGS = {
399 'gcc': {
400 'all': {
401 'WARNINGFLAGS': ['-Werror', '-Wno-uninitialized'],
402 'CCFLAGS': GCC_DTOA_EXTRA_CCFLAGS
403 }
404 },
405 'msvc': {
406 'all': {
407 'WARNINGFLAGS': ['/WX', '/wd4018', '/wd4244']
408 }
409 }
410 }
411
412
413 CCTEST_EXTRA_FLAGS = {
414 'all': {
415 'CPPPATH': [src_dir],
416 'library:shared': {
417 'CPPDEFINES': ['USING_V8_SHARED']
418 },
419 },
420 'gcc': {
421 'all': {
422 'LIBPATH': [abspath('.')],
423 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
424 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
425 'LINKFLAGS': ['$CCFLAGS'],
426 },
427 'os:linux': {
428 'LIBS': ['pthread'],
429 'CCFLAGS': ['-Wno-unused-but-set-variable'],
430 },
431 'os:macos': {
432 'LIBS': ['pthread'],
433 },
434 'os:freebsd': {
435 'LIBS': ['execinfo', 'pthread']
436 },
437 'os:solaris': {
438 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
439 'LINKFLAGS': ['-mt']
440 },
441 'os:openbsd': {
442 'LIBS': ['execinfo', 'pthread']
443 },
444 'os:win32': {
445 'LIBS': ['winmm', 'ws2_32']
446 },
447 'os:netbsd': {
448 'LIBS': ['execinfo', 'pthread']
449 },
450 'arch:arm': {
451 'LINKFLAGS': ARM_LINK_FLAGS
452 },
453 },
454 'msvc': {
455 'all': {
456 'CPPDEFINES': ['_HAS_EXCEPTIONS=0'],
457 'LIBS': ['winmm', 'ws2_32']
458 },
459 'arch:ia32': {
460 'CPPDEFINES': ['V8_TARGET_ARCH_IA32']
461 },
462 'arch:x64': {
463 'CPPDEFINES': ['V8_TARGET_ARCH_X64'],
464 'LINKFLAGS': ['/STACK:2097152']
465 },
466 }
467 }
468
469
470 SAMPLE_FLAGS = {
471 'all': {
472 'CPPPATH': [join(root_dir, 'include')],
473 'library:shared': {
474 'CPPDEFINES': ['USING_V8_SHARED']
475 },
476 },
477 'gcc': {
478 'all': {
479 'LIBPATH': ['.'],
480 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
481 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
482 'LINKFLAGS': ['$CCFLAGS'],
483 },
484 'os:linux': {
485 'LIBS': ['pthread'],
486 },
487 'os:macos': {
488 'LIBS': ['pthread'],
489 },
490 'os:freebsd': {
491 'LIBPATH' : ['/usr/local/lib'],
492 'LIBS': ['execinfo', 'pthread']
493 },
494 'os:solaris': {
495 # On Solaris, to get isinf, INFINITY, fpclassify and other macros one
496 # needs to define __C99FEATURES__.
497 'CPPDEFINES': ['__C99FEATURES__'],
498 'LIBPATH' : ['/usr/local/lib'],
499 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
500 'LINKFLAGS': ['-mt']
501 },
502 'os:openbsd': {
503 'LIBPATH' : ['/usr/local/lib'],
504 'LIBS': ['execinfo', 'pthread']
505 },
506 'os:win32': {
507 'LIBS': ['winmm', 'ws2_32']
508 },
509 'os:netbsd': {
510 'LIBPATH' : ['/usr/pkg/lib'],
511 'LIBS': ['execinfo', 'pthread']
512 },
513 'arch:arm': {
514 'LINKFLAGS': ARM_LINK_FLAGS,
515 'armeabi:soft' : {
516 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
517 'simulator:none': {
518 'CCFLAGS': ['-mfloat-abi=soft'],
519 }
520 },
521 'armeabi:softfp' : {
522 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
523 'simulator:none': {
524 'CCFLAGS': ['-mfloat-abi=softfp'],
525 }
526 },
527 'armeabi:hard' : {
528 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=1'],
529 'vfp3:on': {
530 'CPPDEFINES' : ['CAN_USE_VFP_INSTRUCTIONS']
531 },
532 'simulator:none': {
533 'CCFLAGS': ['-mfloat-abi=hard'],
534 }
535 }
536 },
537 'arch:ia32': {
538 'CCFLAGS': ['-m32'],
539 'LINKFLAGS': ['-m32']
540 },
541 'arch:x64': {
542 'CCFLAGS': ['-m64'],
543 'LINKFLAGS': ['-m64']
544 },
545 'arch:mips': {
546 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
547 'mips_arch_variant:mips32r2': {
548 'CPPDEFINES': ['_MIPS_ARCH_MIPS32R2']
549 },
550 'mips_arch_variant:loongson': {
551 'CPPDEFINES': ['_MIPS_ARCH_LOONGSON']
552 },
553 'simulator:none': {
554 'CCFLAGS': ['-EL'],
555 'LINKFLAGS': ['-EL'],
556 'mips_arch_variant:mips32r2': {
557 'CCFLAGS': ['-mips32r2', '-Wa,-mips32r2']
558 },
559 'mips_arch_variant:mips32r1': {
560 'CCFLAGS': ['-mips32', '-Wa,-mips32']
561 },
562 'mips_arch_variant:loongson': {
563 'CCFLAGS': ['-march=mips3', '-Wa,-march=mips3']
564 },
565 'library:static': {
566 'LINKFLAGS': ['-static', '-static-libgcc']
567 },
568 'mipsabi:softfloat': {
569 'CCFLAGS': ['-msoft-float'],
570 'LINKFLAGS': ['-msoft-float']
571 },
572 'mipsabi:hardfloat': {
573 'CCFLAGS': ['-mhard-float'],
574 'LINKFLAGS': ['-mhard-float'],
575 'fpu:on': {
576 'CPPDEFINES' : ['CAN_USE_FPU_INSTRUCTIONS']
577 }
578 }
579 }
580 },
581 'simulator:arm': {
582 'CCFLAGS': ['-m32'],
583 'LINKFLAGS': ['-m32']
584 },
585 'simulator:mips': {
586 'CCFLAGS': ['-m32'],
587 'LINKFLAGS': ['-m32']
588 },
589 'mode:release': {
590 'CCFLAGS': ['-O2']
591 },
592 'mode:debug': {
593 'CCFLAGS': ['-g', '-O0'],
594 'CPPDEFINES': ['DEBUG']
595 },
596 'compress_startup_data:bz2': {
597 'CPPDEFINES': ['COMPRESS_STARTUP_DATA_BZ2'],
598 'os:linux': {
599 'LIBS': ['bz2']
600 }
601 },
602 },
603 'msvc': {
604 'all': {
605 'LIBS': ['winmm', 'ws2_32']
606 },
607 'verbose:off': {
608 'CCFLAGS': ['/nologo'],
609 'LINKFLAGS': ['/NOLOGO']
610 },
611 'verbose:on': {
612 'LINKFLAGS': ['/VERBOSE']
613 },
614 'prof:on': {
615 'LINKFLAGS': ['/MAP']
616 },
617 'mode:release': {
618 'CCFLAGS': ['/O2'],
619 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
620 'msvcrt:static': {
621 'CCFLAGS': ['/MT']
622 },
623 'msvcrt:shared': {
624 'CCFLAGS': ['/MD']
625 },
626 'msvcltcg:on': {
627 'CCFLAGS': ['/GL'],
628 'pgo:off': {
629 'LINKFLAGS': ['/LTCG'],
630 },
631 },
632 'pgo:instrument': {
633 'LINKFLAGS': ['/LTCG:PGI']
634 },
635 'pgo:optimize': {
636 'LINKFLAGS': ['/LTCG:PGO']
637 }
638 },
639 'arch:ia32': {
640 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', 'WIN32'],
641 'LINKFLAGS': ['/MACHINE:X86']
642 },
643 'arch:x64': {
644 'CPPDEFINES': ['V8_TARGET_ARCH_X64', 'WIN32'],
645 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2097152']
646 },
647 'mode:debug': {
648 'CCFLAGS': ['/Od'],
649 'LINKFLAGS': ['/DEBUG'],
650 'CPPDEFINES': ['DEBUG'],
651 'msvcrt:static': {
652 'CCFLAGS': ['/MTd']
653 },
654 'msvcrt:shared': {
655 'CCFLAGS': ['/MDd']
656 }
657 }
658 }
659 }
660
661
662 PREPARSER_FLAGS = {
663 'all': {
664 'CPPPATH': [join(root_dir, 'include'), src_dir],
665 'library:shared': {
666 'CPPDEFINES': ['USING_V8_SHARED']
667 },
668 },
669 'gcc': {
670 'all': {
671 'LIBPATH': ['.'],
672 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
673 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
674 'LINKFLAGS': ['$CCFLAGS'],
675 },
676 'os:win32': {
677 'LIBS': ['winmm', 'ws2_32']
678 },
679 'arch:arm': {
680 'LINKFLAGS': ARM_LINK_FLAGS,
681 'armeabi:soft' : {
682 'CPPDEFINES' : ['USE_EABI_HARDFLOAT=0'],
683 'simulator:none': {
684 'CCFLAGS': ['-mfloat-abi=soft'],
685 }
686 },
687 'armeabi:softfp' : {
688 'simulator:none': {
689 'CCFLAGS': ['-mfloat-abi=softfp'],
690 }
691 },
692 'armeabi:hard' : {
693 'simulator:none': {
694 'CCFLAGS': ['-mfloat-abi=hard'],
695 }
696 }
697 },
698 'arch:ia32': {
699 'CCFLAGS': ['-m32'],
700 'LINKFLAGS': ['-m32']
701 },
702 'arch:x64': {
703 'CCFLAGS': ['-m64'],
704 'LINKFLAGS': ['-m64']
705 },
706 'arch:mips': {
707 'CPPDEFINES': ['V8_TARGET_ARCH_MIPS'],
708 'mips_arch_variant:mips32r2': {
709 'CPPDEFINES': ['_MIPS_ARCH_MIPS32R2']
710 },
711 'mips_arch_variant:loongson': {
712 'CPPDEFINES': ['_MIPS_ARCH_LOONGSON']
713 },
714 'simulator:none': {
715 'CCFLAGS': ['-EL'],
716 'LINKFLAGS': ['-EL'],
717 'mips_arch_variant:mips32r2': {
718 'CCFLAGS': ['-mips32r2', '-Wa,-mips32r2']
719 },
720 'mips_arch_variant:mips32r1': {
721 'CCFLAGS': ['-mips32', '-Wa,-mips32']
722 },
723 'mips_arch_variant:loongson': {
724 'CCFLAGS': ['-march=mips3', '-Wa,-march=mips3']
725 },
726 'library:static': {
727 'LINKFLAGS': ['-static', '-static-libgcc']
728 },
729 'mipsabi:softfloat': {
730 'CCFLAGS': ['-msoft-float'],
731 'LINKFLAGS': ['-msoft-float']
732 },
733 'mipsabi:hardfloat': {
734 'CCFLAGS': ['-mhard-float'],
735 'LINKFLAGS': ['-mhard-float']
736 }
737 }
738 },
739 'simulator:arm': {
740 'CCFLAGS': ['-m32'],
741 'LINKFLAGS': ['-m32']
742 },
743 'simulator:mips': {
744 'CCFLAGS': ['-m32'],
745 'LINKFLAGS': ['-m32'],
746 'mipsabi:softfloat': {
747 'CPPDEFINES': ['__mips_soft_float=1'],
748 },
749 'mipsabi:hardfloat': {
750 'CPPDEFINES': ['__mips_hard_float=1'],
751 }
752 },
753 'mode:release': {
754 'CCFLAGS': ['-O2']
755 },
756 'mode:debug': {
757 'CCFLAGS': ['-g', '-O0'],
758 'CPPDEFINES': ['DEBUG']
759 },
760 'os:freebsd': {
761 'LIBPATH' : ['/usr/local/lib'],
762 },
763 },
764 'msvc': {
765 'all': {
766 'LIBS': ['winmm', 'ws2_32']
767 },
768 'verbose:off': {
769 'CCFLAGS': ['/nologo'],
770 'LINKFLAGS': ['/NOLOGO']
771 },
772 'verbose:on': {
773 'LINKFLAGS': ['/VERBOSE']
774 },
775 'prof:on': {
776 'LINKFLAGS': ['/MAP']
777 },
778 'mode:release': {
779 'CCFLAGS': ['/O2'],
780 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
781 'msvcrt:static': {
782 'CCFLAGS': ['/MT']
783 },
784 'msvcrt:shared': {
785 'CCFLAGS': ['/MD']
786 },
787 'msvcltcg:on': {
788 'CCFLAGS': ['/GL'],
789 'pgo:off': {
790 'LINKFLAGS': ['/LTCG'],
791 },
792 },
793 'pgo:instrument': {
794 'LINKFLAGS': ['/LTCG:PGI']
795 },
796 'pgo:optimize': {
797 'LINKFLAGS': ['/LTCG:PGO']
798 }
799 },
800 'arch:ia32': {
801 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', 'WIN32'],
802 'LINKFLAGS': ['/MACHINE:X86']
803 },
804 'arch:x64': {
805 'CPPDEFINES': ['V8_TARGET_ARCH_X64', 'WIN32'],
806 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2097152']
807 },
808 'mode:debug': {
809 'CCFLAGS': ['/Od'],
810 'LINKFLAGS': ['/DEBUG'],
811 'CPPDEFINES': ['DEBUG'],
812 'msvcrt:static': {
813 'CCFLAGS': ['/MTd']
814 },
815 'msvcrt:shared': {
816 'CCFLAGS': ['/MDd']
817 }
818 }
819 }
820 }
821
822
823 D8_FLAGS = {
824 'all': {
825 'library:shared': {
826 'CPPDEFINES': ['V8_SHARED'],
827 'LIBS': ['v8'],
828 'LIBPATH': ['.']
829 },
830 },
831 'gcc': {
832 'all': {
833 'CCFLAGS': ['$DIALECTFLAGS', '$WARNINGFLAGS'],
834 'CXXFLAGS': ['-fno-rtti', '-fno-exceptions'],
835 'LINKFLAGS': ['$CCFLAGS'],
836 },
837 'console:readline': {
838 'LIBS': ['readline']
839 },
840 'os:linux': {
841 'LIBS': ['pthread'],
842 },
843 'os:macos': {
844 'LIBS': ['pthread'],
845 },
846 'os:freebsd': {
847 'LIBS': ['pthread'],
848 },
849 'os:solaris': {
850 'LIBS': ['m', 'pthread', 'socket', 'nsl', 'rt'],
851 'LINKFLAGS': ['-mt']
852 },
853 'os:openbsd': {
854 'LIBS': ['pthread'],
855 },
856 'os:win32': {
857 'LIBS': ['winmm', 'ws2_32'],
858 },
859 'os:netbsd': {
860 'LIBS': ['pthread'],
861 },
862 'arch:arm': {
863 'LINKFLAGS': ARM_LINK_FLAGS
864 },
865 'compress_startup_data:bz2': {
866 'CPPDEFINES': ['COMPRESS_STARTUP_DATA_BZ2'],
867 'os:linux': {
868 'LIBS': ['bz2']
869 }
870 }
871 },
872 'msvc': {
873 'all': {
874 'LIBS': ['winmm', 'ws2_32']
875 },
876 'verbose:off': {
877 'CCFLAGS': ['/nologo'],
878 'LINKFLAGS': ['/NOLOGO']
879 },
880 'verbose:on': {
881 'LINKFLAGS': ['/VERBOSE']
882 },
883 'prof:on': {
884 'LINKFLAGS': ['/MAP']
885 },
886 'mode:release': {
887 'CCFLAGS': ['/O2'],
888 'LINKFLAGS': ['/OPT:REF', '/OPT:ICF'],
889 'msvcrt:static': {
890 'CCFLAGS': ['/MT']
891 },
892 'msvcrt:shared': {
893 'CCFLAGS': ['/MD']
894 },
895 'msvcltcg:on': {
896 'CCFLAGS': ['/GL'],
897 'pgo:off': {
898 'LINKFLAGS': ['/LTCG'],
899 },
900 },
901 'pgo:instrument': {
902 'LINKFLAGS': ['/LTCG:PGI']
903 },
904 'pgo:optimize': {
905 'LINKFLAGS': ['/LTCG:PGO']
906 }
907 },
908 'arch:ia32': {
909 'CPPDEFINES': ['V8_TARGET_ARCH_IA32', 'WIN32'],
910 'LINKFLAGS': ['/MACHINE:X86']
911 },
912 'arch:x64': {
913 'CPPDEFINES': ['V8_TARGET_ARCH_X64', 'WIN32'],
914 'LINKFLAGS': ['/MACHINE:X64', '/STACK:2097152']
915 },
916 'mode:debug': {
917 'CCFLAGS': ['/Od'],
918 'LINKFLAGS': ['/DEBUG'],
919 'CPPDEFINES': ['DEBUG'],
920 'msvcrt:static': {
921 'CCFLAGS': ['/MTd']
922 },
923 'msvcrt:shared': {
924 'CCFLAGS': ['/MDd']
925 }
926 }
927 }
928 }
929
930
931 SUFFIXES = {
932 'release': '',
933 'debug': '_g'
934 }
935
936
937 def Abort(message):
938 print message
939 sys.exit(1)
940
941
942 def GuessOS(env):
943 return utils.GuessOS()
944
945
946 def GuessArch(env):
947 return utils.GuessArchitecture()
948
949
950 def GuessToolchain(env):
951 tools = env['TOOLS']
952 if 'gcc' in tools:
953 return 'gcc'
954 elif 'msvc' in tools:
955 return 'msvc'
956 else:
957 return None
958
959
960 def GuessVisibility(env):
961 os = env['os']
962 toolchain = env['toolchain'];
963 if (os == 'win32' or os == 'cygwin') and toolchain == 'gcc':
964 # MinGW / Cygwin can't do it.
965 return 'default'
966 elif os == 'solaris':
967 return 'default'
968 else:
969 return 'hidden'
970
971
972 def GuessStrictAliasing(env):
973 # There seems to be a problem with gcc 4.5.x.
974 # See http://code.google.com/p/v8/issues/detail?id=884
975 # It can be worked around by disabling strict aliasing.
976 toolchain = env['toolchain'];
977 if toolchain == 'gcc':
978 env = Environment(tools=['gcc'])
979 # The gcc version should be available in env['CCVERSION'],
980 # but when scons detects msvc this value is not set.
981 version = subprocess.Popen([env['CC'], '-dumpversion'],
982 stdout=subprocess.PIPE).communicate()[0]
983 if version.find('4.5') == 0:
984 return 'off'
985 return 'default'
986
987
988 PLATFORM_OPTIONS = {
989 'arch': {
990 'values': ['arm', 'ia32', 'x64', 'mips'],
991 'guess': GuessArch,
992 'help': 'the architecture to build for'
993 },
994 'os': {
995 'values': ['freebsd', 'linux', 'macos', 'win32', 'openbsd', 'solaris', 'cygw in', 'netbsd'],
996 'guess': GuessOS,
997 'help': 'the os to build for'
998 },
999 'toolchain': {
1000 'values': ['gcc', 'msvc'],
1001 'guess': GuessToolchain,
1002 'help': 'the toolchain to use'
1003 }
1004 }
1005
1006 SIMPLE_OPTIONS = {
1007 'regexp': {
1008 'values': ['native', 'interpreted'],
1009 'default': 'native',
1010 'help': 'Whether to use native or interpreted regexp implementation'
1011 },
1012 'snapshot': {
1013 'values': ['on', 'off', 'nobuild'],
1014 'default': 'off',
1015 'help': 'build using snapshots for faster start-up'
1016 },
1017 'prof': {
1018 'values': ['on', 'off'],
1019 'default': 'off',
1020 'help': 'enable profiling of build target'
1021 },
1022 'gdbjit': {
1023 'values': ['on', 'off'],
1024 'default': 'off',
1025 'help': 'enable GDB JIT interface'
1026 },
1027 'library': {
1028 'values': ['static', 'shared'],
1029 'default': 'static',
1030 'help': 'the type of library to produce'
1031 },
1032 'objectprint': {
1033 'values': ['on', 'off'],
1034 'default': 'off',
1035 'help': 'enable object printing'
1036 },
1037 'profilingsupport': {
1038 'values': ['on', 'off'],
1039 'default': 'on',
1040 'help': 'enable profiling of JavaScript code'
1041 },
1042 'debuggersupport': {
1043 'values': ['on', 'off'],
1044 'default': 'on',
1045 'help': 'enable debugging of JavaScript code'
1046 },
1047 'soname': {
1048 'values': ['on', 'off'],
1049 'default': 'off',
1050 'help': 'turn on setting soname for Linux shared library'
1051 },
1052 'msvcrt': {
1053 'values': ['static', 'shared'],
1054 'default': 'static',
1055 'help': 'the type of Microsoft Visual C++ runtime library to use'
1056 },
1057 'msvcltcg': {
1058 'values': ['on', 'off'],
1059 'default': 'on',
1060 'help': 'use Microsoft Visual C++ link-time code generation'
1061 },
1062 'simulator': {
1063 'values': ['arm', 'mips', 'none'],
1064 'default': 'none',
1065 'help': 'build with simulator'
1066 },
1067 'unalignedaccesses': {
1068 'values': ['default', 'on', 'off'],
1069 'default': 'default',
1070 'help': 'set whether the ARM target supports unaligned accesses'
1071 },
1072 'disassembler': {
1073 'values': ['on', 'off'],
1074 'default': 'off',
1075 'help': 'enable the disassembler to inspect generated code'
1076 },
1077 'fasttls': {
1078 'values': ['on', 'off'],
1079 'default': 'on',
1080 'help': 'enable fast thread local storage support '
1081 '(if available on the current architecture/platform)'
1082 },
1083 'sourcesignatures': {
1084 'values': ['MD5', 'timestamp'],
1085 'default': 'MD5',
1086 'help': 'set how the build system detects file changes'
1087 },
1088 'console': {
1089 'values': ['dumb', 'readline'],
1090 'default': 'dumb',
1091 'help': 'the console to use for the d8 shell'
1092 },
1093 'verbose': {
1094 'values': ['on', 'off'],
1095 'default': 'off',
1096 'help': 'more output from compiler and linker'
1097 },
1098 'visibility': {
1099 'values': ['default', 'hidden'],
1100 'guess': GuessVisibility,
1101 'help': 'shared library symbol visibility'
1102 },
1103 'strictaliasing': {
1104 'values': ['default', 'off'],
1105 'guess': GuessStrictAliasing,
1106 'help': 'assume strict aliasing while optimizing'
1107 },
1108 'pgo': {
1109 'values': ['off', 'instrument', 'optimize'],
1110 'default': 'off',
1111 'help': 'select profile guided optimization variant',
1112 },
1113 'armeabi': {
1114 'values': ['hard', 'softfp', 'soft'],
1115 'default': 'softfp',
1116 'help': 'generate calling conventiont according to selected ARM EABI variant '
1117 },
1118 'mipsabi': {
1119 'values': ['hardfloat', 'softfloat', 'none'],
1120 'default': 'hardfloat',
1121 'help': 'generate calling conventiont according to selected mips ABI'
1122 },
1123 'mips_arch_variant': {
1124 'values': ['mips32r2', 'mips32r1', 'loongson'],
1125 'default': 'mips32r2',
1126 'help': 'mips variant'
1127 },
1128 'compress_startup_data': {
1129 'values': ['off', 'bz2'],
1130 'default': 'off',
1131 'help': 'compress startup data (snapshot) [Linux only]'
1132 },
1133 'vfp3': {
1134 'values': ['on', 'off'],
1135 'default': 'on',
1136 'help': 'use vfp3 instructions when building the snapshot [Arm only]'
1137 },
1138 'fpu': {
1139 'values': ['on', 'off'],
1140 'default': 'on',
1141 'help': 'use fpu instructions when building the snapshot [MIPS only]'
1142 },
1143 'I_know_I_should_build_with_GYP': {
1144 'values': ['yes', 'no'],
1145 'default': 'no',
1146 'help': 'grace period: temporarily override SCons deprecation'
1147 }
1148
1149 }
1150
1151 ALL_OPTIONS = dict(PLATFORM_OPTIONS, **SIMPLE_OPTIONS)
1152
1153
1154 def AddOptions(options, result):
1155 guess_env = Environment(options=result)
1156 for (name, option) in options.iteritems():
1157 if 'guess' in option:
1158 # Option has a guess function
1159 guess = option.get('guess')
1160 default = guess(guess_env)
1161 else:
1162 # Option has a fixed default
1163 default = option.get('default')
1164 help = '%s (%s)' % (option.get('help'), ", ".join(option['values']))
1165 result.Add(name, help, default)
1166
1167
1168 def GetOptions():
1169 result = Options()
1170 result.Add('mode', 'compilation mode (debug, release)', 'release')
1171 result.Add('sample', 'build sample (shell, process, lineprocessor)', '')
1172 result.Add('cache', 'directory to use for scons build cache', '')
1173 result.Add('env', 'override environment settings (NAME0:value0,NAME1:value1,.. .)', '')
1174 result.Add('importenv', 'import environment settings (NAME0,NAME1,...)', '')
1175 AddOptions(PLATFORM_OPTIONS, result)
1176 AddOptions(SIMPLE_OPTIONS, result)
1177 return result
1178
1179
1180 def GetTools(opts):
1181 env = Environment(options=opts)
1182 os = env['os']
1183 toolchain = env['toolchain']
1184 if os == 'win32' and toolchain == 'gcc':
1185 return ['mingw']
1186 elif os == 'win32' and toolchain == 'msvc':
1187 return ['msvc', 'mslink', 'mslib', 'msvs']
1188 else:
1189 return ['default']
1190
1191
1192 def GetVersionComponents():
1193 MAJOR_VERSION_PATTERN = re.compile(r"#define\s+MAJOR_VERSION\s+(.*)")
1194 MINOR_VERSION_PATTERN = re.compile(r"#define\s+MINOR_VERSION\s+(.*)")
1195 BUILD_NUMBER_PATTERN = re.compile(r"#define\s+BUILD_NUMBER\s+(.*)")
1196 PATCH_LEVEL_PATTERN = re.compile(r"#define\s+PATCH_LEVEL\s+(.*)")
1197
1198 patterns = [MAJOR_VERSION_PATTERN,
1199 MINOR_VERSION_PATTERN,
1200 BUILD_NUMBER_PATTERN,
1201 PATCH_LEVEL_PATTERN]
1202
1203 source = open(join(root_dir, 'src', 'version.cc')).read()
1204 version_components = []
1205 for pattern in patterns:
1206 match = pattern.search(source)
1207 if match:
1208 version_components.append(match.group(1).strip())
1209 else:
1210 version_components.append('0')
1211
1212 return version_components
1213
1214
1215 def GetVersion():
1216 version_components = GetVersionComponents()
1217
1218 if version_components[len(version_components) - 1] == '0':
1219 version_components.pop()
1220 return '.'.join(version_components)
1221
1222
1223 def GetSpecificSONAME():
1224 SONAME_PATTERN = re.compile(r"#define\s+SONAME\s+\"(.*)\"")
1225
1226 source = open(join(root_dir, 'src', 'version.cc')).read()
1227 match = SONAME_PATTERN.search(source)
1228
1229 if match:
1230 return match.group(1).strip()
1231 else:
1232 return ''
1233
1234
1235 def SplitList(str):
1236 return [ s for s in str.split(",") if len(s) > 0 ]
1237
1238
1239 def IsLegal(env, option, values):
1240 str = env[option]
1241 for s in SplitList(str):
1242 if not s in values:
1243 Abort("Illegal value for option %s '%s'." % (option, s))
1244 return False
1245 return True
1246
1247
1248 def WarnAboutDeprecation():
1249 print """
1250 #####################################################################
1251 # #
1252 # LAST WARNING: Building V8 with SCons is deprecated. #
1253 # #
1254 # This only works because you have overridden the kill switch. #
1255 # #
1256 # MIGRATE TO THE GYP-BASED BUILD NOW! #
1257 # #
1258 # Instructions: http://code.google.com/p/v8/wiki/BuildingWithGYP. #
1259 # #
1260 #####################################################################
1261 """
1262
1263
1264 def VerifyOptions(env):
1265 if env['I_know_I_should_build_with_GYP'] != 'yes':
1266 Abort("Building V8 with SCons is no longer supported. Please use GYP "
1267 "instead; you can find instructions are at "
1268 "http://code.google.com/p/v8/wiki/BuildingWithGYP.\n\n"
1269 "Quitting.\n\n"
1270 "For a limited grace period, you can specify "
1271 "\"I_know_I_should_build_with_GYP=yes\" to override.")
1272 else:
1273 WarnAboutDeprecation()
1274 import atexit
1275 atexit.register(WarnAboutDeprecation)
1276
1277 if not IsLegal(env, 'mode', ['debug', 'release']):
1278 return False
1279 if not IsLegal(env, 'sample', ["shell", "process", "lineprocessor"]):
1280 return False
1281 if not IsLegal(env, 'regexp', ["native", "interpreted"]):
1282 return False
1283 if env['os'] == 'win32' and env['library'] == 'shared' and env['prof'] == 'on' :
1284 Abort("Profiling on windows only supported for static library.")
1285 if env['gdbjit'] == 'on' and ((env['os'] != 'linux' and env['os'] != 'macos') or (env['arch'] != 'ia32' and env['arch'] != 'x64' and env['arch'] != 'arm')):
1286 Abort("GDBJIT interface is supported only for Intel-compatible (ia32 or x64) Linux/OSX target.")
1287 if env['os'] == 'win32' and env['soname'] == 'on':
1288 Abort("Shared Object soname not applicable for Windows.")
1289 if env['soname'] == 'on' and env['library'] == 'static':
1290 Abort("Shared Object soname not applicable for static library.")
1291 if env['os'] != 'win32' and env['pgo'] != 'off':
1292 Abort("Profile guided optimization only supported on Windows.")
1293 if env['cache'] and not os.path.isdir(env['cache']):
1294 Abort("The specified cache directory does not exist.")
1295 if not (env['arch'] == 'arm' or env['simulator'] == 'arm') and ('unalignedacce sses' in ARGUMENTS):
1296 print env['arch']
1297 print env['simulator']
1298 Abort("Option unalignedaccesses only supported for the ARM architecture.")
1299 if env['os'] != 'linux' and env['compress_startup_data'] != 'off':
1300 Abort("Startup data compression is only available on Linux")
1301 for (name, option) in ALL_OPTIONS.iteritems():
1302 if (not name in env):
1303 message = ("A value for option %s must be specified (%s)." %
1304 (name, ", ".join(option['values'])))
1305 Abort(message)
1306 if not env[name] in option['values']:
1307 message = ("Unknown %s value '%s'. Possible values are (%s)." %
1308 (name, env[name], ", ".join(option['values'])))
1309 Abort(message)
1310
1311
1312 class BuildContext(object):
1313
1314 def __init__(self, options, env_overrides, samples):
1315 self.library_targets = []
1316 self.mksnapshot_targets = []
1317 self.cctest_targets = []
1318 self.sample_targets = []
1319 self.d8_targets = []
1320 self.options = options
1321 self.env_overrides = env_overrides
1322 self.samples = samples
1323 self.preparser_targets = []
1324 self.use_snapshot = (options['snapshot'] != 'off')
1325 self.build_snapshot = (options['snapshot'] == 'on')
1326 self.flags = None
1327
1328 def AddRelevantFlags(self, initial, flags):
1329 result = initial.copy()
1330 toolchain = self.options['toolchain']
1331 if toolchain in flags:
1332 self.AppendFlags(result, flags[toolchain].get('all'))
1333 for option in sorted(self.options.keys()):
1334 value = self.options[option]
1335 self.AppendFlags(result, flags[toolchain].get(option + ':' + value))
1336 self.AppendFlags(result, flags.get('all'))
1337 return result
1338
1339 def AddRelevantSubFlags(self, options, flags):
1340 self.AppendFlags(options, flags.get('all'))
1341 for option in sorted(self.options.keys()):
1342 value = self.options[option]
1343 self.AppendFlags(options, flags.get(option + ':' + value))
1344
1345 def GetRelevantSources(self, source):
1346 result = []
1347 result += source.get('all', [])
1348 for (name, value) in self.options.iteritems():
1349 source_value = source.get(name + ':' + value, [])
1350 if type(source_value) == dict:
1351 result += self.GetRelevantSources(source_value)
1352 else:
1353 result += source_value
1354 return sorted(result)
1355
1356 def AppendFlags(self, options, added):
1357 if not added:
1358 return
1359 for (key, value) in added.iteritems():
1360 if key.find(':') != -1:
1361 self.AddRelevantSubFlags(options, { key: value })
1362 else:
1363 if not key in options:
1364 options[key] = value
1365 else:
1366 prefix = options[key]
1367 if isinstance(prefix, StringTypes): prefix = prefix.split()
1368 options[key] = prefix + value
1369
1370 def ConfigureObject(self, env, input, **kw):
1371 if (kw.has_key('CPPPATH') and env.has_key('CPPPATH')):
1372 kw['CPPPATH'] += env['CPPPATH']
1373 if self.options['library'] == 'static':
1374 return env.StaticObject(input, **kw)
1375 else:
1376 return env.SharedObject(input, **kw)
1377
1378 def ApplyEnvOverrides(self, env):
1379 if not self.env_overrides:
1380 return
1381 if type(env['ENV']) == DictType:
1382 env['ENV'].update(**self.env_overrides)
1383 else:
1384 env['ENV'] = self.env_overrides
1385
1386
1387 def PostprocessOptions(options, os):
1388 # Adjust architecture if the simulator option has been set
1389 if (options['simulator'] != 'none') and (options['arch'] != options['simulator ']):
1390 if 'arch' in ARGUMENTS:
1391 # Print a warning if arch has explicitly been set
1392 print "Warning: forcing architecture to match simulator (%s)" % options['s imulator']
1393 options['arch'] = options['simulator']
1394 if (options['prof'] != 'off') and (options['profilingsupport'] == 'off'):
1395 # Print a warning if profiling is enabled without profiling support
1396 print "Warning: forcing profilingsupport on when prof is on"
1397 options['profilingsupport'] = 'on'
1398 if os == 'win32' and options['pgo'] != 'off' and options['msvcltcg'] == 'off':
1399 if 'msvcltcg' in ARGUMENTS:
1400 print "Warning: forcing msvcltcg on as it is required for pgo (%s)" % opti ons['pgo']
1401 options['msvcltcg'] = 'on'
1402 if (options['mipsabi'] != 'none') and (options['arch'] != 'mips') and (options ['simulator'] != 'mips'):
1403 options['mipsabi'] = 'none'
1404
1405
1406 def ParseEnvOverrides(arg, imports):
1407 # The environment overrides are in the format NAME0:value0,NAME1:value1,...
1408 # The environment imports are in the format NAME0,NAME1,...
1409 overrides = {}
1410 for var in imports.split(','):
1411 if var in os.environ:
1412 overrides[var] = os.environ[var]
1413 for override in arg.split(','):
1414 pos = override.find(':')
1415 if pos == -1:
1416 continue
1417 overrides[override[:pos].strip()] = override[pos+1:].strip()
1418 return overrides
1419
1420
1421 def BuildSpecific(env, mode, env_overrides, tools):
1422 options = {'mode': mode}
1423 for option in ALL_OPTIONS:
1424 options[option] = env[option]
1425 PostprocessOptions(options, env['os'])
1426
1427 context = BuildContext(options, env_overrides, samples=SplitList(env['sample'] ))
1428
1429 # Remove variables which can't be imported from the user's external
1430 # environment into a construction environment.
1431 user_environ = os.environ.copy()
1432 try:
1433 del user_environ['ENV']
1434 except KeyError:
1435 pass
1436
1437 library_flags = context.AddRelevantFlags(user_environ, LIBRARY_FLAGS)
1438 v8_flags = context.AddRelevantFlags(library_flags, V8_EXTRA_FLAGS)
1439 mksnapshot_flags = context.AddRelevantFlags(library_flags, MKSNAPSHOT_EXTRA_FL AGS)
1440 dtoa_flags = context.AddRelevantFlags(library_flags, DTOA_EXTRA_FLAGS)
1441 cctest_flags = context.AddRelevantFlags(v8_flags, CCTEST_EXTRA_FLAGS)
1442 sample_flags = context.AddRelevantFlags(user_environ, SAMPLE_FLAGS)
1443 preparser_flags = context.AddRelevantFlags(user_environ, PREPARSER_FLAGS)
1444 d8_flags = context.AddRelevantFlags(library_flags, D8_FLAGS)
1445
1446 context.flags = {
1447 'v8': v8_flags,
1448 'mksnapshot': mksnapshot_flags,
1449 'dtoa': dtoa_flags,
1450 'cctest': cctest_flags,
1451 'sample': sample_flags,
1452 'd8': d8_flags,
1453 'preparser': preparser_flags
1454 }
1455
1456 # Generate library base name.
1457 target_id = mode
1458 suffix = SUFFIXES[target_id]
1459 library_name = 'v8' + suffix
1460 preparser_library_name = 'v8preparser' + suffix
1461 version = GetVersion()
1462 if context.options['soname'] == 'on':
1463 # When building shared object with SONAME version the library name.
1464 library_name += '-' + version
1465
1466 # Generate library SONAME if required by the build.
1467 if context.options['soname'] == 'on':
1468 soname = GetSpecificSONAME()
1469 if soname == '':
1470 soname = 'lib' + library_name + '.so'
1471 env['SONAME'] = soname
1472
1473 # Build the object files by invoking SCons recursively.
1474 d8_env = Environment(tools=tools)
1475 d8_env.Replace(**context.flags['d8'])
1476 (object_files, shell_files, mksnapshot, preparser_files) = env.SConscript(
1477 join('src', 'SConscript'),
1478 build_dir=join('obj', target_id),
1479 exports='context tools d8_env',
1480 duplicate=False
1481 )
1482
1483 context.mksnapshot_targets.append(mksnapshot)
1484
1485 # Link the object files into a library.
1486 env.Replace(**context.flags['v8'])
1487
1488 context.ApplyEnvOverrides(env)
1489 if context.options['library'] == 'static':
1490 library = env.StaticLibrary(library_name, object_files)
1491 preparser_library = env.StaticLibrary(preparser_library_name,
1492 preparser_files)
1493 else:
1494 # There seems to be a glitch in the way scons decides where to put
1495 # PDB files when compiling using MSVC so we specify it manually.
1496 # This should not affect any other platforms.
1497 pdb_name = library_name + '.dll.pdb'
1498 library = env.SharedLibrary(library_name, object_files, PDB=pdb_name)
1499 preparser_pdb_name = preparser_library_name + '.dll.pdb';
1500 preparser_soname = 'lib' + preparser_library_name + '.so';
1501 preparser_library = env.SharedLibrary(preparser_library_name,
1502 preparser_files,
1503 PDB=preparser_pdb_name,
1504 SONAME=preparser_soname)
1505 context.library_targets.append(library)
1506 context.library_targets.append(preparser_library)
1507
1508 context.ApplyEnvOverrides(d8_env)
1509 if context.options['library'] == 'static':
1510 shell = d8_env.Program('d8' + suffix, object_files + shell_files)
1511 else:
1512 shell = d8_env.Program('d8' + suffix, shell_files)
1513 d8_env.Depends(shell, library)
1514 context.d8_targets.append(shell)
1515
1516 for sample in context.samples:
1517 sample_env = Environment(tools=tools)
1518 sample_env.Replace(**context.flags['sample'])
1519 sample_env.Prepend(LIBS=[library_name])
1520 context.ApplyEnvOverrides(sample_env)
1521 sample_object = sample_env.SConscript(
1522 join('samples', 'SConscript'),
1523 build_dir=join('obj', 'sample', sample, target_id),
1524 exports='sample context tools',
1525 duplicate=False
1526 )
1527 sample_name = sample + suffix
1528 sample_program = sample_env.Program(sample_name, sample_object)
1529 sample_env.Depends(sample_program, library)
1530 context.sample_targets.append(sample_program)
1531
1532 cctest_env = env.Copy()
1533 cctest_env.Prepend(LIBS=[library_name])
1534 cctest_program = cctest_env.SConscript(
1535 join('test', 'cctest', 'SConscript'),
1536 build_dir=join('obj', 'test', target_id),
1537 exports='context object_files tools',
1538 duplicate=False
1539 )
1540 context.cctest_targets.append(cctest_program)
1541
1542 preparser_env = env.Copy()
1543 preparser_env.Replace(**context.flags['preparser'])
1544 preparser_env.Prepend(LIBS=[preparser_library_name])
1545 context.ApplyEnvOverrides(preparser_env)
1546 preparser_object = preparser_env.SConscript(
1547 join('preparser', 'SConscript'),
1548 build_dir=join('obj', 'preparser', target_id),
1549 exports='context tools',
1550 duplicate=False
1551 )
1552 preparser_name = join('obj', 'preparser', target_id, 'preparser')
1553 preparser_program = preparser_env.Program(preparser_name, preparser_object);
1554 preparser_env.Depends(preparser_program, preparser_library)
1555 context.preparser_targets.append(preparser_program)
1556
1557 return context
1558
1559
1560 def Build():
1561 opts = GetOptions()
1562 tools = GetTools(opts)
1563 env = Environment(options=opts, tools=tools)
1564
1565 Help(opts.GenerateHelpText(env))
1566 VerifyOptions(env)
1567 env_overrides = ParseEnvOverrides(env['env'], env['importenv'])
1568
1569 SourceSignatures(env['sourcesignatures'])
1570
1571 libraries = []
1572 mksnapshots = []
1573 cctests = []
1574 samples = []
1575 preparsers = []
1576 d8s = []
1577 modes = SplitList(env['mode'])
1578 for mode in modes:
1579 context = BuildSpecific(env.Copy(), mode, env_overrides, tools)
1580 libraries += context.library_targets
1581 mksnapshots += context.mksnapshot_targets
1582 cctests += context.cctest_targets
1583 samples += context.sample_targets
1584 preparsers += context.preparser_targets
1585 d8s += context.d8_targets
1586
1587 env.Alias('library', libraries)
1588 env.Alias('mksnapshot', mksnapshots)
1589 env.Alias('cctests', cctests)
1590 env.Alias('sample', samples)
1591 env.Alias('d8', d8s)
1592 env.Alias('preparser', preparsers)
1593
1594 if env['sample']:
1595 env.Default('sample')
1596 else:
1597 env.Default('library')
1598
1599 if env['cache']:
1600 CacheDir(env['cache'])
1601
1602 # We disable deprecation warnings because we need to be able to use
1603 # env.Copy without getting warnings for compatibility with older
1604 # version of scons. Also, there's a bug in some revisions that
1605 # doesn't allow this flag to be set, so we swallow any exceptions.
1606 # Lovely.
1607 try:
1608 SetOption('warn', 'no-deprecated')
1609 except:
1610 pass
1611
1612 Build()
OLDNEW
« no previous file with comments | « no previous file | preparser/SConscript » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698