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

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 angle_relative_src_path=' + os.path.join('..', '..', 'src')
	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)
