# Copyright (c) Huawei Technologies Co., Ltd. 2025-2025. All rights reserved.
# MemCache_Hybrid is licensed under Mulan PSL v2.
# You can use this software according to the terms and conditions of the Mulan PSL v2.
# You may obtain a copy of Mulan PSL v2 at:
#          http://license.coscl.org.cn/MulanPSL2
# THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
# EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
# MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
# See the Mulan PSL v2 for more details.

include(ExternalProject)
set(THIRD_PARTY_DIR ${PROJECT_SOURCE_DIR}/test/3rdparty)
set(INSTALL_DIR ${PROJECT_3RDPARTY_BIN_DIR}/googletest)
set(MOCKCPP_INSTALL_DIR ${PROJECT_3RDPARTY_BIN_DIR}/mockcpp)


set(CHECK_FILE_LINKS ${INSTALL_DIR}/include/gtest/gtest.h)
find_program(NINJA_EXE NAMES ninja)
set(GENERATOR "Unix Makefiles")
if(NINJA_EXE)
    set(MAKE_CMD ninja)
    set(GENERATOR "Ninja")
else()
    set(MAKE_CMD make)
endif()
message("-- googletest: will build it")
set(THIRD_PARTY_CMAKE_ARGS
        -G "${GENERATOR}"
        -DCMAKE_C_COMPILER=gcc
        -DCMAKE_CXX_COMPILER=g++
        -DCMAKE_C_FLAGS=${CMAKE_C_FLAGS}
        -DCMAKE_C_FLAGS_RELEASE=${CMAKE_C_FLAGS_RELEASE}
        -DCMAKE_C_FLAGS_DEBUG=${CMAKE_C_FLAGS_DEBUG}
        -DCMAKE_CXX_FLAGS=${CMAKE_CXX_FLAGS}
        -DCMAKE_CXX_FLAGS_RELEASE=${CMAKE_CXX_FLAGS_RELEASE}
        -DCMAKE_CXX_FLAGS_DEBUG=${CMAKE_CXX_FLAGS_DEBUG}
        -DCMAKE_BUILD_TYPE=RELEASE
        -DCMAKE_INSTALL_LIBDIR=${INSTALL_DIR}/lib
        -DCMAKE_INSTALL_BINDIR=${INSTALL_DIR}/bin
        -DCMAKE_INSTALL_PREFIX=${INSTALL_DIR})

######################################################################
# Google Test and Google Mock
######################################################################
set(GTEST_CMAKE_ARGS
        ${THIRD_PARTY_CMAKE_ARGS}
        -DINSTALL_GTEST=ON
        -DBUILD_SHARED_LIBS=OFF
        -Dgmock_build_test=OFF
        -Dgtest_build_tests=OFF
        -Dgtest_build_samples=OFF)

externalproject_add(googletest
        URL ${THIRD_PARTY_DIR}/googletest
        SOURCE_DIR ${THIRD_PARTY_DIR}/googletest
        CMAKE_ARGS ${GTEST_CMAKE_ARGS}
        DOWNLOAD_COMMAND ""
        LOG_DOWNLOAD On
        LOG_CONFIGURE On
        LOG_BUILD On
        LOG_INSTALL On)

macro(TARGET_GTEST_HEADER target)
    add_dependencies(${target} googletest)
    target_include_directories(${target} PUBLIC ${PROJECT_3RDPARTY_BIN_DIR}/googletest/include)
    target_link_directories(${target} PUBLIC ${PROJECT_3RDPARTY_BIN_DIR}/googletest/lib)
    target_link_libraries(${target} ${PROJECT_3RDPARTY_BIN_DIR}/googletest/lib/libgtest.a)
endmacro()

######################################################################
# Mockcpp
######################################################################
set(MOCKCPP_CMAKE_ARGS
        ${THIRD_PARTY_CMAKE_ARGS}
        -DCMAKE_INSTALL_LIBDIR=${MOCKCPP_INSTALL_DIR}/lib
        -DCMAKE_INSTALL_BINDIR=${MOCKCPP_INSTALL_DIR}/bin
        -DCMAKE_INSTALL_PREFIX=${MOCKCPP_INSTALL_DIR}/)

set(MOCKCPP_PATCH ${PROJECT_SOURCE_DIR}/test/3rdparty/patch/mockcpp_support_arm64.patch)

externalproject_add(mock_cpp
        URL ${THIRD_PARTY_DIR}/mockcpp
        CMAKE_ARGS ${MOCKCPP_CMAKE_ARGS}
        PATCH_COMMAND patch -p1 --forward -i ${MOCKCPP_PATCH}
        BUILD_ALWAYS OFF
        LOG_DOWNLOAD On
        LOG_CONFIGURE On
        LOG_BUILD On
        LOG_INSTALL On
        BUILD_BYPRODUCTS ${PROJECT_3RDPARTY_BIN_DIR}/mockcpp/lib/libmockcpp.a)

macro(TARGET_MOCKCPP_HEADER target)
    add_dependencies(${target} mock_cpp)
    target_include_directories(${target} PUBLIC ${PROJECT_3RDPARTY_BIN_DIR}/mockcpp/include)
    target_link_directories(${target} PUBLIC ${PROJECT_3RDPARTY_BIN_DIR}/mockcpp/lib)
    target_link_libraries(${target} ${PROJECT_3RDPARTY_BIN_DIR}/mockcpp/lib/libmockcpp.a)
endmacro()