Chromium Code Reviews| Index: runtime/tools/create_snapshot_bin.py |
| diff --git a/runtime/tools/create_snapshot_bin.py b/runtime/tools/create_snapshot_bin.py |
| new file mode 100755 |
| index 0000000000000000000000000000000000000000..37413eff282b56cc96b5e9016922e2522e229986 |
| --- /dev/null |
| +++ b/runtime/tools/create_snapshot_bin.py |
| @@ -0,0 +1,192 @@ |
| +#!/usr/bin/env python |
| +# |
| +# Copyright (c) 2011, the Dart project authors. Please see the AUTHORS file |
| +# for details. All rights reserved. Use of this source code is governed by a |
| +# BSD-style license that can be found in the LICENSE file. |
| + |
| +# Script to create snapshot bin file. |
| + |
| +import getopt |
| +import optparse |
| +import os |
| +from os.path import abspath, basename, dirname, join |
| +import string |
| +import subprocess |
| +import sys |
| +import tempfile |
| +import utils |
| + |
| + |
| +HOST_OS = utils.GuessOS() |
| +HOST_CPUS = utils.GuessCpus() |
| + |
| + |
| +def BuildOptions(): |
| + result = optparse.OptionParser() |
| + result.add_option("--executable", |
| + action="store", type="string", |
| + help="path to snapshot generator executable") |
| + result.add_option("--output_bin", |
| + action="store", type="string", |
| + help="output file name into which snapshot in binary form is generated") |
| + result.add_option("--script", |
| + action="store", type="string", |
| + help="Dart script for which snapshot is to be generated") |
| + result.add_option("--url_mapping", |
| + default=[], |
| + action="append", |
| + help="mapping from url to file name, used when generating snapshots") |
| + result.add_option("-v", "--verbose", |
| + help='Verbose output.', |
| + default=False, action="store_true") |
| + result.add_option("--target_os", |
| + action="store", type="string", |
| + help="Which os to run the executable on") |
| + return result |
| + |
| + |
|
Emily Fortuna
2012/08/08 01:28:37
extra newline here and a few other places?
Emily Fortuna
2012/08/08 01:33:47
edit: I see you're following the format from creat
jackpal
2012/08/08 23:06:45
Done.
|
| +def ProcessOptions(options): |
| + if not options.executable: |
| + sys.stderr.write('--executable not specified\n') |
| + return False |
| + if not options.output_bin: |
| + sys.stderr.write('--output_bin not specified\n') |
| + return False |
| + return True |
| + |
| + |
| +def makeString(input_file): |
| + result = ' ' |
| + fileHandle = open(input_file, 'rb') |
| + lineCounter = 0 |
| + for byte in fileHandle.read(): |
| + result += ' %d,' % ord(byte) |
| + lineCounter += 1 |
| + if lineCounter == 10: |
| + result += '\n ' |
| + lineCounter = 0 |
| + if lineCounter != 0: |
| + result += '\n ' |
| + return result |
| + |
| +def runHost(command): |
| + print "command %s" % command |
| + pipe = subprocess.Popen(args=command, |
| + shell=True, |
| + stdout=subprocess.PIPE, |
| + stderr=subprocess.PIPE) |
| + out, error = pipe.communicate() |
| + if (pipe.returncode != 0): |
| + print out, error |
| + print "command failed" |
| + print "(Command was: '", ' '.join(command), "')" |
| + raise Exception("Failed") |
| + |
| +def runTarget(command): |
| + runHost("adb shell %s" % command) |
| + |
| +def runOnAndroid(options): |
| + outputBin = options.output_bin |
| + |
| + android_workspace = os.getenv("ANDROID_DART", "/data/local/dart") |
| + android_outputBin = join(android_workspace, basename(outputBin)) |
| + |
| + executable = options.executable |
| + android_executable = join(android_workspace, basename(executable)) |
| + |
| + filesToPush = [] # (src, dest) |
| + filesToPull = [] # (src, dest) |
| + |
| + # Setup arguments to the snapshot generator binary. |
| + |
|
Emily Fortuna
2012/08/08 01:33:47
okay this seems like random newlines...?
jackpal
2012/08/08 23:06:45
Done.
|
| + |
| + script_args = [android_executable] |
| + |
| + # First setup the snapshot output filename. |
| + filesToPull.append((android_outputBin, outputBin)) |
| + script_args.append(''.join([ "--snapshot=", android_outputBin])) |
| + |
| + # Next setup all url mapping options specified. |
| + for url_arg in options.url_mapping: |
| + android_url_arg = join(android_workspace, basename(url_arg)) |
| + filesToPush.push((url_arg, android_url_arg)) |
| + url_mapping_argument = ''.join(["--url_mapping=", url_arg ]) |
| + script_args.append(url_mapping_argument) |
| + |
| + # Finally append the script name if one is specified. |
| + if options.script: |
| + android_script_name = join(android_workspace, basename(options.script)) |
| + filesToPush.append((options.script, android_script_name)) |
| + script_args.append(android_script_name) |
| + |
| + filesToPush.append((executable, android_executable)) |
| + |
| + command = ' '.join(script_args) |
| + |
| + runHost("adb shell mkdir %s" % android_workspace) |
| + try: |
| + for src, dest in filesToPush: |
| + runHost("adb push '%s' '%s'" % (src, dest)) |
| + runTarget(command) |
| + for src, dest in filesToPull: |
| + runHost("adb pull '%s' '%s'" % (src, dest)) |
| + finally: |
| + for src, dest in filesToPush: |
| + runHost("adb shell rm '%s'" % dest) |
| + for src, dest in filesToPull: |
| + runHost("adb shell rm '%s'" % src) |
| + |
| +def Main(): |
| + # Parse options. |
| + parser = BuildOptions() |
| + (options, args) = parser.parse_args() |
| + if not ProcessOptions(options): |
| + parser.print_help() |
| + return 1 |
| + |
| + # If there are additional arguments, report error and exit. |
| + if args: |
| + parser.print_help() |
| + return 1 |
| + |
| + # Setup arguments to the snapshot generator binary. |
| + script_args = [] |
| + |
| + # First setup the snapshot output filename. |
| + script_args.append(''.join([ "--snapshot=", options.output_bin ])) |
| + |
| + # Next setup all url mapping options specified. |
| + for url_arg in options.url_mapping: |
| + url_mapping_argument = ''.join(["--url_mapping=", url_arg ]) |
| + script_args.append(url_mapping_argument) |
| + |
| + # Finally append the script name if one is specified. |
| + if options.script: |
| + script_args.append(options.script) |
| + |
| + # Construct command line to execute the snapshot generator binary and invoke. |
| + command = [ options.executable ] + script_args |
| + if options.verbose: |
| + print ' '.join(command) |
| + |
| + if options.target_os == 'android': |
| + try: |
| + runOnAndroid(options) |
| + except Exception as e: |
| + print "Could not run on Android: %s" % e |
| + return -1 |
| + else: |
| + pipe = subprocess.Popen(command, |
| + stdout=subprocess.PIPE, |
| + stderr=subprocess.PIPE) |
| + out, error = pipe.communicate() |
| + if (pipe.returncode != 0): |
| + print out, error |
| + print "Snapshot generation failed" |
| + print "(Command was: '", ' '.join(command), "')" |
| + return -1 |
| + |
| + return 0 |
| + |
| +if __name__ == '__main__': |
| + sys.exit(Main()) |