# -*- mode: python; python-indent-offset: 4; indent-tabs-mode: nil -*-
##
# 'googletest' script to check if Google Unit Test library is installed.
# If not, get it and install it
#
##

import os
import shutil

Import('env')

gtest_env = env.Clone()
target_os = gtest_env.get('TARGET_OS')
src_dir = gtest_env.get('SRC_DIR')

targets_need_gtest = ['darwin','linux', 'msys_nt', 'windows']
gtest_dir      = os.path.join(src_dir, 'extlibs', 'gtest', 'googletest-release-1.7.0')
gtest_lib_dir = os.path.join(gtest_dir,'lib')
gtest_dotlib_dir =  os.path.join(gtest_lib_dir, '.libs')
gtest_zip_file = os.path.join(src_dir, 'extlibs', 'gtest', 'release-1.7.0.zip')
gtest_url = 'https://github.com/google/googletest/archive/release-1.7.0.zip'

if target_os in targets_need_gtest:
	print '*** Checking for installation of google unit test 1.7.0 ***'
	if not os.path.exists(os.path.join(gtest_dir, 'CMakeLists.txt')):
		# If the gtest zip file is not already present, download it
		if not os.path.exists(gtest_zip_file):
			gtest_zip = gtest_env.Download(gtest_zip_file, gtest_url)
		else:
			gtest_zip = gtest_zip_file
		print 'Unzipping to : ' + gtest_dir
		gtest_env.UnpackAll(gtest_dir, gtest_zip)

if target_os in ['linux']:
	if os.path.exists(gtest_dir):
		if not os.path.exists(gtest_lib_dir):
			# Run configure on gtest
			print 'Configuring google unit test'
			reconfigure_ran = gtest_env.Configure(gtest_dir, 'autoreconf -i')
			if env.get('CROSS_COMPILE'):
				configure_ran = env.Configure(gtest_dir, './configure --disable-shared --host=' + env['CROSS_COMPILE'])
				gtest_env.Depends(configure_ran, reconfigure_ran)
			else:
				configure_ran = env.Configure(gtest_dir, './configure --disable-shared')
				gtest_env.Depends(configure_ran, reconfigure_ran)
			# Run make on gtest
			print 'Making google unit test'
			make_ran = gtest_env.Configure(gtest_dir, 'make')
			gtest_env.Depends(make_ran, configure_ran)

elif target_os in ['darwin', 'msys_nt']:
	if os.path.exists(gtest_dir):
		if not os.path.exists(gtest_lib_dir):
			# Create lib dir
			os.mkdir(gtest_lib_dir)
			os.mkdir(gtest_dotlib_dir)

			# Run configure on gtest
			print 'Configuring google unit test for compilation'
			gtest_env.Configure(gtest_dir, 'cmake -G "Unix Makefiles" .')

			# Run make on gtest
			print 'Making google unit test'
			gtest_env.Configure(gtest_dir, 'make')

			print 'Moving libraries to lib folder'
			gtest_env.Configure(gtest_dir, 'cp libgtest.a lib')
			gtest_env.Configure(gtest_dir, 'mv libgtest.a lib/.libs')
			gtest_env.Configure(gtest_dir, 'cp libgtest_main.a lib')
			gtest_env.Configure(gtest_dir, 'mv libgtest_main.a lib/.libs')

elif target_os in ['windows']:
	# Avoid building the same StaticLibrary in more than one environment, by using the
	# IOTIVITY_GTEST_HAS_BEEN_BUILT environment variable
	if 'IOTIVITY_GTEST_HAS_BEEN_BUILT' not in env:
		gtest_env.AppendUnique(CPPPATH = [ gtest_dir ])
		gtest_build_env = gtest_env.Clone()
		gtest_build_env.AppendUnique(CPPPATH = [ os.path.join(gtest_dir, 'include') ])
		gtest_build_env.AppendUnique(CXXFLAGS = ['/EHsc'])
		gtest_build_env.AppendUnique(CCFLAGS = ['/W4', '/WX'])
		gtest = gtest_build_env.StaticLibrary(target = 'gtest', source = [ '%s/src/gtest-all.cc' % gtest_dir ])
		gtest_main = gtest_build_env.StaticLibrary(target = 'gtest_main', source = [ '%s/src/gtest_main.cc' % gtest_dir ])
		gtest_env.InstallTarget(gtest, 'gtest')
		gtest_env.InstallTarget(gtest_main, 'gtest_main')

		vars = Variables();
		vars.AddVariables(('IOTIVITY_GTEST_HAS_BEEN_BUILT', '', '1'))
		vars.Update(env)

# Export flags once for all
if target_os in targets_need_gtest:
	gtest_env.AppendUnique(LIBPATH = [gtest_dotlib_dir])
	gtest_env.PrependUnique(CPPPATH = [os.path.join(gtest_dir, 'include')])
	gtest_env.AppendENVPath('LD_LIBRARY_PATH', gtest_dotlib_dir)
	if 'g++' in gtest_env.get('CXX'):
		gtest_env.AppendUnique(CXXFLAGS = ['-std=c++0x'])
		gtest_env.AppendUnique(CXXFLAGS = ['-Wall'])
# Note: 'pthread' for android is in bionic 
# On other platform, if use new gcc(>4.9?) it isn't required, otherwise, it's required
		if target_os not in ['android']:
			gtest_env.AppendUnique(CXXFLAGS = ['-pthread'])
			gtest_env.PrependUnique(LIBS = ['pthread'])
	gtest_env.PrependUnique(LIBS = ['gtest', 'gtest_main'])
	if target_os in ['windows']:
		gtest_env.AppendUnique(LINKFLAGS = ['/subsystem:CONSOLE'])


Return('gtest_env')
