#!/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.

from os.path import join
from glob import glob
from itertools import chain
from stat import S_IRWXU
import argparse
import multiprocessing
import os
import re
import sys

import gradle
import utils
import utils_aosp

J_DEFAULT = multiprocessing.cpu_count() - 2

EXIT_FAILURE = 1

def parse_arguments():
  parser = argparse.ArgumentParser(
      description = 'Checkout the AOSP source tree.')
  utils_aosp.add_common_arguments(parser)
  parser.add_argument('--tool',
      choices = ['d8', 'r8', 'default'],
      default = 'd8',
      help='Compiler tool to use. Defaults to d8.')
  parser.add_argument('--mmm',
      action = 'store_true',
      help='Use mmm instead of make')
  parser.add_argument('--mmma',
      action = 'store_true',
      help='Use mmma instead of make')
  parser.add_argument('--show-commands',
      action = 'store_true',
      help='Show commands executed during build.')
  parser.add_argument('-j',
      help='Projects to fetch simultaneously. ' +
      'Defaults to ' + str(J_DEFAULT) + '.',
      type=int,
      default=-1)
  parser.add_argument('target', nargs='?')
  return parser.parse_args()

def build_aosp(aosp_root, lunch, make, tool,
               concurrency, target, show_commands):
  d8_option = 'USE_D8=false'
  if tool == 'd8' or tool == 'r8' :
    d8_option = 'USE_D8=true'

  r8_option = 'USE_R8=false'
  if tool == 'r8':
    r8_option = 'USE_R8=true'

  j_option = '-j'
  if concurrency > 0:
    j_option += str(concurrency)

  command = [make, j_option]
  if show_commands:
    command.append('showcommands')
  command.extend([d8_option, r8_option])
  if target:
    command.append(target)

  print 'Building using: ' + ' '.join(command)
  utils_aosp.run_through_aosp_helper(lunch, command, aosp_root)

def Main():
  args = parse_arguments()

  make = 'm'
  if args.mmm:
    make = 'mmm'
  if args.mmma:
    make = 'mmma'
  build_aosp(args.aosp_root, args.lunch, make, args.tool,
             args.j, args.target, args.show_commands)

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