text: #!/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 sys
  
  import bb_utils
  import bb_annotations
  
  sys.path.append(os.path.join(os.path.dirname(__file__), '..'))
  from pylib import constants
  
  
  SLAVE_SCRIPTS_DIR = os.path.join(bb_utils.BB_BUILD_DIR, 'scripts', 'slave')
  VALID_HOST_TESTS = set(['check_webview_licenses', 'findbugs'])
  
  DIR_BUILD_ROOT = os.path.dirname(constants.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(constants.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 Compile(options):
    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', constants.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 FindBugs(options):
    bb_annotations.PrintNamedStep('findbugs')
    build_type = []
    if options.target == 'Release':
      build_type = ['--release-build']
    RunCmd([SrcPath('build', 'android', 'findbugs_diff.py')] + build_type)
    RunCmd([SrcPath(
        'tools', 'android', 'findbugs_plugin', 'test',
        'run_findbugs_plugin_tests.py')] + build_type)
  
  
  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(constants.DIR_SOURCE_ROOT, os.pardir)])
    RunCmd([SrcPath('tools', 'run-bisect-perf-regression.py'),
            '-w', os.path.join(constants.DIR_SOURCE_ROOT, os.pardir)] + args)
  
  
  def GetHostStepCmds():
    return [
        ('compile', Compile),
        ('extract_build', ExtractBuild),
        ('check_webview_licenses', CheckWebViewLicenses),
        ('bisect_perf_regression', BisectPerfRegression),
        ('findbugs', FindBugs),
        ('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.')
  
    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))
  