xref: /aosp_15_r20/external/grpc-grpc/examples/cpp/cmake/common.cmake (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
1*cc02d7e2SAndroid Build Coastguard Worker# Copyright 2018 gRPC authors.
2*cc02d7e2SAndroid Build Coastguard Worker#
3*cc02d7e2SAndroid Build Coastguard Worker# Licensed under the Apache License, Version 2.0 (the "License");
4*cc02d7e2SAndroid Build Coastguard Worker# you may not use this file except in compliance with the License.
5*cc02d7e2SAndroid Build Coastguard Worker# You may obtain a copy of the License at
6*cc02d7e2SAndroid Build Coastguard Worker#
7*cc02d7e2SAndroid Build Coastguard Worker#     http://www.apache.org/licenses/LICENSE-2.0
8*cc02d7e2SAndroid Build Coastguard Worker#
9*cc02d7e2SAndroid Build Coastguard Worker# Unless required by applicable law or agreed to in writing, software
10*cc02d7e2SAndroid Build Coastguard Worker# distributed under the License is distributed on an "AS IS" BASIS,
11*cc02d7e2SAndroid Build Coastguard Worker# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12*cc02d7e2SAndroid Build Coastguard Worker# See the License for the specific language governing permissions and
13*cc02d7e2SAndroid Build Coastguard Worker# limitations under the License.
14*cc02d7e2SAndroid Build Coastguard Worker#
15*cc02d7e2SAndroid Build Coastguard Worker# cmake build file for C++ route_guide example.
16*cc02d7e2SAndroid Build Coastguard Worker# Assumes protobuf and gRPC have been installed using cmake.
17*cc02d7e2SAndroid Build Coastguard Worker# See cmake_externalproject/CMakeLists.txt for all-in-one cmake build
18*cc02d7e2SAndroid Build Coastguard Worker# that automatically builds all the dependencies before building route_guide.
19*cc02d7e2SAndroid Build Coastguard Worker
20*cc02d7e2SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.8)
21*cc02d7e2SAndroid Build Coastguard Worker
22*cc02d7e2SAndroid Build Coastguard Workerif(MSVC)
23*cc02d7e2SAndroid Build Coastguard Worker  add_definitions(-D_WIN32_WINNT=0x600)
24*cc02d7e2SAndroid Build Coastguard Workerendif()
25*cc02d7e2SAndroid Build Coastguard Worker
26*cc02d7e2SAndroid Build Coastguard Workerfind_package(Threads REQUIRED)
27*cc02d7e2SAndroid Build Coastguard Worker
28*cc02d7e2SAndroid Build Coastguard Workerif(GRPC_AS_SUBMODULE)
29*cc02d7e2SAndroid Build Coastguard Worker  # One way to build a projects that uses gRPC is to just include the
30*cc02d7e2SAndroid Build Coastguard Worker  # entire gRPC project tree via "add_subdirectory".
31*cc02d7e2SAndroid Build Coastguard Worker  # This approach is very simple to use, but the are some potential
32*cc02d7e2SAndroid Build Coastguard Worker  # disadvantages:
33*cc02d7e2SAndroid Build Coastguard Worker  # * it includes gRPC's CMakeLists.txt directly into your build script
34*cc02d7e2SAndroid Build Coastguard Worker  #   without and that can make gRPC's internal setting interfere with your
35*cc02d7e2SAndroid Build Coastguard Worker  #   own build.
36*cc02d7e2SAndroid Build Coastguard Worker  # * depending on what's installed on your system, the contents of submodules
37*cc02d7e2SAndroid Build Coastguard Worker  #   in gRPC's third_party/* might need to be available (and there might be
38*cc02d7e2SAndroid Build Coastguard Worker  #   additional prerequisites required to build them). Consider using
39*cc02d7e2SAndroid Build Coastguard Worker  #   the gRPC_*_PROVIDER options to fine-tune the expected behavior.
40*cc02d7e2SAndroid Build Coastguard Worker  #
41*cc02d7e2SAndroid Build Coastguard Worker  # A more robust approach to add dependency on gRPC is using
42*cc02d7e2SAndroid Build Coastguard Worker  # cmake's ExternalProject_Add (see cmake_externalproject/CMakeLists.txt).
43*cc02d7e2SAndroid Build Coastguard Worker
44*cc02d7e2SAndroid Build Coastguard Worker  # Include the gRPC's cmake build (normally grpc source code would live
45*cc02d7e2SAndroid Build Coastguard Worker  # in a git submodule called "third_party/grpc", but this example lives in
46*cc02d7e2SAndroid Build Coastguard Worker  # the same repository as gRPC sources, so we just look a few directories up)
47*cc02d7e2SAndroid Build Coastguard Worker  add_subdirectory(../../.. ${CMAKE_CURRENT_BINARY_DIR}/grpc EXCLUDE_FROM_ALL)
48*cc02d7e2SAndroid Build Coastguard Worker  message(STATUS "Using gRPC via add_subdirectory.")
49*cc02d7e2SAndroid Build Coastguard Worker
50*cc02d7e2SAndroid Build Coastguard Worker  # After using add_subdirectory, we can now use the grpc targets directly from
51*cc02d7e2SAndroid Build Coastguard Worker  # this build.
52*cc02d7e2SAndroid Build Coastguard Worker  set(_PROTOBUF_LIBPROTOBUF libprotobuf)
53*cc02d7e2SAndroid Build Coastguard Worker  set(_REFLECTION grpc++_reflection)
54*cc02d7e2SAndroid Build Coastguard Worker  set(_ORCA_SERVICE grpcpp_orca_service)
55*cc02d7e2SAndroid Build Coastguard Worker  if(CMAKE_CROSSCOMPILING)
56*cc02d7e2SAndroid Build Coastguard Worker    find_program(_PROTOBUF_PROTOC protoc)
57*cc02d7e2SAndroid Build Coastguard Worker  else()
58*cc02d7e2SAndroid Build Coastguard Worker    set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
59*cc02d7e2SAndroid Build Coastguard Worker  endif()
60*cc02d7e2SAndroid Build Coastguard Worker  set(_GRPC_GRPCPP grpc++)
61*cc02d7e2SAndroid Build Coastguard Worker  if(CMAKE_CROSSCOMPILING)
62*cc02d7e2SAndroid Build Coastguard Worker    find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
63*cc02d7e2SAndroid Build Coastguard Worker  else()
64*cc02d7e2SAndroid Build Coastguard Worker    set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)
65*cc02d7e2SAndroid Build Coastguard Worker  endif()
66*cc02d7e2SAndroid Build Coastguard Workerelseif(GRPC_FETCHCONTENT)
67*cc02d7e2SAndroid Build Coastguard Worker  # Another way is to use CMake's FetchContent module to clone gRPC at
68*cc02d7e2SAndroid Build Coastguard Worker  # configure time. This makes gRPC's source code available to your project,
69*cc02d7e2SAndroid Build Coastguard Worker  # similar to a git submodule.
70*cc02d7e2SAndroid Build Coastguard Worker  message(STATUS "Using gRPC via add_subdirectory (FetchContent).")
71*cc02d7e2SAndroid Build Coastguard Worker  include(FetchContent)
72*cc02d7e2SAndroid Build Coastguard Worker  FetchContent_Declare(
73*cc02d7e2SAndroid Build Coastguard Worker    grpc
74*cc02d7e2SAndroid Build Coastguard Worker    GIT_REPOSITORY https://github.com/grpc/grpc.git
75*cc02d7e2SAndroid Build Coastguard Worker    # when using gRPC, you will actually set this to an existing tag, such as
76*cc02d7e2SAndroid Build Coastguard Worker    # v1.25.0, v1.26.0 etc..
77*cc02d7e2SAndroid Build Coastguard Worker    # For the purpose of testing, we override the tag used to the commit
78*cc02d7e2SAndroid Build Coastguard Worker    # that's currently under test.
79*cc02d7e2SAndroid Build Coastguard Worker    GIT_TAG        vGRPC_TAG_VERSION_OF_YOUR_CHOICE)
80*cc02d7e2SAndroid Build Coastguard Worker  FetchContent_MakeAvailable(grpc)
81*cc02d7e2SAndroid Build Coastguard Worker
82*cc02d7e2SAndroid Build Coastguard Worker  # Since FetchContent uses add_subdirectory under the hood, we can use
83*cc02d7e2SAndroid Build Coastguard Worker  # the grpc targets directly from this build.
84*cc02d7e2SAndroid Build Coastguard Worker  set(_PROTOBUF_LIBPROTOBUF libprotobuf)
85*cc02d7e2SAndroid Build Coastguard Worker  set(_REFLECTION grpc++_reflection)
86*cc02d7e2SAndroid Build Coastguard Worker  set(_PROTOBUF_PROTOC $<TARGET_FILE:protoc>)
87*cc02d7e2SAndroid Build Coastguard Worker  set(_GRPC_GRPCPP grpc++)
88*cc02d7e2SAndroid Build Coastguard Worker  if(CMAKE_CROSSCOMPILING)
89*cc02d7e2SAndroid Build Coastguard Worker    find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
90*cc02d7e2SAndroid Build Coastguard Worker  else()
91*cc02d7e2SAndroid Build Coastguard Worker    set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:grpc_cpp_plugin>)
92*cc02d7e2SAndroid Build Coastguard Worker  endif()
93*cc02d7e2SAndroid Build Coastguard Workerelse()
94*cc02d7e2SAndroid Build Coastguard Worker  # This branch assumes that gRPC and all its dependencies are already installed
95*cc02d7e2SAndroid Build Coastguard Worker  # on this system, so they can be located by find_package().
96*cc02d7e2SAndroid Build Coastguard Worker
97*cc02d7e2SAndroid Build Coastguard Worker  # Find Protobuf installation
98*cc02d7e2SAndroid Build Coastguard Worker  # Looks for protobuf-config.cmake file installed by Protobuf's cmake installation.
99*cc02d7e2SAndroid Build Coastguard Worker  option(protobuf_MODULE_COMPATIBLE TRUE)
100*cc02d7e2SAndroid Build Coastguard Worker  find_package(Protobuf CONFIG REQUIRED)
101*cc02d7e2SAndroid Build Coastguard Worker  message(STATUS "Using protobuf ${Protobuf_VERSION}")
102*cc02d7e2SAndroid Build Coastguard Worker
103*cc02d7e2SAndroid Build Coastguard Worker  set(_PROTOBUF_LIBPROTOBUF protobuf::libprotobuf)
104*cc02d7e2SAndroid Build Coastguard Worker  set(_REFLECTION gRPC::grpc++_reflection)
105*cc02d7e2SAndroid Build Coastguard Worker  if(CMAKE_CROSSCOMPILING)
106*cc02d7e2SAndroid Build Coastguard Worker    find_program(_PROTOBUF_PROTOC protoc)
107*cc02d7e2SAndroid Build Coastguard Worker  else()
108*cc02d7e2SAndroid Build Coastguard Worker    set(_PROTOBUF_PROTOC $<TARGET_FILE:protobuf::protoc>)
109*cc02d7e2SAndroid Build Coastguard Worker  endif()
110*cc02d7e2SAndroid Build Coastguard Worker
111*cc02d7e2SAndroid Build Coastguard Worker  # Find gRPC installation
112*cc02d7e2SAndroid Build Coastguard Worker  # Looks for gRPCConfig.cmake file installed by gRPC's cmake installation.
113*cc02d7e2SAndroid Build Coastguard Worker  find_package(gRPC CONFIG REQUIRED)
114*cc02d7e2SAndroid Build Coastguard Worker  message(STATUS "Using gRPC ${gRPC_VERSION}")
115*cc02d7e2SAndroid Build Coastguard Worker
116*cc02d7e2SAndroid Build Coastguard Worker  set(_GRPC_GRPCPP gRPC::grpc++)
117*cc02d7e2SAndroid Build Coastguard Worker  if(CMAKE_CROSSCOMPILING)
118*cc02d7e2SAndroid Build Coastguard Worker    find_program(_GRPC_CPP_PLUGIN_EXECUTABLE grpc_cpp_plugin)
119*cc02d7e2SAndroid Build Coastguard Worker  else()
120*cc02d7e2SAndroid Build Coastguard Worker    set(_GRPC_CPP_PLUGIN_EXECUTABLE $<TARGET_FILE:gRPC::grpc_cpp_plugin>)
121*cc02d7e2SAndroid Build Coastguard Worker  endif()
122*cc02d7e2SAndroid Build Coastguard Workerendif()
123