#!/usr/bin/python

# Copyright (c) 2013 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 regenerates the canonical visual studio project files that
# are distributed with the ANGLE repository. It requires that depot_tools
# is installed and gclient sync has been run to download gyp. The project
# files are generated and then git added so they can be committed.

import os
import sys

script_dir = os.path.join(os.path.dirname(__file__), 'build')
angle_dir = os.path.normpath(os.path.join(script_dir, os.pardir))
gyp_dir = os.path.join(angle_dir, 'third_party', 'gyp')

generation_dir = "projects"
gyp_generators = "msvs"
msvs_version = "2010e"
build_samples = True
build_tests = False
release_symbols = False

if __name__ == '__main__':
    gyp_cmd = os.path.join(gyp_dir, 'gyp')
    gyp_cmd += ' --ignore-environment'
    gyp_cmd += ' --depth=.'
    gyp_cmd += ' --include=' + os.path.join(script_dir, 'common.gypi')
    gyp_cmd += ' --generator-output=' + generation_dir
    gyp_cmd += ' --format=' + gyp_generators
    gyp_cmd += ' -G msvs_version=' + msvs_version
    gyp_cmd += ' -D angle_build_tests=' + ('1' if build_tests else '0')
    gyp_cmd += ' -D angle_build_samples=' + ('1' if build_samples else '0')
    gyp_cmd += ' -D release_symbols=' + ('true' if release_symbols else 'false')
    gyp_cmd += ' -D angle_use_commit_id=0'
    gyp_cmd += ' ' + os.path.join(script_dir, 'all.gyp')

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

    git_add_cmd = 'git add ' + generation_dir + ' -u'
    print '\nRunning git add on updated Visual Studio projects...'
    print git_add_cmd
    sys.stdout.flush()
    os.system(git_add_cmd)
