|
12 | 12 | # See the License for the specific language governing permissions and |
13 | 13 | # limitations under the License. |
14 | 14 |
|
15 | | -# Abseil requires a gmock target to be defined. Unlike the gtest target, gRPC |
16 | | -# does not define it, so we must define it ourselves. We do that in this file. |
17 | | - |
18 | | -# Compile the googlemock library. This library is rarely installed or |
19 | | -# pre-compiled because it should be configured with the same flags as the |
20 | | -# application. |
21 | | -add_library(gmock |
22 | | - ${PROJECT_THIRD_PARTY_DIR}/googletest/googletest/src/gtest_main.cc |
23 | | - ${PROJECT_THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc |
24 | | - ${PROJECT_THIRD_PARTY_DIR}/googletest/googlemock/src/gmock-all.cc) |
25 | | -target_include_directories(gmock |
26 | | - PUBLIC ${PROJECT_THIRD_PARTY_DIR}/googletest/googletest/include |
27 | | - PUBLIC ${PROJECT_THIRD_PARTY_DIR}/googletest/googletest |
28 | | - PUBLIC ${PROJECT_THIRD_PARTY_DIR}/googletest/googlemock/include |
29 | | - PUBLIC ${PROJECT_THIRD_PARTY_DIR}/googletest/googlemock) |
| 15 | +# Configure the googletest dependency, this can be found as a submodule, package, or |
| 16 | +# installed with pkg-config support. |
| 17 | +set(GOOGLE_CLOUD_CPP_GMOCK_PROVIDER "module" |
| 18 | + CACHE STRING "How to find the googlemock library") |
| 19 | +set_property(CACHE GOOGLE_CLOUD_CPP_GMOCK_PROVIDER |
| 20 | + PROPERTY STRINGS "module" "package" "vcpkg" "pkg-config") |
| 21 | + |
| 22 | +if ("${GOOGLE_CLOUD_CPP_GMOCK_PROVIDER}" STREQUAL "module") |
| 23 | + # Compile the googlemock library. This library is rarely installed or |
| 24 | + # pre-compiled because it should be configured with the same flags as the |
| 25 | + # application. |
| 26 | + # TODO(#310) - the name of this target can easily conflict, consider changing it. |
| 27 | + add_library(gmock |
| 28 | + ${PROJECT_THIRD_PARTY_DIR}/googletest/googletest/src/gtest_main.cc |
| 29 | + ${PROJECT_THIRD_PARTY_DIR}/googletest/googletest/src/gtest-all.cc |
| 30 | + ${PROJECT_THIRD_PARTY_DIR}/googletest/googlemock/src/gmock-all.cc) |
| 31 | + target_include_directories(gmock |
| 32 | + PUBLIC ${PROJECT_THIRD_PARTY_DIR}/googletest/googletest/include |
| 33 | + PUBLIC ${PROJECT_THIRD_PARTY_DIR}/googletest/googletest |
| 34 | + PUBLIC ${PROJECT_THIRD_PARTY_DIR}/googletest/googlemock/include |
| 35 | + PUBLIC ${PROJECT_THIRD_PARTY_DIR}/googletest/googlemock) |
| 36 | + |
| 37 | +elseif ("${GOOGLE_CLOUD_CPP_GMOCK_PROVIDER}" STREQUAL "vcpkg") |
| 38 | + find_package(GTest REQUIRED) |
| 39 | + # The FindGTest module finds GTest by default, but does not search for |
| 40 | + # GMock, though they are usually installed together. |
| 41 | + __gtest_find_library(GMOCK_LIBRARY gmock) |
| 42 | + __gtest_find_library(GMOCK_LIBRARY_DEBUG gmockd) |
| 43 | + if ("${GMOCK_LIBRARY}" MATCHES "-NOTFOUND") |
| 44 | + message(FATAL_ERROR "Cannot find gmock library ${GMOCK_LIBRARY}.") |
| 45 | + endif () |
| 46 | + mark_as_advanced(GMOCK_LIBRARY) |
| 47 | + |
| 48 | + find_path(GMOCK_INCLUDE_DIR gmock/gmock.h |
| 49 | + HINTS $ENV{GTEST_ROOT}/include ${GTEST_ROOT}/include |
| 50 | + DOC "The GoogleTest Mocking Library headers") |
| 51 | + if ("${GMOCK_INCLUDE_DIR}" MATCHES "-NOTFOUND") |
| 52 | + message(FATAL_ERROR "Cannot find gmock library ${GMOCK_INCLUDE_DIR}.") |
| 53 | + endif () |
| 54 | + mark_as_advanced(GMOCK_INCLUDE_DIR) |
| 55 | + |
| 56 | + add_library(GMock::GMock STATIC IMPORTED) |
| 57 | + set_target_properties(GMock::GMock PROPERTIES |
| 58 | + IMPORTED_LINK_INTERFACE_LIBRARIES GTest::GTest |
| 59 | + INTERFACE_INCLUDE_DIRECTORIES "${GMOCK_INCLUDE_DIRS}") |
| 60 | + __gtest_import_library(GMock::GMock GMOCK_LIBRARY "") |
| 61 | + __gtest_import_library(GMock::GMock GMOCK_LIBRARY "RELEASE") |
| 62 | + __gtest_import_library(GMock::GMock GMOCK_LIBRARY "DEBUG") |
| 63 | + # TODO(#310) - the name of this target can easily conflict, consider changing it. |
| 64 | + add_library(gmock INTERFACE) |
| 65 | + target_link_libraries(gmock INTERFACE GMock::GMock GTest::Main) |
| 66 | + |
| 67 | +elseif ("${GOOGLE_CLOUD_CPP_GMOCK_PROVIDER}" STREQUAL "package") |
| 68 | + find_package(Threads REQUIRED) |
| 69 | + find_package(GTest REQUIRED) |
| 70 | + |
| 71 | + find_path(GMOCK_INCLUDE_DIR gmock/gmock.h |
| 72 | + HINTS $ENV{GTEST_ROOT}/include ${GTEST_ROOT}/include |
| 73 | + DOC "The GoogleTest Mocking Library headers") |
| 74 | + if ("${GMOCK_INCLUDE_DIR}" MATCHES "-NOTFOUND") |
| 75 | + message(FATAL_ERROR "Cannot find gmock headers ${GMOCK_INCLUDE_DIR}.") |
| 76 | + endif () |
| 77 | + mark_as_advanced(GMOCK_INCLUDE_DIR) |
| 78 | + |
| 79 | + find_library(GMOCK_LIBRARY gmock) |
| 80 | + if ("${GMOCK_LIBRARY}" MATCHES "-NOTFOUND") |
| 81 | + message(FATAL_ERROR "Cannot find gmock library ${GMOCK_LIBRARY}.") |
| 82 | + endif () |
| 83 | + mark_as_advanced(GMOCK_LIBRARY) |
| 84 | + |
| 85 | + find_library(GMOCK_MAIN_LIBRARY gmock_main) |
| 86 | + if ("${GMOCK_LIBRARY}" MATCHES "-NOTFOUND") |
| 87 | + message(FATAL_ERROR "Cannot find gmock_main library ${GMOCK_MAIN_LIBRARY}.") |
| 88 | + endif () |
| 89 | + mark_as_advanced(GMOCK_MAIN_LIBRARY) |
| 90 | + |
| 91 | + add_library(GMock::GMock UNKNOWN IMPORTED) |
| 92 | + set_target_properties(GMock::GMock PROPERTIES |
| 93 | + IMPORTED_LINK_INTERFACE_LIBRARIES "GTest::GTest;Threads::Threads" |
| 94 | + INTERFACE_INCLUDE_DIRECTORIES "${GMOCK_INCLUDE_DIRS}" |
| 95 | + IMPORTED_LOCATION "${GMOCK_LIBRARY}") |
| 96 | + |
| 97 | + add_library(GMock::Main UNKNOWN IMPORTED) |
| 98 | + set_target_properties(GMock::Main PROPERTIES |
| 99 | + IMPORTED_LINK_INTERFACE_LIBRARIES "GMock::GMock;Threads::Threads" |
| 100 | + INTERFACE_INCLUDE_DIRECTORIES "${GMOCK_INCLUDE_DIRS}" |
| 101 | + IMPORTED_LOCATION "${GMOCK_MAIN_LIBRARY}") |
| 102 | + |
| 103 | + # TODO(#310) - the name of this target can easily conflict, consider changing it. |
| 104 | + add_library(gmock INTERFACE) |
| 105 | + target_link_libraries(gmock INTERFACE GMock::Main GMock::GMock GTest::GTest) |
| 106 | + |
| 107 | +elseif ("${GOOGLE_CLOUD_CPP_GMOCK_PROVIDER}" STREQUAL "pkg-config") |
| 108 | + # Use pkg-config to find the libraries. |
| 109 | + find_package(PkgConfig REQUIRED) |
| 110 | + # We need a helper function to convert pkg-config(1) output into target |
| 111 | + # properties. |
| 112 | + include(${CMAKE_CURRENT_LIST_DIR}/PkgConfigHelper.cmake) |
| 113 | + |
| 114 | + pkg_check_modules(gmock_pc REQUIRED gmock_main gmock gtest) |
| 115 | + add_library(GMock::GMock INTERFACE IMPORTED) |
| 116 | + set_library_properties_from_pkg_config(GMock::GMock gmock_pc) |
| 117 | + set_property(TARGET GMock::GMock APPEND PROPERTY |
| 118 | + INTERFACE_LINK_LIBRARIES Threads::Threads) |
| 119 | + |
| 120 | + # TODO(#310) - the name of this target can easily conflict, consider changing it. |
| 121 | + add_library(gmock INTERFACE) |
| 122 | + target_link_libraries(gmock INTERFACE GMock::GMock) |
| 123 | +endif () |
0 commit comments