diff --git a/cmake/FindGTest.cmake b/cmake/FindGTest.cmake new file mode 100644 index 0000000..aa203bc --- /dev/null +++ b/cmake/FindGTest.cmake @@ -0,0 +1,117 @@ +Function ( __gtest_define_backwards_compatible_library_targets ) + Set ( GTEST_BOTH_LIBRARIES ${GTEST_LIBRARIES} ${GTEST_MAIN_LIBRARIES} PARENT_SCOPE ) + + # Add targets mapping the same library names as defined in + # older versions of CMake's FindGTest + If ( NOT TARGET GTest::GTest ) + Add_Library ( GTest::GTest INTERFACE IMPORTED ) + Target_Link_Libraries ( GTest::GTest INTERFACE GTest::gtest ) + EndIf () + If ( NOT TARGET GTest::Main ) + Add_Library ( GTest::Main INTERFACE IMPORTED ) + Target_Link_Libraries ( GTest::Main INTERFACE GTest::gtest_main ) + EndIf () + + If ( NOT TARGET GMock::GMock ) + Add_Library ( GMock::GMock INTERFACE IMPORTED ) + Target_Link_Libraries ( GMock::GMock INTERFACE GMock::gmock ) + EndIf () + If ( NOT TARGET GMock::Main ) + Add_Library ( GMock::Main INTERFACE IMPORTED ) + Target_Link_Libraries ( GMock::Main INTERFACE GMock::gmock_main ) + EndIf () +EndFunction() + +Include ( ExternalProject ) +Include ( FindPackageHandleStandardArgs ) + +If( CMAKE_CROSSCOMPILING ) + Message ( STATUS "Disable search for 'GTest' package because of cross compiling. Skip unit test targets..." ) + Return ( ) +EndIf ( ) + +If( GTest_FOUND ) + Message ( FATAL_ERROR "GTest already found! Do not expect that an other CMake script looked for 'GTest'. " ) +EndIf ( ) + +# Configure external project +Set ( GTEST_EX_PATH "${CMAKE_BINARY_DIR}/subprojects/googletest" ) +Get_Property ( IS_INCLUDED GLOBAL PROPERTY __external_project_googletest ) +If ( NOT IS_INCLUDED ) + ExternalProject_Add ( + project_googletest + URL "https://github.com/google/googletest/archive/refs/tags/release-1.10.0.tar.gz" + URL_HASH SHA256=9dc9157a9a1551ec7a7e43daea9a694a0bb5fb8bec81235d8a1e6ef64c716dcb + PREFIX ${GTEST_EX_PATH} + INSTALL_COMMAND make install DESTDIR=${GTEST_EX_PATH} ) + Set_Property ( GLOBAL PROPERTY __external_project_googletest TRUE ) +EndIf ( ) + +Set ( GTEST_INCLUDE_DIR "${GTEST_EX_PATH}/usr/local/include" ) +Set ( GTEST_LIBRARY "${GTEST_EX_PATH}/usr/local/lib/libgtest.a" ) +Set ( GTEST_MAIN_LIBRARY "${GTEST_EX_PATH}/usr/local/lib/libgtest_main.a" ) +Set ( GMOCK_LIBRARY "${GTEST_EX_PATH}/usr/local/lib/libgmock.a" ) +Set ( GMOCK_MAIN_LIBRARY "${GTEST_EX_PATH}/usr/local/lib/libgmock_main.a" ) +File ( MAKE_DIRECTORY ${GTEST_INCLUDE_DIR} ) + +# Find package +Find_Package_Handle_Standard_Args ( GTest + DEFAULT_MSG + GTEST_INCLUDE_DIR + GTEST_LIBRARY + GTEST_MAIN_LIBRARY + GMOCK_LIBRARY + GMOCK_MAIN_LIBRARY ) + +If ( GTest_FOUND ) + + Set ( GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIR} ) + + Find_Package ( Threads QUIET ) + + If ( NOT TARGET GTest::gtest ) + Add_Library ( GTest::gtest STATIC IMPORTED ) + Add_Dependencies ( GTest::gtest project_googletest ) + If ( TARGET Threads::Threads ) + Set_Target_Properties ( GTest::gtest PROPERTIES + INTERFACE_LINK_LIBRARIES Threads::Threads ) + EndIf () + Set_Target_Properties ( GTest::gtest + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}" + IMPORTED_LOCATION "${GTEST_LIBRARY}" ) + EndIf () + + If ( NOT TARGET GTest::gtest_main ) + Add_Library ( GTest::gtest_main STATIC IMPORTED ) + Set_Target_Properties ( GTest::gtest_main + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "GTest::gtest" + IMPORTED_LOCATION "${GTEST_MAIN_LIBRARY}" ) + EndIf() + + If ( NOT TARGET GMock::gmock ) + Add_Library ( GMock::gmock STATIC IMPORTED ) + If ( TARGET Threads::Threads ) + Set_Target_Properties ( GMock::gmock PROPERTIES + INTERFACE_LINK_LIBRARIES Threads::Threads ) + EndIf () + Set_Target_Properties ( GMock::gmock + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "GTest::gtest" + IMPORTED_LOCATION "${GMOCK_LIBRARY}" ) + EndIf () + + If ( NOT TARGET GMock::gmock_main ) + Add_Library ( GMock::gmock_main STATIC IMPORTED ) + Set_Target_Properties ( GMock::gmock_main + PROPERTIES + INTERFACE_INCLUDE_DIRECTORIES "${GTEST_INCLUDE_DIRS}" + INTERFACE_LINK_LIBRARIES "GMock::gmock" + IMPORTED_LOCATION "${GMOCK_MAIN_LIBRARY}" ) + EndIf() + + __gtest_define_backwards_compatible_library_targets () +EndIf ()