| #!/usr/bin/env python3 |
| # |
| # Copyright (c) 2012, 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 basename, join |
| import sys |
| import utils |
| |
| |
| def BuildOptions(): |
| result = optparse.OptionParser() |
| result.add_option( |
| "--executable", |
| action="store", |
| type="string", |
| help="path to snapshot generator executable") |
| result.add_option( |
| "--snapshot_kind", |
| action="store", |
| type="string", |
| help="kind of snapshot to generate", |
| default="core") |
| result.add_option( |
| "--vm_flag", |
| action="append", |
| type="string", |
| default=[], |
| help="pass additional Dart VM flag") |
| result.add_option( |
| "--vm_output_bin", |
| action="store", |
| type="string", |
| help="output file name into which vm isolate snapshot in binary form " + |
| "is generated") |
| result.add_option( |
| "--vm_instructions_output_bin", |
| action="store", |
| type="string", |
| help="output file name into which vm isolate snapshot in binary form " + |
| "is generated") |
| result.add_option( |
| "--isolate_output_bin", |
| action="store", |
| type="string", |
| help="output file name into which isolate snapshot in binary form " + |
| "is generated") |
| result.add_option( |
| "--isolate_instructions_output_bin", |
| action="store", |
| type="string", |
| help="output file name into which isolate 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( |
| "--packages", |
| action="store", |
| type="string", |
| help="package config file used to reasolve package: imports.") |
| result.add_option( |
| "-v", |
| "--verbose", |
| help='Verbose output.', |
| default=False, |
| action="store_true") |
| result.add_option( |
| "--timestamp_file", |
| action="store", |
| type="string", |
| help="Path to timestamp file that will be written", |
| default="") |
| return result |
| |
| |
| def ProcessOptions(options): |
| if not options.executable: |
| sys.stderr.write('--executable not specified\n') |
| return False |
| if not options.snapshot_kind: |
| sys.stderr.write('--snapshot_kind not specified\n') |
| return False |
| if not options.vm_output_bin: |
| sys.stderr.write('--vm_output_bin not specified\n') |
| return False |
| if not options.isolate_output_bin: |
| sys.stderr.write('--isolate_output_bin not specified\n') |
| return False |
| if (options.snapshot_kind == 'core-jit' and |
| not options.vm_instructions_output_bin): |
| sys.stderr.write('--vm_instructions_output_bin not specified\n') |
| return False |
| if (options.snapshot_kind == 'core-jit' and |
| not options.isolate_instructions_output_bin): |
| sys.stderr.write('--isolate_instructions_output_bin not specified\n') |
| return False |
| return True |
| |
| |
| def CreateTimestampFile(options): |
| if options.timestamp_file != '': |
| dir_name = os.path.dirname(options.timestamp_file) |
| if not os.path.exists(dir_name): |
| os.mkdir(dir_name) |
| open(options.timestamp_file, 'w').close() |
| |
| |
| 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 = ["--ignore_unrecognized_flags"] |
| |
| for flag in options.vm_flag: |
| script_args.append(flag) |
| |
| # Pass along the packages if there is one. |
| if options.packages: |
| script_args.append(''.join(["--packages=", options.packages])) |
| |
| # First setup the vm isolate and regular isolate snapshot output filename. |
| script_args.append(''.join(["--snapshot_kind=", options.snapshot_kind])) |
| script_args.append(''.join(["--vm_snapshot_data=", options.vm_output_bin])) |
| script_args.append(''.join( |
| ["--isolate_snapshot_data=", options.isolate_output_bin])) |
| |
| if options.vm_instructions_output_bin != None: |
| script_args.append(''.join( |
| ["--vm_snapshot_instructions=", |
| options.vm_instructions_output_bin])) |
| if options.isolate_instructions_output_bin != None: |
| script_args.append(''.join([ |
| "--isolate_snapshot_instructions=", |
| options.isolate_instructions_output_bin |
| ])) |
| |
| # 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 |
| try: |
| utils.RunCommand( |
| command, |
| outStream=sys.stderr, |
| errStream=sys.stderr, |
| verbose=options.verbose, |
| printErrorInfo=True) |
| except Exception as e: |
| return -1 |
| |
| # Success, update timestamp file. |
| CreateTimestampFile(options) |
| |
| return 0 |
| |
| |
| if __name__ == '__main__': |
| sys.exit(Main()) |