#!/usr/bin/python

# Copyright (c) 2010 The ANGLE 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.

# This script is wrapper for ANGLE that adds some support for how GYP
# is invoked by ANGLE beyond what can be done in the gclient hooks.

import os
import sys

script_dir = os.path.dirname(__file__)
angle_dir = os.path.normpath(os.path.join(script_dir, os.pardir))

sys.path.insert(0, os.path.join(angle_dir, 'third_party', 'gyp', 'pylib'))
import gyp

def appendCommonArgs(args):
    # Set the depth to get the top-level Makefile generated into the
    # correct directory. This only has an effect on Linux.
    args.append('--depth');
    args.append('.');
    # Add standalone.gypi to the include path to set required
    # variables that are otherwise picked up from Chromium's gyp
    # files.
    args.append('-I' + os.path.join(script_dir, 'standalone.gypi'))
    # Add common.gypi to the include path.
    args.append('-I' + os.path.join(script_dir, 'common.gypi'))
    args.append('--no-parallel')

def generateProjects(generate_args):
    args = generate_args
    appendCommonArgs(args)
    # Add all.gyp as the main gyp file to be generated.
    args.append(os.path.join(script_dir, 'ANGLE.gyp'))

    gyp.main(args)

def generateWinRTProjects(generate_args, generation_dir, msvs_version, app_type_rev,
                          target_platform_ver):
    args = generate_args
    appendCommonArgs(args)

    args.append('--ignore-environment')
    args.append('--generator-output=' + generation_dir)
    args.append('--format=msvs')
    args.append('-Gmsvs_version=' + msvs_version)
    args.append('-Dangle_use_commit_id=1')
    args.append('-Dangle_build_winrt=1')
    args.append('-Dangle_build_winrt_app_type_revision=' + app_type_rev)
    args.append('-Dangle_build_winrt_target_platform_ver=' + target_platform_ver)
    args.append('-Dangle_enable_d3d9=0')
    args.append('-Dangle_enable_gl=0')
    args.append('-Dangle_enable_vulkan=0')
    args.append('-Dangle_enable_null=0')
    args.append('-Dangle_enable_essl=0')
    args.append('-Dangle_enable_glsl=0')
    # Add all.gyp as the main gyp file to be generated.
    args.append(os.path.join(script_dir, 'ANGLE.gyp'))

    print 'Generating WinRT projects to ' + generation_dir + ' from gyp files...'
    sys.stdout.flush()

    gyp.main(args)

if __name__ == '__main__':
    print 'Updating projects from gyp files...'
    sys.stdout.flush()

    # Generate projects
    args = sys.argv[1:]
    generateProjects(args)

    # Generate WinRT projects only if configured
    if 'GYP_GENERATE_WINRT' in os.environ:
      # Generate Windows 10 projects
      args = sys.argv[1:]
      generateWinRTProjects(args, "winrt/10", "2015", "10.0", "10.0.10240.0");
