#!/usr/bin/env python3
# Copyright (c) 2017, the R8 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.

import utils

import optparse
import sys
import toolhelper

def ParseOptions(argv):
  parser = optparse.OptionParser(usage='%prog [options] -- [D8 options]')
  parser.add_option(
      '-c',
      '--commit-hash',
      '--commit_hash',
      help='Commit hash of D8 to use.',
      default=None)
  parser.add_option(
    '--print-runtimeraw', '--print_runtimeraw',
    metavar='BENCHMARKNAME',
    help='Print the line \'<BENCHMARKNAME>(RunTimeRaw):' +
         ' <elapsed> ms\' at the end where <elapsed> is' +
         ' the elapsed time in milliseconds.')
  parser.add_option(
      '--version',
      help='Version of D8 to use.',
      default=None)
  parser.add_option(
      '--tag',
      help='Tag of D8 to use.',
      default=None)
  return parser.parse_args(argv)

def main(argv):
  (options, args) = ParseOptions(sys.argv)
  d8_args = args[1:]
  time_consumer = lambda duration : print_duration(duration, options)
  return toolhelper.run(
      'd8',
      d8_args,
      jar=utils.find_r8_jar_from_options(options),
      main='com.android.tools.r8.D8',
      time_consumer=time_consumer)

def print_duration(duration, options):
  benchmark_name = options.print_runtimeraw
  if benchmark_name:
    print('%s-Total(RunTimeRaw): %s ms' % (benchmark_name, duration))

if __name__ == '__main__':
  sys.exit(main(sys.argv[1:]))
