# Licensed to the Apache Software Foundation (ASF) under one or more
# contributor license agreements.  See the NOTICE file distributed with
# this work for additional information regarding copyright ownership.
# The ASF licenses this file to You under the Apache License, Version 2.0
# (the "License"); you may not use this file except in compliance with
# the License.  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

project( gtest VERSION 1.8.1 LANGUAGES NONE )

set( SHA256 927827c183d01734cc5cfef85e0ff3f5a92ffe6188e0d18e909c5efebf28a0c7 )

include(ExternalProject)
ExternalProject_Add( ${PROJECT_NAME}-extern
  URL "https://github.com/google/googletest/archive/release-${PROJECT_VERSION}.zip"
  URL_HASH SHA256=${SHA256}
  CMAKE_ARGS
    -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
    -DCMAKE_CXX_STANDARD=${CMAKE_CXX_STANDARD}
    -DCMAKE_INSTALL_PREFIX=<INSTALL_DIR>
    -DCMAKE_BUILD_TYPE=$<CONFIG>
    -Dgtest_force_shared_crt:BOOL=ON
)

ExternalProject_Get_Property( ${PROJECT_NAME}-extern INSTALL_DIR )

include(GNUInstallDirs)

function(ADD_GTEST_LIBRARY)
  set(options)
  set(oneValueArgs)
  set(multiValueArgs DEPENDENCIES)
  cmake_parse_arguments(PARSE_ARGV 1 args "${options}" "${oneValueArgs}" "${multiValueArgs}")

  set(args_NAME ${ARGV0})

  set(target "GTest_${args_NAME}")

  add_library(${target} INTERFACE)

  target_include_directories(${target} SYSTEM INTERFACE
    $<BUILD_INTERFACE:${INSTALL_DIR}/${CMAKE_INSTALL_INCLUDEDIR}>
  )

  target_link_libraries(${target} INTERFACE
    ${INSTALL_DIR}/${CMAKE_INSTALL_LIBDIR}/${CMAKE_STATIC_LIBRARY_PREFIX}${args_NAME}$<$<CONFIG:Debug>:d>${CMAKE_STATIC_LIBRARY_SUFFIX}
    ${args_DEPENDENCIES}
  )

  add_library(GTest::${args_NAME} ALIAS ${target})

  add_dependencies(${target} ${PROJECT_NAME}-extern)

endfunction()

find_package(Threads REQUIRED)

add_gtest_library(gtest DEPENDENCIES Threads::Threads)
add_gtest_library(gtest_main DEPENDENCIES GTest::gtest)
add_gtest_library(gmock DEPENDENCIES GTest::gtest)
add_gtest_library(gmock_main DEPENDENCIES GTest::gmock)
