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