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