# This is an alternative CMakeLists.txt to the experimental one
# shipped with the original package. It builds only the essential
# for our tests.

set(GTEST_DIR "${THIRDPARTY_DIR}/gtest")

set(GTEST_INCLUDE_DIRECTORIES
    "${GTEST_DIR}"
    "${GTEST_DIR}/include"
)

set(GTEST_SOURCES
    ${GTEST_DIR}/src/gtest.cc
    ${GTEST_DIR}/src/gtest-death-test.cc
    ${GTEST_DIR}/src/gtest-filepath.cc
    ${GTEST_DIR}/src/gtest_main.cc
    ${GTEST_DIR}/src/gtest-matchers.cc
    ${GTEST_DIR}/src/gtest-port.cc
    ${GTEST_DIR}/src/gtest-printers.cc
    ${GTEST_DIR}/src/gtest-test-part.cc
    ${GTEST_DIR}/src/gtest-typed-test.cc
)

set(gtest_DEFINITIONS GTEST_HAS_RTTI=0)

# Additional gtest configuration can be added in the port's cmake file
WEBKIT_INCLUDE_CONFIG_FILES_IF_EXISTS()

# By default use a shared library
if (NOT DEFINED gtest_LIBRARY_TYPE)
    set(gtest_LIBRARY_TYPE SHARED)
endif ()

if (gtest_LIBRARY_TYPE MATCHES SHARED)
    list(APPEND gtest_DEFINITIONS GTEST_CREATE_SHARED_LIBRARY=1)
    add_library(gtest SHARED ${GTEST_SOURCES})
else ()
    list(APPEND gtest_DEFINITIONS GTEST_CREATE_SHARED_LIBRARY=0)
    add_library(gtest STATIC ${GTEST_SOURCES})
endif ()

target_include_directories(gtest PRIVATE ${GTEST_INCLUDE_DIRECTORIES})

WEBKIT_ADD_TARGET_CXX_FLAGS(gtest -Wno-undef
                                  -Wno-stringop-truncation
                                  -Wno-suggest-attribute=format)

if (CMAKE_USE_PTHREADS_INIT)
    target_link_libraries(gtest PRIVATE ${CMAKE_THREAD_LIBS_INIT})
    list(APPEND gtest_DEFINITIONS GTEST_HAS_PTHREAD=1)
else ()
    list(APPEND gtest_DEFINITIONS GTEST_HAS_PTHREAD=0)
endif ()
target_compile_definitions(gtest PRIVATE ${gtest_DEFINITIONS})

add_library(gtestFramework INTERFACE)
target_link_libraries(gtestFramework INTERFACE gtest)
target_include_directories(gtestFramework INTERFACE "${GTEST_DIR}/include")
target_compile_definitions(gtestFramework INTERFACE ${gtest_DEFINITIONS})

add_library(WebKit::gtest ALIAS gtestFramework)
