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