xref: /aosp_15_r20/external/grpc-grpc/src/cpp/README.md (revision cc02d7e222339f7a4f6ba5f422e6413f4bd931f2)
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