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