summaryrefslogtreecommitdiff
path: root/infra/nncc/cmake/packages/GTestConfig.cmake
diff options
context:
space:
mode:
Diffstat (limited to 'infra/nncc/cmake/packages/GTestConfig.cmake')
-rw-r--r--infra/nncc/cmake/packages/GTestConfig.cmake86
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)