| |
| include(split_list) |
| |
| macro(build_external_gtest) |
| include(ExternalProject) |
| set(GTEST_FLAGS "") |
| if (BENCHMARK_USE_LIBCXX) |
| if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") |
| list(APPEND GTEST_FLAGS -stdlib=libc++) |
| else() |
| message(WARNING "Unsupported compiler (${CMAKE_CXX_COMPILER}) when using libc++") |
| endif() |
| endif() |
| if (BENCHMARK_BUILD_32_BITS) |
| list(APPEND GTEST_FLAGS -m32) |
| endif() |
| if (NOT "${CMAKE_CXX_FLAGS}" STREQUAL "") |
| list(APPEND GTEST_FLAGS ${CMAKE_CXX_FLAGS}) |
| endif() |
| string(TOUPPER "${CMAKE_BUILD_TYPE}" GTEST_BUILD_TYPE) |
| if ("${GTEST_BUILD_TYPE}" STREQUAL "COVERAGE") |
| set(GTEST_BUILD_TYPE "DEBUG") |
| endif() |
| # FIXME: Since 10/Feb/2017 the googletest trunk has had a bug where |
| # -Werror=unused-function fires during the build on OS X. This is a temporary |
| # workaround to keep our travis bots from failing. It should be removed |
| # once gtest is fixed. |
| if (NOT "${CMAKE_CXX_COMPILER_ID}" STREQUAL "MSVC") |
| list(APPEND GTEST_FLAGS "-Wno-unused-function") |
| endif() |
| split_list(GTEST_FLAGS) |
| set(EXCLUDE_FROM_ALL_OPT "") |
| set(EXCLUDE_FROM_ALL_VALUE "") |
| if (${CMAKE_VERSION} VERSION_GREATER "3.0.99") |
| set(EXCLUDE_FROM_ALL_OPT "EXCLUDE_FROM_ALL") |
| set(EXCLUDE_FROM_ALL_VALUE "ON") |
| endif() |
| ExternalProject_Add(googletest |
| ${EXCLUDE_FROM_ALL_OPT} ${EXCLUDE_FROM_ALL_VALUE} |
| GIT_REPOSITORY https://github.com/google/googletest.git |
| GIT_TAG master |
| PREFIX "${CMAKE_BINARY_DIR}/googletest" |
| INSTALL_DIR "${CMAKE_BINARY_DIR}/googletest" |
| CMAKE_CACHE_ARGS |
| -DCMAKE_BUILD_TYPE:STRING=${GTEST_BUILD_TYPE} |
| -DCMAKE_C_COMPILER:STRING=${CMAKE_C_COMPILER} |
| -DCMAKE_CXX_COMPILER:STRING=${CMAKE_CXX_COMPILER} |
| -DCMAKE_INSTALL_PREFIX:PATH=<INSTALL_DIR> |
| -DCMAKE_INSTALL_LIBDIR:PATH=<INSTALL_DIR>/lib |
| -DCMAKE_CXX_FLAGS:STRING=${GTEST_FLAGS} |
| -Dgtest_force_shared_crt:BOOL=ON |
| ) |
| |
| ExternalProject_Get_Property(googletest install_dir) |
| set(GTEST_INCLUDE_DIRS ${install_dir}/include) |
| file(MAKE_DIRECTORY ${GTEST_INCLUDE_DIRS}) |
| |
| set(LIB_SUFFIX "${CMAKE_STATIC_LIBRARY_SUFFIX}") |
| set(LIB_PREFIX "${CMAKE_STATIC_LIBRARY_PREFIX}") |
| if("${GTEST_BUILD_TYPE}" STREQUAL "DEBUG") |
| set(LIB_SUFFIX "d${CMAKE_STATIC_LIBRARY_SUFFIX}") |
| endif() |
| |
| # Use gmock_main instead of gtest_main because it initializes gtest as well. |
| # Note: The libraries are listed in reverse order of their dependancies. |
| foreach(LIB gtest gmock gmock_main) |
| add_library(${LIB} UNKNOWN IMPORTED) |
| set_target_properties(${LIB} PROPERTIES |
| IMPORTED_LOCATION ${install_dir}/lib/${LIB_PREFIX}${LIB}${LIB_SUFFIX} |
| INTERFACE_INCLUDE_DIRECTORIES ${GTEST_INCLUDE_DIRS} |
| INTERFACE_LINK_LIBRARIES "${GTEST_BOTH_LIBRARIES}" |
| ) |
| add_dependencies(${LIB} googletest) |
| list(APPEND GTEST_BOTH_LIBRARIES ${LIB}) |
| endforeach() |
| endmacro(build_external_gtest) |
| |
| if (BENCHMARK_ENABLE_GTEST_TESTS) |
| if (IS_DIRECTORY ${CMAKE_SOURCE_DIR}/googletest) |
| set(GTEST_ROOT "${CMAKE_SOURCE_DIR}/googletest") |
| set(INSTALL_GTEST OFF CACHE INTERNAL "") |
| set(INSTALL_GMOCK OFF CACHE INTERNAL "") |
| add_subdirectory(${CMAKE_SOURCE_DIR}/googletest) |
| set(GTEST_BOTH_LIBRARIES gtest gmock gmock_main) |
| foreach(HEADER test mock) |
| # CMake 2.8 and older don't respect INTERFACE_INCLUDE_DIRECTORIES, so we |
| # have to add the paths ourselves. |
| set(HFILE g${HEADER}/g${HEADER}.h) |
| set(HPATH ${GTEST_ROOT}/google${HEADER}/include) |
| find_path(HEADER_PATH_${HEADER} ${HFILE} |
| NO_DEFAULT_PATHS |
| HINTS ${HPATH} |
| ) |
| if (NOT HEADER_PATH_${HEADER}) |
| message(FATAL_ERROR "Failed to find header ${HFILE} in ${HPATH}") |
| endif() |
| list(APPEND GTEST_INCLUDE_DIRS ${HEADER_PATH_${HEADER}}) |
| endforeach() |
| elseif(BENCHMARK_DOWNLOAD_DEPENDENCIES) |
| build_external_gtest() |
| else() |
| find_package(GTest REQUIRED) |
| find_path(GMOCK_INCLUDE_DIRS gmock/gmock.h |
| HINTS ${GTEST_INCLUDE_DIRS}) |
| if (NOT GMOCK_INCLUDE_DIRS) |
| message(FATAL_ERROR "Failed to find header gmock/gmock.h with hint ${GTEST_INCLUDE_DIRS}") |
| endif() |
| set(GTEST_INCLUDE_DIRS ${GTEST_INCLUDE_DIRS} ${GMOCK_INCLUDE_DIRS}) |
| # FIXME: We don't currently require the gmock library to build the tests, |
| # and it's likely we won't find it, so we don't try. As long as we've |
| # found the gmock/gmock.h header and gtest_main that should be good enough. |
| endif() |
| endif() |