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
28import sys
29from os.path import join, dirname, abspath
30root_dir = dirname(File('SConstruct').rfile().abspath)
31sys.path.append(join(root_dir, 'tools'))
32import js2c
33Import('context')
34Import('tools')
35Import('d8_env')
36
37
38SOURCES = {
39  'all': Split("""
40    accessors.cc
41    allocation.cc
42    api.cc
43    assembler.cc
44    ast.cc
45    atomicops_internals_x86_gcc.cc
46    bignum.cc
47    bignum-dtoa.cc
48    bootstrapper.cc
49    builtins.cc
50    cached-powers.cc
51    checks.cc
52    circular-queue.cc
53    code-stubs.cc
54    codegen.cc
55    compilation-cache.cc
56    compiler.cc
57    contexts.cc
58    conversions.cc
59    counters.cc
60    cpu-profiler.cc
61    data-flow.cc
62    date.cc
63    dateparser.cc
64    debug-agent.cc
65    debug.cc
66    deoptimizer.cc
67    disassembler.cc
68    diy-fp.cc
69    dtoa.cc
70    elements.cc
71    execution.cc
72    factory.cc
73    flags.cc
74    frames.cc
75    full-codegen.cc
76    func-name-inferrer.cc
77    gdb-jit.cc
78    global-handles.cc
79    fast-dtoa.cc
80    fixed-dtoa.cc
81    handles.cc
82    heap-profiler.cc
83    heap.cc
84    hydrogen.cc
85    hydrogen-instructions.cc
86    ic.cc
87    incremental-marking.cc
88    interface.cc
89    inspector.cc
90    interpreter-irregexp.cc
91    isolate.cc
92    jsregexp.cc
93    lithium-allocator.cc
94    lithium.cc
95    liveedit.cc
96    liveobjectlist.cc
97    log-utils.cc
98    log.cc
99    mark-compact.cc
100    messages.cc
101    objects.cc
102    objects-printer.cc
103    objects-visiting.cc
104    once.cc
105    parser.cc
106    preparser.cc
107    preparse-data.cc
108    profile-generator.cc
109    property.cc
110    regexp-macro-assembler-irregexp.cc
111    regexp-macro-assembler.cc
112    regexp-stack.cc
113    rewriter.cc
114    runtime.cc
115    runtime-profiler.cc
116    safepoint-table.cc
117    scanner.cc
118    scanner-character-streams.cc
119    scopeinfo.cc
120    scopes.cc
121    serialize.cc
122    snapshot-common.cc
123    spaces.cc
124    string-search.cc
125    string-stream.cc
126    strtod.cc
127    stub-cache.cc
128    token.cc
129    type-info.cc
130    unicode.cc
131    utils.cc
132    v8-counters.cc
133    v8.cc
134    v8conversions.cc
135    v8threads.cc
136    v8utils.cc
137    variables.cc
138    version.cc
139    store-buffer.cc
140    zone.cc
141    extensions/gc-extension.cc
142    extensions/externalize-string-extension.cc
143    """),
144  'arch:arm': Split("""
145    arm/builtins-arm.cc
146    arm/code-stubs-arm.cc
147    arm/codegen-arm.cc
148    arm/constants-arm.cc
149    arm/cpu-arm.cc
150    arm/debug-arm.cc
151    arm/deoptimizer-arm.cc
152    arm/disasm-arm.cc
153    arm/frames-arm.cc
154    arm/full-codegen-arm.cc
155    arm/ic-arm.cc
156    arm/lithium-arm.cc
157    arm/lithium-codegen-arm.cc
158    arm/lithium-gap-resolver-arm.cc
159    arm/macro-assembler-arm.cc
160    arm/regexp-macro-assembler-arm.cc
161    arm/stub-cache-arm.cc
162    arm/assembler-arm.cc
163    """),
164  'arch:mips': Split("""
165    mips/assembler-mips.cc
166    mips/builtins-mips.cc
167    mips/code-stubs-mips.cc
168    mips/codegen-mips.cc
169    mips/constants-mips.cc
170    mips/cpu-mips.cc
171    mips/debug-mips.cc
172    mips/deoptimizer-mips.cc
173    mips/disasm-mips.cc
174    mips/frames-mips.cc
175    mips/full-codegen-mips.cc
176    mips/ic-mips.cc
177    mips/lithium-codegen-mips.cc
178    mips/lithium-gap-resolver-mips.cc
179    mips/lithium-mips.cc
180    mips/macro-assembler-mips.cc
181    mips/regexp-macro-assembler-mips.cc
182    mips/stub-cache-mips.cc
183    """),
184  'arch:ia32': Split("""
185    ia32/assembler-ia32.cc
186    ia32/builtins-ia32.cc
187    ia32/code-stubs-ia32.cc
188    ia32/codegen-ia32.cc
189    ia32/cpu-ia32.cc
190    ia32/debug-ia32.cc
191    ia32/deoptimizer-ia32.cc
192    ia32/disasm-ia32.cc
193    ia32/frames-ia32.cc
194    ia32/full-codegen-ia32.cc
195    ia32/ic-ia32.cc
196    ia32/lithium-codegen-ia32.cc
197    ia32/lithium-gap-resolver-ia32.cc
198    ia32/lithium-ia32.cc
199    ia32/macro-assembler-ia32.cc
200    ia32/regexp-macro-assembler-ia32.cc
201    ia32/stub-cache-ia32.cc
202    """),
203  'arch:x64': Split("""
204    x64/assembler-x64.cc
205    x64/builtins-x64.cc
206    x64/code-stubs-x64.cc
207    x64/codegen-x64.cc
208    x64/cpu-x64.cc
209    x64/debug-x64.cc
210    x64/deoptimizer-x64.cc
211    x64/disasm-x64.cc
212    x64/frames-x64.cc
213    x64/full-codegen-x64.cc
214    x64/ic-x64.cc
215    x64/lithium-codegen-x64.cc
216    x64/lithium-gap-resolver-x64.cc
217    x64/lithium-x64.cc
218    x64/macro-assembler-x64.cc
219    x64/regexp-macro-assembler-x64.cc
220    x64/stub-cache-x64.cc
221    """),
222  'simulator:arm': ['arm/simulator-arm.cc'],
223  'simulator:mips': ['mips/simulator-mips.cc'],
224  'os:freebsd': ['platform-freebsd.cc', 'platform-posix.cc'],
225  'os:openbsd': ['platform-openbsd.cc', 'platform-posix.cc'],
226  'os:linux':   ['platform-linux.cc', 'platform-posix.cc'],
227  'os:android': ['platform-linux.cc', 'platform-posix.cc'],
228  'os:macos':   ['platform-macos.cc', 'platform-posix.cc'],
229  'os:solaris': ['platform-solaris.cc', 'platform-posix.cc'],
230  'os:cygwin':  ['platform-cygwin.cc', 'platform-posix.cc'],
231  'os:nullos':  ['platform-nullos.cc'],
232  'os:win32':   ['platform-win32.cc', 'win32-math.cc'],
233  'mode:release': [],
234  'mode:debug': [
235    'objects-debug.cc', 'prettyprinter.cc', 'regexp-macro-assembler-tracer.cc'
236  ]
237}
238
239
240PREPARSER_SOURCES = {
241  'all': Split("""
242    allocation.cc
243    bignum.cc
244    bignum-dtoa.cc
245    cached-powers.cc
246    conversions.cc
247    diy-fp.cc
248    dtoa.cc
249    fast-dtoa.cc
250    fixed-dtoa.cc
251    preparse-data.cc
252    preparser.cc
253    preparser-api.cc
254    scanner.cc
255    strtod.cc
256    token.cc
257    unicode.cc
258    utils.cc
259    """),
260  'os:win32': ['win32-math.cc']
261}
262
263
264D8_LIGHT_FILES = {
265  'all': [
266    'd8.cc'
267  ]
268}
269
270
271D8_FULL_FILES = {
272  'all': [
273    'd8.cc', 'd8-debug.cc'
274  ],
275  'os:linux': [
276    'd8-posix.cc'
277  ],
278  'os:macos': [
279    'd8-posix.cc'
280  ],
281  'os:android': [
282    'd8-posix.cc'
283  ],
284  'os:freebsd': [
285    'd8-posix.cc'
286  ],
287  'os:openbsd': [
288    'd8-posix.cc'
289  ],
290  'os:solaris': [
291    'd8-posix.cc'
292  ],
293  'os:cygwin': [
294    'd8-posix.cc'
295  ],
296  'os:win32': [
297    'd8-windows.cc'
298  ],
299  'os:nullos': [
300    'd8-windows.cc'   # Empty implementation at the moment.
301  ],
302  'console:readline': [
303    'd8-readline.cc'
304  ]
305}
306
307
308LIBRARY_FILES = '''
309runtime.js
310v8natives.js
311array.js
312string.js
313uri.js
314math.js
315messages.js
316apinatives.js
317date.js
318regexp.js
319json.js
320liveedit-debugger.js
321mirror-debugger.js
322debug-debugger.js
323'''.split()
324
325
326EXPERIMENTAL_LIBRARY_FILES = '''
327proxy.js
328collection.js
329'''.split()
330
331
332def Abort(message):
333  print message
334  sys.exit(1)
335
336
337def ConfigureObjectFiles():
338  env = Environment(tools=tools)
339  env.Replace(**context.flags['v8'])
340  context.ApplyEnvOverrides(env)
341  env['BUILDERS']['JS2C'] = Builder(action=js2c.JS2C)
342  env['BUILDERS']['Snapshot'] = Builder(action='$SOURCE $TARGET --logfile "$LOGFILE" --log-snapshot-positions')
343
344  def BuildJS2CEnv(type):
345    js2c_env = { 'TYPE': type, 'COMPRESSION': 'off' }
346    if 'COMPRESS_STARTUP_DATA_BZ2' in env['CPPDEFINES']:
347      js2c_env['COMPRESSION'] = 'bz2'
348    return js2c_env
349
350  # Build the standard platform-independent source files.
351  source_files = context.GetRelevantSources(SOURCES)
352  d8_js = env.JS2C('d8-js.cc', 'd8.js', **{'TYPE': 'D8', 'COMPRESSION': 'off'})
353  d8_js_obj = context.ConfigureObject(env, d8_js, CPPPATH=['.'])
354  if context.options['library'] == 'shared':
355    d8_files = context.GetRelevantSources(D8_LIGHT_FILES)
356    d8_objs = []
357  else:
358    d8_files = context.GetRelevantSources(D8_FULL_FILES)
359    d8_objs = [d8_js_obj]
360  d8_objs.append(context.ConfigureObject(d8_env, [d8_files]))
361
362  # Combine the JavaScript library files into a single C++ file and
363  # compile it.
364  library_files = [s for s in LIBRARY_FILES]
365  library_files.append('macros.py')
366  libraries_src = env.JS2C(
367    ['libraries.cc'], library_files, **BuildJS2CEnv('CORE'))
368  libraries_obj = context.ConfigureObject(env, libraries_src, CPPPATH=['.'])
369
370  # Combine the experimental JavaScript library files into a C++ file
371  # and compile it.
372  experimental_library_files = [ s for s in EXPERIMENTAL_LIBRARY_FILES ]
373  experimental_library_files.append('macros.py')
374  experimental_libraries_src = env.JS2C(['experimental-libraries.cc'],
375                                        experimental_library_files,
376                                        **BuildJS2CEnv('EXPERIMENTAL'))
377  experimental_libraries_obj = context.ConfigureObject(env, experimental_libraries_src, CPPPATH=['.'])
378
379  source_objs = context.ConfigureObject(env, source_files)
380  non_snapshot_files = [source_objs]
381
382  preparser_source_files = context.GetRelevantSources(PREPARSER_SOURCES)
383  preparser_objs = context.ConfigureObject(env, preparser_source_files)
384
385  # Create snapshot if necessary.  For cross compilation you should either
386  # do without snapshots and take the performance hit or you should build a
387  # host VM with the simulator=arm and snapshot=on options and then take the
388  # resulting snapshot.cc file from obj/release and put it in the src
389  # directory.  Then rebuild the VM with the cross compiler and specify
390  # snapshot=nobuild on the scons command line.
391  empty_snapshot_obj = context.ConfigureObject(env, 'snapshot-empty.cc')
392  mksnapshot_env = env.Copy()
393  mksnapshot_env.Replace(**context.flags['mksnapshot'])
394  mksnapshot_src = 'mksnapshot.cc'
395  mksnapshot = mksnapshot_env.Program('mksnapshot', [mksnapshot_src, libraries_obj, experimental_libraries_obj,  non_snapshot_files, empty_snapshot_obj], PDB='mksnapshot.exe.pdb')
396  if context.use_snapshot:
397    if context.build_snapshot:
398      snapshot_cc = env.Snapshot('snapshot.cc', mksnapshot, LOGFILE=File('snapshot.log').abspath)
399    else:
400      snapshot_cc = 'snapshot.cc'
401    snapshot_obj = context.ConfigureObject(env, snapshot_cc, CPPPATH=['.'])
402  else:
403    snapshot_obj = empty_snapshot_obj
404  library_objs = [non_snapshot_files, libraries_obj, experimental_libraries_obj, snapshot_obj]
405  return (library_objs, d8_objs, [mksnapshot], preparser_objs)
406
407
408(library_objs, d8_objs, mksnapshot, preparser_objs) = ConfigureObjectFiles()
409Return('library_objs d8_objs mksnapshot preparser_objs')
410