#!/usr/bin/env python
# Copyright 2013 The Chromium Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import json
import sys

import bb_utils
import bb_annotations

sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
from pylib.constants import host_paths


SLAVE_SCRIPTS_DIR = os.path.join(bb_utils.BB_BUILD_DIR, 'scripts', 'slave')
VALID_HOST_TESTS = set(['check_webview_licenses'])

DIR_BUILD_ROOT = os.path.dirname(host_paths.DIR_SOURCE_ROOT)

# Short hand for RunCmd which is used extensively in this file.
RunCmd = bb_utils.RunCmd


def SrcPath(*path):
  return os.path.join(host_paths.DIR_SOURCE_ROOT, *path)


def CheckWebViewLicenses(_):
  bb_annotations.PrintNamedStep('check_licenses')
  RunCmd([SrcPath('android_webview', 'tools', 'webview_licenses.py'), 'scan'],
         warning_code=1)


def RunHooks(build_type):
  RunCmd([SrcPath('build', 'landmines.py')])
  build_path = SrcPath('out', build_type)
  landmine_path = os.path.join(build_path, '.landmines_triggered')
  clobber_env = os.environ.get('BUILDBOT_CLOBBER')
  if clobber_env or os.path.isfile(landmine_path):
    bb_annotations.PrintNamedStep('Clobber')
    if not clobber_env:
      print 'Clobbering due to triggered landmines:'
      with open(landmine_path) as f:
        print f.read()
    RunCmd(['rm', '-rf', build_path])

  bb_annotations.PrintNamedStep('runhooks')
  RunCmd(['gclient', 'runhooks'], halt_on_failure=True)


def GenerateBuildFiles(options):
  cmd = [SrcPath('tools', 'mb', 'mb.py'),
         'gen',
         '-m', options.build_properties['mastername'],
         '-b', options.build_properties['buildername'],
         '--goma-dir', bb_utils.GOMA_DIR,
         '//out/%s' % options.target]
  bb_annotations.PrintNamedStep('generate_build_files')
  RunCmd(cmd, halt_on_failure=True)


def Compile(options):
  if options.run_mb:
    os.environ['GYP_CHROMIUM_NO_ACTION'] = '1'
    RunHooks(options.target)
    GenerateBuildFiles(options)
  else:
    RunHooks(options.target)

  cmd = [os.path.join(SLAVE_SCRIPTS_DIR, 'compile.py'),
         '--build-tool=ninja',
         '--compiler=goma',
         '--target=%s' % options.target,
         '--goma-dir=%s' % bb_utils.GOMA_DIR]
  bb_annotations.PrintNamedStep('compile')
  if options.build_targets:
    build_targets = options.build_targets.split(',')
    cmd += ['--build-args', ' '.join(build_targets)]
  RunCmd(cmd, halt_on_failure=True, cwd=DIR_BUILD_ROOT)


def ZipBuild(options):
  bb_annotations.PrintNamedStep('zip_build')
  RunCmd([
      os.path.join(SLAVE_SCRIPTS_DIR, 'zip_build.py'),
      '--src-dir', host_paths.DIR_SOURCE_ROOT,
      '--exclude-files', 'lib.target,gen,android_webview,jingle_unittests']
      + bb_utils.EncodeProperties(options), cwd=DIR_BUILD_ROOT)


def ExtractBuild(options):
  bb_annotations.PrintNamedStep('extract_build')
  RunCmd([os.path.join(SLAVE_SCRIPTS_DIR, 'extract_build.py')]
         + bb_utils.EncodeProperties(options), cwd=DIR_BUILD_ROOT)


def BisectPerfRegression(options):
  args = []
  if options.extra_src:
    args = ['--extra_src', options.extra_src]
  RunCmd([SrcPath('tools', 'prepare-bisect-perf-regression.py'),
          '-w', os.path.join(host_paths.DIR_SOURCE_ROOT, os.pardir)])
  RunCmd([SrcPath('tools', 'run-bisect-perf-regression.py'),
          '-w', os.path.join(host_paths.DIR_SOURCE_ROOT, os.pardir),
          '--build-properties=%s' % json.dumps(options.build_properties)] +
          args)


def GetHostStepCmds():
  return [
      ('compile', Compile),
      ('extract_build', ExtractBuild),
      ('check_webview_licenses', CheckWebViewLicenses),
      ('bisect_perf_regression', BisectPerfRegression),
      ('zip_build', ZipBuild)
  ]


def GetHostStepsOptParser():
  parser = bb_utils.GetParser()
  parser.add_option('--steps', help='Comma separated list of host tests.')
  parser.add_option('--build-targets', default='',
                    help='Comma separated list of build targets.')
  parser.add_option('--experimental', action='store_true',
                    help='Indicate whether to compile experimental targets.')
  parser.add_option('--extra_src', default='',
                    help='Path to extra source file. If this is supplied, '
                    'bisect script will use it to override default behavior.')
  parser.add_option('--run-mb', action='store_true',
                    help='Use mb to generate build files.')

  return parser


def main(argv):
  parser = GetHostStepsOptParser()
  options, args = parser.parse_args(argv[1:])
  if args:
    return sys.exit('Unused args %s' % args)

  setattr(options, 'target', options.factory_properties.get('target', 'Debug'))
  setattr(options, 'extra_src',
          options.factory_properties.get('extra_src', ''))

  if options.steps:
    bb_utils.RunSteps(options.steps.split(','), GetHostStepCmds(), options)


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