#!/usr/bin/env python
"""Calls `gn` with the right --dotfile= and --root= arguments for LLVM."""

# GN normally expects a file called '.gn' at the root of the repository.
# Since LLVM's GN build isn't supported, putting that file at the root
# is deemed inappropriate, which requires passing --dotfile= and -root= to GN.
# Since that gets old fast, this script automatically passes these arguments.

import os
import subprocess
import sys


THIS_DIR = os.path.dirname(__file__)
ROOT_DIR = os.path.join(THIS_DIR, '..', '..', '..')


def get_platform():
    import platform
    if platform.machine() not in ('AMD64', 'x86_64'):
        return None
    if sys.platform.startswith('linux'):
        return 'linux-amd64'
    if sys.platform == 'darwin':
        return 'mac-amd64'
    if sys.platform == 'win32':
        return 'windows-amd64'


def print_no_gn(mention_get):
    print('gn binary not found in PATH')
    if mention_get:
        print('run llvm/utils/gn/get.py to download a binary and try again, or')
    print('follow https://gn.googlesource.com/gn/#getting-started')
    return 1


def main():
    # Find real gn executable.
    gn = 'gn'
    if subprocess.call('gn --version', stdout=open(os.devnull, 'w'),
                                       stderr=subprocess.STDOUT,
                                       shell=True) != 0:
        # Not on path. See if get.py downloaded a prebuilt binary and run that
        # if it's there, or suggest to run get.py if it isn't.
        platform = get_platform()
        if not platform:
            return print_no_gn(mention_get=False)
        gn = os.path.join(os.path.dirname(__file__), 'bin', platform, 'gn')
        if not os.path.exists(gn + ('.exe' if sys.platform == 'win32' else '')):
            return print_no_gn(mention_get=True)

    # Compute --dotfile= and --root= args to add.
    extra_args = []
    gn_main_arg = next((x for x in sys.argv[1:] if not x.startswith('-')), None)
    if gn_main_arg != 'help':  # `gn help` gets confused by the switches.
        cwd = os.getcwd()
        dotfile = os.path.relpath(os.path.join(THIS_DIR, '.gn'), cwd)
        root = os.path.relpath(ROOT_DIR, cwd)
        extra_args = [ '--dotfile=' + dotfile, '--root=' + root ]

    # Run GN command with --dotfile= and --root= added.
    cmd = [gn] + extra_args + sys.argv[1:]
    sys.exit(subprocess.call(cmd))


if __name__ == '__main__':
    main()
