Home | History | Annotate | Download | only in src
      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 sys
     29 from os.path import join, dirname, abspath
     30 root_dir = dirname(File('SConstruct').rfile().abspath)
     31 sys.path.append(join(root_dir, 'tools'))
     32 import js2c
     33 Import('context')
     34 Import('tools')
     35 Import('d8_env')
     36 
     37 
     38 SOURCES = {
     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 
    240 PREPARSER_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 
    264 D8_LIGHT_FILES = {
    265   'all': [
    266     'd8.cc'
    267   ]
    268 }
    269 
    270 
    271 D8_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 
    308 LIBRARY_FILES = '''
    309 runtime.js
    310 v8natives.js
    311 array.js
    312 string.js
    313 uri.js
    314 math.js
    315 messages.js
    316 apinatives.js
    317 date.js
    318 regexp.js
    319 json.js
    320 liveedit-debugger.js
    321 mirror-debugger.js
    322 debug-debugger.js
    323 '''.split()
    324 
    325 
    326 EXPERIMENTAL_LIBRARY_FILES = '''
    327 proxy.js
    328 collection.js
    329 '''.split()
    330 
    331 
    332 def Abort(message):
    333   print message
    334   sys.exit(1)
    335 
    336 
    337 def 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()
    409 Return('library_objs d8_objs mksnapshot preparser_objs')
    410