Name Date Size #Lines LOC

..--

address_sorting/H25-Apr-2025-918610

cares/H25-Apr-2025-3,2061,019

objective_c/H25-Apr-2025-532327

py/H25-Apr-2025-449402

rake-compiler-dock/H25-Apr-2025-11491

toolchains/H25-Apr-2025-10,0579,600

upb/H25-Apr-2025-57,98645,991

utf8_range/H25-Apr-2025-5,0403,486

xxhash/H25-Apr-2025-5,6472,861

ABSEIL_MANUAL.mdH A D25-Apr-20251.2 KiB3122

BUILDH A D25-Apr-2025305 1615

README.mdH A D25-Apr-20258.8 KiB156113

constantly.BUILDH A D25-Apr-2025134 87

cython.BUILDH A D25-Apr-2025667 3026

enum34.BUILDH A D25-Apr-2025132 76

futures.BUILDH A D25-Apr-2025141 76

incremental.BUILDH A D25-Apr-2025178 1110

libprotobuf_mutator.BUILDH A D25-Apr-20251,011 3128

protobuf.patchH A D25-Apr-2025485 1513

protoc-gen-validate.patchH A D25-Apr-2025494 1514

six.BUILDH A D25-Apr-2025254 1512

twisted.BUILDH A D25-Apr-2025375 1615

yaml.BUILDH A D25-Apr-2025164 1110

zlib.BUILDH A D25-Apr-2025635 3736

zope_interface.BUILDH A D25-Apr-2025241 1413

README.md

1# Third-party libraries
2
3gRPC depends on several third-party libraries, their source code is available
4(usually as a git submodule) in this directory.
5
6## Guidelines on updating submodules
7
8- IMPORTANT: whenever possible, try to only update to a stable release of a library (= not to master / random commit). Depending on unreleased revisions
9  makes gRPC installation harder for users, as it forces them to always build the dependency from source and prevents them from using more
10  convenient installation channels (linux packages, package managers etc.)
11
12- bazel BUILD uses a different dependency model - whenever updating a submodule, also update the revision in `grpc_deps.bzl` so that bazel and
13  non-bazel builds stay in sync (this is actually enforced by a sanity check in some cases)
14
15## Considerations when adding a new third-party dependency
16
17- gRPC C++ needs to stay buildable/installable even if the submodules are not present (e.g. the tar.gz archive with gRPC doesn't contain the submodules),
18  assuming that the dependencies are already installed. This is a requirement for being able to provide a reasonable install process (e.g. using cmake)
19  and to support package managers for gRPC C++.
20    - CAVEAT: upb is an exception here because of its lack of cmake support. Therefore, third_party/upb should be present to build gRPC until upb supports it.
21
22- Adding a new dependency is a lot of work (both for us and for the users).
23  We currently support multiple build systems (BAZEL, cmake, make, ...) so adding a new dependency usually requires updates in multiple build systems
24  (often not trivial). The installation process also needs to continue to work (we do have distrib tests to test many of the possible installation scenarios,
25  but they are not perfect). Adding a new dependency also usually affects the installation instructions that need to be updated.
26  Also keep in mind that adding a new dependency can be quite disruptive
27  for the users and community - it means that all users will need to update their projects accordingly (for C++ projects often non-trivial) and
28  the community-provided C++ packages (e.g. vcpkg) will need to be updated as well.
29
30## Checklist for adding a new third-party dependency
31
32**READ THIS BEFORE YOU ADD A NEW DEPENDENCY**
33
34- [ ] Make sure you understand the hidden costs of adding a dependency (see section above) and that you understand the     complexities of updating the build files. Maintenance of the build files isn't for free, so expect to be involved in maintenance tasks, cleanup and support (e.g resolving user bugs) of the build files in the future.
35
36- [ ] Once your change is ready, start an [adhoc run of artifact - packages - distribtests flow](https://fusion.corp.google.com/projectanalysis/summary/KOKORO/prod%3Agrpc%2Fcore%2Fexperimental%2Fgrpc_build_artifacts_multiplatform) and make sure everything passes (for technical reasons, not all the distribtests can run on each PR automatically).
37
38- [ ] Check the impact of the new dependency on the size of our distribution packages (compare BEFORE and AFTER) and post the comparison on your PR (it should not be approved without checking the impact sizes of packages first). The package sizes AFTER can be obtained from the adhoc package build from bullet point above.
39
40## Instructions for updating dependencies
41
42Usually the process is
43
441. update the submodule to selected commit (see guidance above)
452. update the dependency in `grpc_deps.bzl` to the same commit
463. update `tools/run_tests/sanity/check_submodules.sh` to make the sanity test pass
474. (when needed) run `tools/buildgen/generate_projects.sh` to regenerate the generated files
485. populate the bazel download mirror by running `bazel/update_mirror.sh`
49
50Updating some dependencies requires extra care.
51
52### Updating third_party/abseil-cpp
53
54- Two additional steps should be done before running `generate_projects.sh` above.
55  - Running `src/abseil-cpp/preprocessed_builds.yaml.gen.py`.
56  - Updating `abseil_version =` scripts in `templates/gRPC-C++.podspec.template` and
57    `templates/gRPC-Core.podspec.template`.
58- You can see an example of previous [upgrade](https://github.com/grpc/grpc/pull/24270).
59
60### Updating third_party/boringssl-with-bazel
61
62NOTE: updating the boringssl dependency is now part of the internal grpc release tooling (see [go/grpc-release](http://go/grpc-release)).
63Prefer using the release tooling when possible. The instructions below are provided as a reference and aren't guaranteed to be up-to-date.
64
65- Update the `third_party/boringssl-with-bazel` submodule to the latest [`master-with-bazel`](https://github.com/google/boringssl/tree/master-with-bazel) branch
66```
67git submodule update --init      # just to start in a clean state
68cd third_party/boringssl-with-bazel
69git fetch origin   # fetch what's new in the boringssl repository
70git checkout origin/master-with-bazel  # checkout the current state of master-with-bazel branch in the boringssl repo
71# Note the latest commit SHA on master-with-bazel branch
72cd ../..   # go back to grpc repo root
73git status   #  will show that there are new commits in third_party/boringssl-with-bazel
74git add  third_party/boringssl-with-bazel     # we actually want to update the changes to the submodule
75git commit -m "update submodule boringssl-with-bazel with origin/master-with-bazel"   # commit
76```
77
78- Update boringssl dependency in `bazel/grpc_deps.bzl` to the same commit SHA as master-with-bazel branch
79    - Update `http_archive(name = "boringssl",` section by updating the sha in `strip_prefix` and `urls` fields.
80    - Also, set `sha256` field to "" as the existing value is not valid. This will be added later once we know what that value is.
81
82- Update `tools/run_tests/sanity/check_submodules.sh` with the same commit
83
84- Commit these changes `git commit -m "update boringssl dependency to master-with-bazel commit SHA"`
85
86- Run `tools/buildgen/generate_projects.sh` to regenerate the generated files
87    - Because `sha256` in `bazel/grpc_deps.bzl` was left empty, you will get a DEBUG msg like this one:
88      ```
89      Rule 'boringssl' indicated that a canonical reproducible form can be obtained by modifying arguments sha256 = "SHA value"
90      ```
91    - Commit the regenrated files `git commit -m "regenerate files"`
92    - Update `bazel/grpc_deps.bzl` with the SHA value shown in the above debug msg. Commit again `git commit -m "Updated sha256"`
93
94- Run `tools/distrib/generate_boringssl_prefix_header.sh`
95    - Commit again `git commit -m "generate boringssl prefix headers"`
96
97- Increment the boringssl podspec version number in
98  `templates/src/objective-c/BoringSSL-GRPC.podspec.template` and `templates/gRPC-Core.podspec.template`.
99  [example](https://github.com/grpc/grpc/pull/21527/commits/9d4411842f02f167209887f1f3d2b9ab5d14931a)
100    - Commit again `git commit -m "Increment podspec version"`
101
102- Run `tools/buildgen/generate_projects.sh` (yes, again)
103    - Commit again `git commit -m "Second regeneration"`
104
105- Create a PR with all the above commits.
106
107- Run `bazel/update_mirror.sh` to update GCS mirror.
108
109### Updating third_party/protobuf
110
111Updating the protobuf dependency is now part of the internal release process (see [go/grpc-release](http://go/grpc-release)).
112
113### Updating third_party/envoy-api
114
115Apart from the above steps, please run `tools/codegen/core/gen_upb_api.sh` to regenerate upb files.
116
117### Updating third_party/upb
118
119Since upb is vendored in the gRPC repo, you cannot use submodule to update it. Please follow the steps below;
1201. Update third_party/upb directory by running
121   - `export GRPC_ROOT=~/git/grpc`
122   - `wget https://github.com/protocolbuffers/protobuf/releases/download/v25.1/protobuf-25.1.zip`
123   - `rm -rf $GRPC_ROOT/third_party/upb`
124   - `unzip protobuf-25.1.zip -d /tmp/protobuf`
125   - `cp -r /tmp/protobuf/protobuf-25.1/upb $GRPC_ROOT/third_party/upb`
1262. Update the dependency in `grpc_deps.bzl` to the same commit
1273. Populate the bazel download mirror by running `bazel/update_mirror.sh`
1284. Run `tools/buildgen/generate_projects.sh` to regenerate the generated files
1295. Run `tools/codegen/core/gen_upb_api.sh` to regenerate upb files.
130
131### Updating third_party/utf8_range
132
133```
134# set to wherever your grpc repo lives
135export GRPC_ROOT=~/git/grpc
136wget https://github.com/protocolbuffers/utf8_range/archive/refs/heads/main.zip
137rm -rf $GRPC_ROOT/third_party/utf8_range
138unzip main.zip -d $GRPC_ROOT/third_party
139mv $GRPC_ROOT/third_party/utf8_range-main $GRPC_ROOT/third_party/utf8_range
140```
141
142### Updating third_party/xxhash
143
144TODO(https://github.com/Cyan4973/xxHash/issues/548): revisit LICENSE
145instructions if upstream splits library and CLI.
146
147The upstream xxhash repository contains a bunch of files that we don't want, so
148we employ a rather manual update flow to pick up just the bits we care about:
149
150```
151git remote add xxhash https://github.com/Cyan4973/xxHash.git
152git fetch xxhash
153git show xxhash/dev:xxhash.h > third_party/xxhash/xxhash.h
154git show xxhash/dev:LICENSE | sed -nE '/^-+$/q;p' > third_party/xxhash/LICENSE
155```
156