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