#!/usr/bin/env python
# Copyright 2016 The Dart 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.

import argparse
import os
import subprocess
import sys
import utils

HOST_OS = utils.GuessOS()
SCRIPT_DIR = os.path.dirname(sys.argv[0])
DART_ROOT = os.path.realpath(os.path.join(SCRIPT_DIR, '..'))
DART_DISABLE_BUILDFILES = "DART_DISABLE_BUILDFILES"


def DisableBuildfiles():
  return DART_DISABLE_BUILDFILES in os.environ


def Execute(args):
  process = subprocess.Popen(args, cwd=DART_ROOT)
  process.wait()
  return process.returncode


def RunAndroidGn(options):
  if not HOST_OS in ['linux', 'macos']:
    return 0
  gn_command = [
    'python',
    os.path.join(DART_ROOT, 'tools', 'gn.py'),
    '-m', 'all',
    '-a', 'arm,arm64',
    '--os', 'android',
  ]
  if options.verbose:
    gn_command.append('-v')
    print ' '.join(gn_command)
  return Execute(gn_command)


def RunCrossGn(options):
  if HOST_OS != 'linux':
    return 0
  gn_command = [
    'python',
    os.path.join(DART_ROOT, 'tools', 'gn.py'),
    '-m', 'all',
    '-a', 'arm,armsimdbc,arm64,armsimdbc64',
  ]
  if options.verbose:
    gn_command.append('-v')
    print ' '.join(gn_command)
  return Execute(gn_command)


def RunHostGn(options):
  gn_command = [
    'python',
    os.path.join(DART_ROOT, 'tools', 'gn.py'),
    '-m', 'all',
    '-a', 'all',
  ]
  if options.verbose:
    gn_command.append('-v')
    print ' '.join(gn_command)
  return Execute(gn_command)


def RunGn(options):
  status = RunHostGn(options)
  if status != 0:
    return status
  status = RunCrossGn(options)
  if status != 0:
    return status
  return RunAndroidGn(options)


def ParseArgs(args):
  args = args[1:]
  parser = argparse.ArgumentParser(
      description="A script to generate Dart's build files.")

  parser.add_argument("-v", "--verbose",
      help='Verbose output.',
      default=False,
      action="store_true")

  return parser.parse_args(args)


def main(argv):
  # Check the environment and become a no-op if directed.
  if DisableBuildfiles():
    return 0
  options = ParseArgs(argv)
  RunGn(options)


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