xref: /aosp_15_r20/external/libcxx/utils/google-benchmark/cmake/HandleGTest.cmake (revision 58b9f456b02922dfdb1fad8a988d5fd8765ecb80)
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