#!/usr/bin/env python
#
# Copyright (c) 2013 The WebRTC project authors. All Rights Reserved.
#
# Use of this source code is governed by a BSD-style license
# that can be found in the LICENSE file in the root of the source
# tree. An additional intellectual property rights grant can be found
# in the file PATENTS.  All contributing project authors may
# be found in the AUTHORS file in the root of the source tree.


"""Builds the WebRTC Video Demo for Android.

This script is designed as an annotation script to be run by a Chrome Buildbot.

PREREQUISITES: You must have built WebRTC with the right environment set (the
one you get when sourcing build/android/envsetup.sh) before building with this
script.

NOTICE: To build successfully, you have to have Ant installed and have your
.gclient file setup with the target_os = ["android"] variable appended to the
last line of your WebRTC solution, so it looks like this:
];target_os = ["android"]
Then run 'gclient sync' to sync out the required Android SDK and NDK files into
the third_party directory.
If you want to get additional platform-specific dependencies in the same
checkout, add them to the list too, e.g. target_os = ["android", "unix"].
"""

import optparse
import os
import subprocess
import sys

_CURRENT_DIR = os.path.abspath(os.path.dirname(__file__))
_ROOT_DIR = os.path.abspath(os.path.join(_CURRENT_DIR, '..', '..', '..', '..'))
_ANDROID_ENV_SCRIPT = os.path.join(_ROOT_DIR, 'build', 'android', 'envsetup.sh')

def main():
  parser = optparse.OptionParser('usage: %prog -t <target> -a <arch>')

  parser.add_option('-t', '--target', default='debug',
                    help='Compile target (debug/release). Default: %default')
  parser.add_option('-a', '--arch', type='choice', choices=['arm', 'ia32'],
                    help='Compile arch (arm/ia32).')
  # Build and factory properties are currently unused but are required to avoid
  # errors when the script is executed by the buildbots.
  parser.add_option('--build-properties', help='Build properties (unused)')
  parser.add_option('--factory-properties', help='Factory properties (unused)')
  options, _args = parser.parse_args()

  if options.arch.lower() == 'ia32':
    target_arch = 'x86'
    app_abi = 'x86'
  elif options.arch.lower() == 'arm':
    target_arch = 'arm'
    app_abi = 'armeabi-v7a'
  else:
    print 'Unsupported target platform'
    raise

  def RunInAndroidEnv(cmd):
    return 'source %s --target-arch=%s && %s' % (_ANDROID_ENV_SCRIPT,
                                                 target_arch, cmd)

  print '@@@BUILD_STEP ndk-build@@@'
  cmd = RunInAndroidEnv('ndk-build APP_ABI=%s' % app_abi)
  print cmd
  try:
    subprocess.check_call(cmd, cwd=_CURRENT_DIR, executable='/bin/bash',
                          shell=True)
  except subprocess.CalledProcessError as e:
    print 'NDK build failed: %s' % e
    print '@@@STEP_FAILURE@@@'
    return 1

  print '@@@BUILD_STEP ant-build@@@'
  cmd = RunInAndroidEnv('ant %s' % options.target.lower())
  print cmd
  try:
    subprocess.check_call(cmd, cwd=_CURRENT_DIR, executable='/bin/bash',
                          shell=True)
  except subprocess.CalledProcessError as e:
    print 'Ant build failed: %s' % e
    print '@@@STEP_FAILURE@@@'
    return 2

  print 'WebRTC Demo build completed.'
  return 0

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