find_package(Threads REQUIRED)
include(ExternalProject)

if(MSYS OR MINGW)
  set(DISABLE_PTHREADS ON)
else()
  set(DISABLE_PTHREADS OFF)
endif()

if (MSVC)
  set(RELEASE_LIB_DIR ReleaseLibs)
  set(DEBUG_LIB_DIR DebugLibs)
elseif(XCODE_VERSION)
  set(RELEASE_LIB_DIR Release)
  set(DEBUG_LIB_DIR Debug)
else()
  set(RELEASE_LIB_DIR "")
  set(DEBUG_LIB_DIR "")
endif()

set(GTEST_CMAKE_ARGS
  "-DCMAKE_BUILD_TYPE=${CMAKE_BUILD_TYPE}"
  "-Dgtest_force_shared_crt=ON"
  "-Dgtest_disable_pthreads:BOOL=${DISABLE_PTHREADS}"
  "-DBUILD_GTEST=ON")
set(GTEST_RELEASE_LIB_DIR "")
set(GTEST_DEBUGLIB_DIR "")
if (MSVC)
  set(GTEST_CMAKE_ARGS ${GTEST_CMAKE_ARGS}
    "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_DEBUG:PATH=${DEBUG_LIB_DIR}"
    "-DCMAKE_ARCHIVE_OUTPUT_DIRECTORY_RELEASE:PATH=${RELEASE_LIB_DIR}")
  set(GTEST_LIB_DIR)
endif()

set(GTEST_PREFIX "${CMAKE_CURRENT_BINARY_DIR}/gtest")

# try to find git - if found, setup gtest
find_package(Git)
if(NOT GIT_FOUND)
  set(AddGTest_FOUND false CACHE BOOL "Was gtest setup correctly?")
else(NOT GIT_FOUND)
  set(AddGTest_FOUND true CACHE BOOL "Was gtest setup correctly?")

  ExternalProject_Add(gtest
    GIT_REPOSITORY https://github.com/google/googletest.git
    TIMEOUT 10
    PREFIX "${GTEST_PREFIX}"
    CMAKE_ARGS "${GTEST_CMAKE_ARGS}"
    LOG_DOWNLOAD ON
    LOG_CONFIGURE ON
    LOG_BUILD ON
    # Disable install
    INSTALL_COMMAND ""
  )

  set(LIB_PREFIX "${CMAKE_STATIC_LIBRARY_PREFIX}")
  set(LIB_SUFFIX "${CMAKE_STATIC_LIBRARY_SUFFIX}")
  set(GTEST_LOCATION "${GTEST_PREFIX}/src/gtest-build")
  set(GTEST_DEBUG_LIBRARIES
    "${LIB_PREFIX}gtest${LIB_SUFFIX}"
    "${CMAKE_THREAD_LIBS_INIT}")
  SET(GTEST_RELEASE_LIBRARIES
    "${LIB_PREFIX}gtest${LIB_SUFFIX}"
    "${CMAKE_THREAD_LIBS_INIT}")

  if(MSVC_VERSION EQUAL 1700)
    add_definitions(-D_VARIADIC_MAX=10)
  endif()

  ExternalProject_Get_Property(gtest source_dir)
  include_directories(${source_dir}/googletest/include)
  include_directories(${source_dir}/gtest/include)

  ExternalProject_Get_Property(gtest binary_dir)
  link_directories(${binary_dir}/googlemock/gtest)
  link_directories(${binary_dir}/googlemock/gtest/${RELEASE_LIB_DIR})
  link_directories(${binary_dir}/googlemock/gtest/${DEBUG_LIB_DIR})
endif(NOT GIT_FOUND)