diff options
Diffstat (limited to 'infra/nncc/cmake/packages/GTestConfig.cmake')
-rw-r--r-- | infra/nncc/cmake/packages/GTestConfig.cmake | 86 |
1 files changed, 86 insertions, 0 deletions
diff --git a/infra/nncc/cmake/packages/GTestConfig.cmake b/infra/nncc/cmake/packages/GTestConfig.cmake new file mode 100644 index 000000000..27f96b27d --- /dev/null +++ b/infra/nncc/cmake/packages/GTestConfig.cmake @@ -0,0 +1,86 @@ +function(_GTest_build) + if(NOT BUILD_GTEST) + return() + endif(NOT BUILD_GTEST) + + nncc_find_package(GTestSource QUIET) + + if(NOT GTestSource_FOUND) + return() + endif(NOT GTestSource_FOUND) + + # TODO Introduce helper functions + set(GTEST_SOURCE_DIR "${GTestSource_DIR}") + set(GTEST_BUILD_DIR "${CMAKE_BINARY_DIR}/externals/GTEST/build") + set(GTEST_INSTALL_DIR "${NNCC_OVERLAY_DIR}") + + set(STAMP_PATH "${GTEST_INSTALL_DIR}/GTEST.stamp") + set(LOG_PATH "${GTEST_INSTALL_DIR}/GTEST.log") + + if(EXISTS ${STAMP_PATH}) + return() + endif(EXISTS ${STAMP_PATH}) + + message(STATUS "Google Test Package: Source found (path: ${GTEST_SOURCE_DIR})") + + file(MAKE_DIRECTORY ${GTEST_BUILD_DIR}) + file(MAKE_DIRECTORY ${GTEST_INSTALL_DIR}) + + # NOTE Do NOT retry build once it failed + file(WRITE "${STAMP_PATH}") + + execute_process(COMMAND ${CMAKE_COMMAND} + -DCMAKE_INSTALL_PREFIX=${GTEST_INSTALL_DIR} + -DCMAKE_BUILD_TYPE=Release + ${GTestSource_DIR} + OUTPUT_FILE ${LOG_PATH} + ERROR_FILE ${LOG_PATH} + WORKING_DIRECTORY ${GTEST_BUILD_DIR} + RESULT_VARIABLE BUILD_EXITCODE) + + if(NOT BUILD_EXITCODE EQUAL 0) + message(FATAL_ERROR "Google Test Package: Build failed (check '${LOG_PATH}' for details)") + endif(NOT BUILD_EXITCODE EQUAL 0) + + execute_process(COMMAND ${CMAKE_COMMAND} --build . -- install + OUTPUT_FILE ${LOG_PATH} + ERROR_FILE ${LOG_PATH} + WORKING_DIRECTORY ${GTEST_BUILD_DIR} + RESULT_VARIABLE INSTALL_EXITCODE) + + if(NOT INSTALL_EXITCODE EQUAL 0) + message(FATAL_ERROR "Google Test Package: Installation failed (check '${LOG_PATH}' for details)") + endif(NOT INSTALL_EXITCODE EQUAL 0) + + message(STATUS "Google Test Package: Done") +endfunction(_GTest_build) + +_GTest_build() + +### Find and use pre-installed Google Test +find_package(GTest) +find_package(Threads) + +if(${GTEST_FOUND} AND TARGET Threads::Threads) + if(NOT TARGET gtest) + add_library(gtest INTERFACE) + target_include_directories(gtest INTERFACE ${GTEST_INCLUDE_DIRS}) + target_link_libraries(gtest INTERFACE ${GTEST_LIBRARIES} Threads::Threads) + endif(NOT TARGET gtest) + + if(NOT TARGET gtest_main) + add_library(gtest_main INTERFACE) + target_include_directories(gtest_main INTERFACE ${GTEST_INCLUDE_DIRS}) + target_link_libraries(gtest_main INTERFACE gtest) + target_link_libraries(gtest_main INTERFACE ${GTEST_MAIN_LIBRARIES}) + + # GTest_AddTest(TGT ...) creates an executable target and registers that executable as a CMake test + function(GTest_AddTest TGT) + add_executable(${TGT} ${ARGN}) + target_link_libraries(${TGT} gtest_main) + add_test(${TGT} ${TGT}) + endfunction(GTest_AddTest) + endif(NOT TARGET gtest_main) + + set(GTest_FOUND TRUE) +endif(${GTEST_FOUND} AND TARGET Threads::Threads) |