1*cc02d7e2SAndroid Build Coastguard Worker# gRPC C++ 2*cc02d7e2SAndroid Build Coastguard Worker 3*cc02d7e2SAndroid Build Coastguard WorkerThis directory contains the C++ implementation of gRPC. 4*cc02d7e2SAndroid Build Coastguard Worker 5*cc02d7e2SAndroid Build Coastguard Worker# To start using gRPC C++ 6*cc02d7e2SAndroid Build Coastguard Worker 7*cc02d7e2SAndroid Build Coastguard WorkerThis section describes how to add gRPC as a dependency to your C++ project. 8*cc02d7e2SAndroid Build Coastguard Worker 9*cc02d7e2SAndroid Build Coastguard WorkerIn the C++ world, there's no universally accepted standard for managing project dependencies. 10*cc02d7e2SAndroid Build Coastguard WorkerTherefore, gRPC supports several major build systems, which should satisfy most users. 11*cc02d7e2SAndroid Build Coastguard Worker 12*cc02d7e2SAndroid Build Coastguard Worker## Supported Platforms 13*cc02d7e2SAndroid Build Coastguard Worker 14*cc02d7e2SAndroid Build Coastguard Worker* Officially Supported: These platforms are officially supported. We follow 15*cc02d7e2SAndroid Build Coastguard Worker [the OSS Foundational C++ Support Policy](https://opensource.google/documentation/policies/cplusplus-support) 16*cc02d7e2SAndroid Build Coastguard Worker to choose platforms to support. 17*cc02d7e2SAndroid Build Coastguard Worker We test our code on these platform and have automated continuous integration tests for 18*cc02d7e2SAndroid Build Coastguard Worker them. 19*cc02d7e2SAndroid Build Coastguard Worker . 20*cc02d7e2SAndroid Build Coastguard Worker 21*cc02d7e2SAndroid Build Coastguard Worker* Best Effort: We do not have continous integration tests for these, but we are 22*cc02d7e2SAndroid Build Coastguard Worker fairly confident that gRPC C++ would work on them. We will make our best 23*cc02d7e2SAndroid Build Coastguard Worker effort to support them, and we welcome patches for such platforms, but we 24*cc02d7e2SAndroid Build Coastguard Worker might need to declare bankruptcy on some issues. 25*cc02d7e2SAndroid Build Coastguard Worker 26*cc02d7e2SAndroid Build Coastguard Worker* Community Supported: These platforms are supported by contributions from the 27*cc02d7e2SAndroid Build Coastguard Worker open source community, there is no official support for them. Breakages on 28*cc02d7e2SAndroid Build Coastguard Worker these platforms may go unnoticed, and the community is responsible for all 29*cc02d7e2SAndroid Build Coastguard Worker maintenance. Unmaintained code for these platforms may be deleted. 30*cc02d7e2SAndroid Build Coastguard Worker 31*cc02d7e2SAndroid Build Coastguard Worker| Operating System | Architectures | Versions | Support Level | 32*cc02d7e2SAndroid Build Coastguard Worker|------------------|---------------|----------|---------------| 33*cc02d7e2SAndroid Build Coastguard Worker| Linux - Debian, Ubuntu, CentOS | x86, x64 | clang 7+, GCC 7.3+ | Officially Supported | 34*cc02d7e2SAndroid Build Coastguard Worker| Windows 10+ | x86, x64 | Visual Studio 2019+ | Officially Supported | 35*cc02d7e2SAndroid Build Coastguard Worker| MacOS | x64, ARM64 | XCode 12+ | Officially Supported | 36*cc02d7e2SAndroid Build Coastguard Worker| Linux - Others | x86, x64 | clang 7+, GCC 7.3+ | Best Effort | 37*cc02d7e2SAndroid Build Coastguard Worker| Linux | ARM64 | | Best Effort | 38*cc02d7e2SAndroid Build Coastguard Worker| iOS | | | Best Effort | 39*cc02d7e2SAndroid Build Coastguard Worker| Android | | | Best Effort | 40*cc02d7e2SAndroid Build Coastguard Worker| AIX | | | Community Supported | 41*cc02d7e2SAndroid Build Coastguard Worker| Asylo | | | Community Supported | 42*cc02d7e2SAndroid Build Coastguard Worker| FreeBSD | | | Community Supported | 43*cc02d7e2SAndroid Build Coastguard Worker| Fuchsia | | | Community Supported | 44*cc02d7e2SAndroid Build Coastguard Worker| NaCL | | | Community Supported | 45*cc02d7e2SAndroid Build Coastguard Worker| NetBSD | | | Community Supported | 46*cc02d7e2SAndroid Build Coastguard Worker| OpenBSD | | | Community Supported | 47*cc02d7e2SAndroid Build Coastguard Worker| Solaris | | | Community Supported | 48*cc02d7e2SAndroid Build Coastguard Worker 49*cc02d7e2SAndroid Build Coastguard Worker## Bazel 50*cc02d7e2SAndroid Build Coastguard Worker 51*cc02d7e2SAndroid Build Coastguard WorkerBazel is the primary build system used by the core gRPC development team. Bazel 52*cc02d7e2SAndroid Build Coastguard Workerprovides fast builds and it easily handles dependencies that support bazel. 53*cc02d7e2SAndroid Build Coastguard Worker 54*cc02d7e2SAndroid Build Coastguard WorkerTo add gRPC as a dependency in bazel: 55*cc02d7e2SAndroid Build Coastguard Worker1. determine commit SHA for the grpc release you want to use 56*cc02d7e2SAndroid Build Coastguard Worker2. Use the [http_archive](https://docs.bazel.build/versions/master/repo/http.html#http_archive) bazel rule to include gRPC source 57*cc02d7e2SAndroid Build Coastguard Worker ``` 58*cc02d7e2SAndroid Build Coastguard Worker http_archive( 59*cc02d7e2SAndroid Build Coastguard Worker name = "com_github_grpc_grpc", 60*cc02d7e2SAndroid Build Coastguard Worker urls = [ 61*cc02d7e2SAndroid Build Coastguard Worker "https://github.com/grpc/grpc/archive/YOUR_GRPC_COMMIT_SHA.tar.gz", 62*cc02d7e2SAndroid Build Coastguard Worker ], 63*cc02d7e2SAndroid Build Coastguard Worker strip_prefix = "grpc-YOUR_GRPC_COMMIT_SHA", 64*cc02d7e2SAndroid Build Coastguard Worker ) 65*cc02d7e2SAndroid Build Coastguard Worker load("@com_github_grpc_grpc//bazel:grpc_deps.bzl", "grpc_deps") 66*cc02d7e2SAndroid Build Coastguard Worker grpc_deps() 67*cc02d7e2SAndroid Build Coastguard Worker load("@com_github_grpc_grpc//bazel:grpc_extra_deps.bzl", "grpc_extra_deps") 68*cc02d7e2SAndroid Build Coastguard Worker grpc_extra_deps() 69*cc02d7e2SAndroid Build Coastguard Worker ``` 70*cc02d7e2SAndroid Build Coastguard Worker 71*cc02d7e2SAndroid Build Coastguard Worker## CMake 72*cc02d7e2SAndroid Build Coastguard Worker 73*cc02d7e2SAndroid Build Coastguard Worker`cmake` is your best option if you cannot use bazel. It supports building on Linux, 74*cc02d7e2SAndroid Build Coastguard WorkerMacOS and Windows (official support) but also has a good chance of working on 75*cc02d7e2SAndroid Build Coastguard Workerother platforms (no promises!). `cmake` has good support for crosscompiling and 76*cc02d7e2SAndroid Build Coastguard Workercan be used for targeting the Android platform. 77*cc02d7e2SAndroid Build Coastguard Worker 78*cc02d7e2SAndroid Build Coastguard WorkerTo build gRPC C++ from source, follow the [BUILDING guide](../../BUILDING.md). 79*cc02d7e2SAndroid Build Coastguard Worker 80*cc02d7e2SAndroid Build Coastguard Worker### find_package 81*cc02d7e2SAndroid Build Coastguard Worker 82*cc02d7e2SAndroid Build Coastguard WorkerThe canonical way to discover dependencies in CMake is the 83*cc02d7e2SAndroid Build Coastguard Worker[`find_package` command](https://cmake.org/cmake/help/latest/command/find_package.html). 84*cc02d7e2SAndroid Build Coastguard Worker 85*cc02d7e2SAndroid Build Coastguard Worker```cmake 86*cc02d7e2SAndroid Build Coastguard Workerfind_package(gRPC CONFIG REQUIRED) 87*cc02d7e2SAndroid Build Coastguard Workeradd_executable(my_exe my_exe.cc) 88*cc02d7e2SAndroid Build Coastguard Workertarget_link_libraries(my_exe gRPC::grpc++) 89*cc02d7e2SAndroid Build Coastguard Worker``` 90*cc02d7e2SAndroid Build Coastguard Worker[Full example](../../examples/cpp/helloworld/CMakeLists.txt) 91*cc02d7e2SAndroid Build Coastguard Worker 92*cc02d7e2SAndroid Build Coastguard Worker`find_package` can only find software that has already been installed on your 93*cc02d7e2SAndroid Build Coastguard Workersystem. In practice that means you'll need to install gRPC using cmake first. 94*cc02d7e2SAndroid Build Coastguard WorkergRPC's cmake support provides the option to install gRPC either system-wide 95*cc02d7e2SAndroid Build Coastguard Worker(not recommended) or under a directory prefix in a way that you can later 96*cc02d7e2SAndroid Build Coastguard Workereasily use it with the `find_package(gRPC CONFIG REQUIRED)` command. 97*cc02d7e2SAndroid Build Coastguard Worker 98*cc02d7e2SAndroid Build Coastguard WorkerThe following sections describe strategies to automatically build gRPC 99*cc02d7e2SAndroid Build Coastguard Workeras part of your project. 100*cc02d7e2SAndroid Build Coastguard Worker 101*cc02d7e2SAndroid Build Coastguard Worker### FetchContent 102*cc02d7e2SAndroid Build Coastguard WorkerIf you are using CMake v3.11 or newer you should use CMake's 103*cc02d7e2SAndroid Build Coastguard Worker[FetchContent module](https://cmake.org/cmake/help/latest/module/FetchContent.html). 104*cc02d7e2SAndroid Build Coastguard WorkerThe first time you run CMake in a given build directory, FetchContent will 105*cc02d7e2SAndroid Build Coastguard Workerclone the gRPC repository and its submodules. `FetchContent_MakeAvailable()` 106*cc02d7e2SAndroid Build Coastguard Workeralso sets up an `add_subdirectory()` rule for you. This causes gRPC to be 107*cc02d7e2SAndroid Build Coastguard Workerbuilt as part of your project. 108*cc02d7e2SAndroid Build Coastguard Worker 109*cc02d7e2SAndroid Build Coastguard Worker```cmake 110*cc02d7e2SAndroid Build Coastguard Workercmake_minimum_required(VERSION 3.15) 111*cc02d7e2SAndroid Build Coastguard Workerproject(my_project) 112*cc02d7e2SAndroid Build Coastguard Worker 113*cc02d7e2SAndroid Build Coastguard Workerinclude(FetchContent) 114*cc02d7e2SAndroid Build Coastguard WorkerFetchContent_Declare( 115*cc02d7e2SAndroid Build Coastguard Worker gRPC 116*cc02d7e2SAndroid Build Coastguard Worker GIT_REPOSITORY https://github.com/grpc/grpc 117*cc02d7e2SAndroid Build Coastguard Worker GIT_TAG RELEASE_TAG_HERE # e.g v1.28.0 118*cc02d7e2SAndroid Build Coastguard Worker) 119*cc02d7e2SAndroid Build Coastguard Workerset(FETCHCONTENT_QUIET OFF) 120*cc02d7e2SAndroid Build Coastguard WorkerFetchContent_MakeAvailable(gRPC) 121*cc02d7e2SAndroid Build Coastguard Worker 122*cc02d7e2SAndroid Build Coastguard Workeradd_executable(my_exe my_exe.cc) 123*cc02d7e2SAndroid Build Coastguard Workertarget_link_libraries(my_exe grpc++) 124*cc02d7e2SAndroid Build Coastguard Worker``` 125*cc02d7e2SAndroid Build Coastguard Worker 126*cc02d7e2SAndroid Build Coastguard WorkerNote that you need to 127*cc02d7e2SAndroid Build Coastguard Worker[install the prerequisites](../../BUILDING.md#pre-requisites) 128*cc02d7e2SAndroid Build Coastguard Workerbefore building gRPC. 129*cc02d7e2SAndroid Build Coastguard Worker 130*cc02d7e2SAndroid Build Coastguard Worker### git submodule 131*cc02d7e2SAndroid Build Coastguard WorkerIf you cannot use FetchContent, another approach is to add the gRPC source tree 132*cc02d7e2SAndroid Build Coastguard Workerto your project as a 133*cc02d7e2SAndroid Build Coastguard Worker[git submodule](https://git-scm.com/book/en/v2/Git-Tools-Submodules). 134*cc02d7e2SAndroid Build Coastguard WorkerYou can then add it to your CMake project with `add_subdirectory()`. 135*cc02d7e2SAndroid Build Coastguard Worker[Example](../../examples/cpp/helloworld/CMakeLists.txt) 136*cc02d7e2SAndroid Build Coastguard Worker 137*cc02d7e2SAndroid Build Coastguard Worker### Support system-installed gRPC 138*cc02d7e2SAndroid Build Coastguard Worker 139*cc02d7e2SAndroid Build Coastguard WorkerIf your project builds gRPC you should still consider the case where a user 140*cc02d7e2SAndroid Build Coastguard Workerwants to build your software using a previously installed gRPC. Here's a 141*cc02d7e2SAndroid Build Coastguard Workercode snippet showing how this is typically done. 142*cc02d7e2SAndroid Build Coastguard Worker 143*cc02d7e2SAndroid Build Coastguard Worker```cmake 144*cc02d7e2SAndroid Build Coastguard Workeroption(USE_SYSTEM_GRPC "Use system installed gRPC" OFF) 145*cc02d7e2SAndroid Build Coastguard Workerif(USE_SYSTEM_GRPC) 146*cc02d7e2SAndroid Build Coastguard Worker # Find system-installed gRPC 147*cc02d7e2SAndroid Build Coastguard Worker find_package(gRPC CONFIG REQUIRED) 148*cc02d7e2SAndroid Build Coastguard Workerelse() 149*cc02d7e2SAndroid Build Coastguard Worker # Build gRPC using FetchContent or add_subdirectory 150*cc02d7e2SAndroid Build Coastguard Workerendif() 151*cc02d7e2SAndroid Build Coastguard Worker``` 152*cc02d7e2SAndroid Build Coastguard Worker 153*cc02d7e2SAndroid Build Coastguard Worker[Full example](../../examples/cpp/helloworld/CMakeLists.txt) 154*cc02d7e2SAndroid Build Coastguard Worker 155*cc02d7e2SAndroid Build Coastguard Worker## pkg-config 156*cc02d7e2SAndroid Build Coastguard Worker 157*cc02d7e2SAndroid Build Coastguard WorkerIf your project does not use CMake (e.g. you're using `make` directly), you can 158*cc02d7e2SAndroid Build Coastguard Workerfirst install gRPC C++ using CMake, and have your non-CMake project rely on the 159*cc02d7e2SAndroid Build Coastguard Worker`pkgconfig` files which are provided by gRPC installation. 160*cc02d7e2SAndroid Build Coastguard Worker[Example](../../test/distrib/cpp/run_distrib_test_cmake_pkgconfig.sh) 161*cc02d7e2SAndroid Build Coastguard Worker 162*cc02d7e2SAndroid Build Coastguard Worker**Note for CentOS 7 users** 163*cc02d7e2SAndroid Build Coastguard Worker 164*cc02d7e2SAndroid Build Coastguard WorkerCentOS-7 ships with `pkg-config` 0.27.1, which has a 165*cc02d7e2SAndroid Build Coastguard Worker[bug](https://bugs.freedesktop.org/show_bug.cgi?id=54716) that can make 166*cc02d7e2SAndroid Build Coastguard Workerinvocations take extremely long to complete. If you plan to use `pkg-config`, 167*cc02d7e2SAndroid Build Coastguard Workeryou'll want to upgrade it to something newer. 168*cc02d7e2SAndroid Build Coastguard Worker 169*cc02d7e2SAndroid Build Coastguard Worker## make (deprecated) 170*cc02d7e2SAndroid Build Coastguard Worker 171*cc02d7e2SAndroid Build Coastguard WorkerThe default choice for building on UNIX based systems used to be `make`, but we are no longer recommending it. 172*cc02d7e2SAndroid Build Coastguard WorkerYou should use `bazel` or `cmake` instead. 173*cc02d7e2SAndroid Build Coastguard Worker 174*cc02d7e2SAndroid Build Coastguard WorkerTo install gRPC for C++ on your system using `make`, follow the [Building gRPC C++](../../BUILDING.md) 175*cc02d7e2SAndroid Build Coastguard Workerinstructions to build from source and then install locally using `make install`. 176*cc02d7e2SAndroid Build Coastguard WorkerThis also installs the protocol buffer compiler `protoc` (if you don't have it already), 177*cc02d7e2SAndroid Build Coastguard Workerand the C++ gRPC plugin for `protoc`. 178*cc02d7e2SAndroid Build Coastguard Worker 179*cc02d7e2SAndroid Build Coastguard WorkerWARNING: After installing with `make install` there is no easy way to uninstall, which can cause issues 180*cc02d7e2SAndroid Build Coastguard Workerif you later want to remove the grpc and/or protobuf installation or upgrade to a newer version. 181*cc02d7e2SAndroid Build Coastguard Worker 182*cc02d7e2SAndroid Build Coastguard Worker## Packaging systems 183*cc02d7e2SAndroid Build Coastguard Worker 184*cc02d7e2SAndroid Build Coastguard WorkerWe do not officially support any packaging system for C++, but there are some community-maintained packages that are kept up-to-date 185*cc02d7e2SAndroid Build Coastguard Workerand are known to work well. More contributions and support for popular packaging systems are welcome! 186*cc02d7e2SAndroid Build Coastguard Worker 187*cc02d7e2SAndroid Build Coastguard Worker### Install using vcpkg package 188*cc02d7e2SAndroid Build Coastguard WorkergRPC is available using the [vcpkg](https://github.com/Microsoft/vcpkg) dependency manager: 189*cc02d7e2SAndroid Build Coastguard Worker 190*cc02d7e2SAndroid Build Coastguard Worker``` 191*cc02d7e2SAndroid Build Coastguard Worker# install vcpkg package manager on your system using the official instructions 192*cc02d7e2SAndroid Build Coastguard Workergit clone https://github.com/Microsoft/vcpkg.git 193*cc02d7e2SAndroid Build Coastguard Workercd vcpkg 194*cc02d7e2SAndroid Build Coastguard Worker 195*cc02d7e2SAndroid Build Coastguard Worker# Bootstrap on Linux: 196*cc02d7e2SAndroid Build Coastguard Worker./bootstrap-vcpkg.sh 197*cc02d7e2SAndroid Build Coastguard Worker# Bootstrap on Windows instead: 198*cc02d7e2SAndroid Build Coastguard Worker# ./bootstrap-vcpkg.bat 199*cc02d7e2SAndroid Build Coastguard Worker 200*cc02d7e2SAndroid Build Coastguard Worker./vcpkg integrate install 201*cc02d7e2SAndroid Build Coastguard Worker 202*cc02d7e2SAndroid Build Coastguard Worker# install gRPC using vcpkg package manager 203*cc02d7e2SAndroid Build Coastguard Worker./vcpkg install grpc 204*cc02d7e2SAndroid Build Coastguard Worker``` 205*cc02d7e2SAndroid Build Coastguard Worker 206*cc02d7e2SAndroid Build Coastguard WorkerThe gRPC port in vcpkg is kept up to date by Microsoft team members and community contributors. If the version is out of date, please [create an issue or pull request](https://github.com/Microsoft/vcpkg) on the vcpkg repository. 207*cc02d7e2SAndroid Build Coastguard Worker 208*cc02d7e2SAndroid Build Coastguard Worker 209*cc02d7e2SAndroid Build Coastguard Worker## Examples & Additional Documentation 210*cc02d7e2SAndroid Build Coastguard Worker 211*cc02d7e2SAndroid Build Coastguard WorkerYou can find out how to build and run our simplest gRPC C++ example in our 212*cc02d7e2SAndroid Build Coastguard Worker[C++ quick start](../../examples/cpp). 213*cc02d7e2SAndroid Build Coastguard Worker 214*cc02d7e2SAndroid Build Coastguard WorkerFor more detailed documentation on using gRPC in C++ , see our main 215*cc02d7e2SAndroid Build Coastguard Workerdocumentation site at [grpc.io](https://grpc.io), specifically: 216*cc02d7e2SAndroid Build Coastguard Worker 217*cc02d7e2SAndroid Build Coastguard Worker* [Overview](https://grpc.io/docs): An introduction to gRPC with a simple 218*cc02d7e2SAndroid Build Coastguard Worker Hello World example in all our supported languages, including C++. 219*cc02d7e2SAndroid Build Coastguard Worker* [gRPC Basics - C++](https://grpc.io/docs/languages/cpp/basics): 220*cc02d7e2SAndroid Build Coastguard Worker A tutorial that steps you through creating a simple gRPC C++ example 221*cc02d7e2SAndroid Build Coastguard Worker application. 222*cc02d7e2SAndroid Build Coastguard Worker* [Asynchronous Basics - C++](https://grpc.io/docs/languages/cpp/async): 223*cc02d7e2SAndroid Build Coastguard Worker A tutorial that shows you how to use gRPC C++'s asynchronous/non-blocking 224*cc02d7e2SAndroid Build Coastguard Worker APIs. 225*cc02d7e2SAndroid Build Coastguard Worker 226*cc02d7e2SAndroid Build Coastguard Worker 227*cc02d7e2SAndroid Build Coastguard Worker# To start developing gRPC C++ 228*cc02d7e2SAndroid Build Coastguard Worker 229*cc02d7e2SAndroid Build Coastguard WorkerFor instructions on how to build gRPC C++ from source, follow the [Building gRPC C++](../../BUILDING.md) instructions. 230