HandleGTest.cmake 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. include(split_list)
  2. macro(build_external_gtest)
  3. include(ExternalProject)
  4. set(GTEST_FLAGS "")
  5. if (BENCHMARK_USE_LIBCXX)
  6. if ("${CMAKE_CXX_COMPILER_ID}" MATCHES "Clang")
  7. list(APPEND GTEST_FLAGS -stdlib=libc++)
  8. else()
  9. message(WARNING "Unsupported compiler (${CMAKE_CXX_COMPILER}) when using libc++")
  10. endif()
  11. endif()
  12. if (BENCHMARK_BUILD_32_BITS)
  13. list(APPEND GTEST_FLAGS -m32)
  14. endif()
  15. if (NOT "${CMAKE_CXX_FLAGS}" STREQUAL "")
  16. list(APPEND GTEST_FLAGS ${CMAKE_CXX_FLAGS})
  17. endif()
  18. string(TOUPPER "${CMAKE_BUILD_TYPE}" GTEST_BUILD_TYPE)
  19. if ("${GTEST_BUILD_TYPE}" STREQUAL "COVERAGE")
  20. set(GTEST_BUILD_TYPE "DEBUG")
  21. endif()
  22. # FIXME: Since 10/Feb/2017 the googletest trunk has had a bug where
  23. # -Werror=unused-function fires during the build on OS X. This is a temporary
  24. # workaround to keep our travis bots from failing. It should be removed
  25. # once gtest is fixed.
  26. if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC")
  27. list(APPEND GTEST_FLAGS "-Wno-unused-function")
  28. endif()
  29. split_list(GTEST_FLAGS)
  30. set(EXCLUDE_FROM_ALL_OPT "")
  31. set(EXCLUDE_FROM_ALL_VALUE "")
  32. if (${CMAKE_VERSION} VERSION_GREATER "3.0.99")
  33. set(EXCLUDE_FROM_ALL_OPT "EXCLUDE_FROM_ALL")
  34. set(EXCLUDE_FROM_ALL_VALUE "ON")
  35. endif()
  36. ExternalProject_Add(googletest
  37. ${EXCLUDE_FROM_ALL_OPT} ${EXCLUDE_FROM_ALL_VALUE}
  38. GIT_REPOSITORY https://github.com/google/googletest.git
  39. GIT_TAG master
  40. PREFIX "${CMAKE_BINARY_DIR}/googletest"
  41. INSTALL_DIR "${CMAKE_BINARY_DIR}/googletest"
  42. CMAKE_CACHE_ARGS
  43. -DCMAKE_BUILD_TYPE:STRING=${GTEST_BUILD_TYPE}
  44. -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER}
  45. -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER}
  46. -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR>
  47. -DCMAKE_INSTALL_LIBDIR:PATH=<INSTALL_DIR>/lib
  48. -DCMAKE_CXX_FLAGS:STRING=${GTEST_FLAGS}
  49. -Dgtest_force_shared_crt:BOOL=ON
  50. )
  51. ExternalProject_Get_Property(googletest install_dir)
  52. set(GTEST_INCLUDE_DIRS ${install_dir}/include)
  53. file(MAKE_DIRECTORY ${GTEST_INCLUDE_DIRS})
  54. set(LIB_SUFFIX "${CMAKE_STATIC_LIBRARY_SUFFIX}")
  55. set(LIB_PREFIX "${CMAKE_STATIC_LIBRARY_PREFIX}")
  56. if("${GTEST_BUILD_TYPE}" STREQUAL "DEBUG")
  57. set(LIB_SUFFIX "d${CMAKE_STATIC_LIBRARY_SUFFIX}")
  58. endif()
  59. # Use gmock_main instead of gtest_main because it initializes gtest as well.
  60. # Note: The libraries are listed in reverse order of their dependancies.
  61. foreach(LIB gtest gmock gmock_main)
  62. add_library(${LIB} UNKNOWN IMPORTED)
  63. set_target_properties(${LIB} PROPERTIES
  64. IMPORTED_LOCATION ${install_dir}/lib/${LIB_PREFIX}${LIB}${LIB_SUFFIX}
  65. INTERFACE_INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIRS}
  66. INTERFACE_LINK_LIBRARIES "${GTEST_BOTH_LIBRARIES}"
  67. )
  68. add_dependencies(${LIB} googletest)
  69. list(APPEND GTEST_BOTH_LIBRARIES ${LIB})
  70. endforeach()
  71. endmacro(build_external_gtest)
  72. if (BENCHMARK_ENABLE_GTEST_TESTS)
  73. if (IS_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/googletest)
  74. set(GTEST_ROOT "${CMAKE_CURRENT_SOURCE_DIR}/googletest")
  75. set(INSTALL_GTEST OFF CACHE INTERNAL "")
  76. set(INSTALL_GMOCK OFF CACHE INTERNAL "")
  77. add_subdirectory(${CMAKE_CURRENT_SOURCE_DIR}/googletest)
  78. set(GTEST_BOTH_LIBRARIES gtest gmock gmock_main)
  79. foreach(HEADER test mock)
  80. # CMake 2.8 and older don't respect INTERFACE_INCLUDE_DIRECTORIES, so we
  81. # have to add the paths ourselves.
  82. set(HFILE g${HEADER}/g${HEADER}.h)
  83. set(HPATH ${GTEST_ROOT}/google${HEADER}/include)
  84. find_path(HEADER_PATH_${HEADER} ${HFILE}
  85. NO_DEFAULT_PATHS
  86. HINTS ${HPATH}
  87. )
  88. if (NOT HEADER_PATH_${HEADER})
  89. message(FATAL_ERROR "Failed to find header ${HFILE} in ${HPATH}")
  90. endif()
  91. list(APPEND GTEST_INCLUDE_DIRS ${HEADER_PATH_${HEADER}})
  92. endforeach()
  93. elseif(BENCHMARK_DOWNLOAD_DEPENDENCIES)
  94. build_external_gtest()
  95. else()
  96. find_package(GTest REQUIRED)
  97. find_path(GMOCK_INCLUDE_DIRS gmock/gmock.h
  98. HINTS ${GTEST_INCLUDE_DIRS})
  99. if (NOT GMOCK_INCLUDE_DIRS)
  100. message(FATAL_ERROR "Failed to find header gmock/gmock.h with hint ${GTEST_INCLUDE_DIRS}")
  101. endif()
  102. set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS})
  103. # FIXME: We don't currently require the gmock library to build the tests,
  104. # and it's likely we won't find it, so we don't try. As long as we've
  105. # found the gmock/gmock.h header and gtest_main that should be good enough.
  106. endif()
  107. endif()