Skip to content

Commit 2c9ef33

Browse files
authored
Simplify vcpkg build (#311)
This is needed so vcpkg can compile the libraries with a minimal number of submodules.
1 parent bd6e4c9 commit 2c9ef33

2 files changed

Lines changed: 116 additions & 15 deletions

File tree

ci/Dockerfile.ubuntu-with-grpc

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,13 @@ RUN git submodule update --init --recursive
2828
RUN (make -j "${NCPU}" HAS_SYSTEM_PROTOBUF=false && make install && \
2929
cd third_party/protobuf && make install)
3030

31+
WORKDIR /var/tmp/build/
32+
RUN git clone --depth 50 https://github.com/google/googletest.git
33+
WORKDIR /var/tmp/build/googletest
34+
RUN git submodule update --init --recursive
35+
RUN cmake -H. -B.build && cmake --build .build -- -j "${NCPU}"
36+
RUN cmake --build .build --target install
37+
3138
FROM cached-${DISTRO}-${DISTRO_VERSION}:tip
3239
COPY --from=staging /usr/local/include /usr/local/include
3340
COPY --from=staging /usr/local/bin /usr/local/bin

cmake/IncludeGMock.cmake

Lines changed: 109 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,112 @@
1212
# See the License for the specific language governing permissions and
1313
# limitations under the License.
1414

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

Comments
 (0)