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