1Name: Protocol Buffers 2Short Name: protobuf 3URL: https://github.com/google/protobuf 4License: BSD-3-Clause 5License File: LICENSE 6Version: 21.12 7CPEPrefix: cpe:/a:google:protobuf:21.12 8Revision: f0dc78d7e6e331b8c6bb2d5283e06aa26883ca7c 9Security Critical: yes 10Shipped: yes 11 12Steps used to create the current version (or roll a newer one): 130. Nuke third_party/protobuf from orbit (rm -rf `third_party/protobuf`). Note 14 that this removes this README.chromium so you may want it open in code search 15 or remember the steps up until 2. where you get it back. 16 171. Pull the release from https://github.com/google/protobuf/releases (Source 18 code .tar.gz). Extract to `third_party/protobuf` (without version suffix), 19 i.e. you may `$ mv protobuf-21.12 third_party/protobuf` or similar. 20 212. Add back chromium's non-upstream files (from this directory): 22 23 $ git checkout main BUILD.gn DEPS DIR_METADATA OWNERS README.chromium \ 24 gen_chromium_file_lists.py gen_extra_chromium_files.py proto_library.gni \ 25 patches/ 26 27 Note: Ideally we wouldn't do this but instead have a 28 `third_party/protobuf/src/` subdirectory where upstream code goes directly 29 into. That will require updating things outside this repository (at least 30 `third_party/webrtc`) to agree on where the source code lives. I wouldn't be 31 surprised if that also required Google-internal uses of protobuf from webrtc 32 to also agree on `third_party/protobuf/src` so maybe this'll never happen? 33 Here be dragons. Probably. 34 35 Probably worth making a local `git commit` here before applying patches (next 36 step). 37 383. Apply patches in patches/ (see the description below): 39 40 $ for patch in patches/*; do patch -s -p1 < $patch; done 41 42 When a patch fails, it's probably best to check out previous state (from 3) 43 for any changes not inside the patches/ folder, fix the patch and then try to 44 reapply everything. It's not a good idea to fix the error, forget to generate 45 a patch and leave patches/ in a bad state. 46 47 If a patch no longer applies it may not be needed, if so remove it and its 48 description in this README.chromium file. Similarly try to eventually 49 upstream any patches out of band from unblocking the roll so we can 50 eventually remove it here as well. 51 52 Probably worth committing locally here too. 53 544. Generate `proto_sources.gni` using the script `./gen_chromium_file_lists.py`. 55 56 Add and commit `proto_sources.gni`, 57 585. Generate descriptor_pb2.py using the script "gen_extra_chromium_files.py" in 59 the same directory as this file. 60 61 $ ./gen_extra_chromium_files.py -C ../../out/Default 62 63 Add and commit `python/google/protobuf/descriptor_pb2.py` and 64 `python/google/protobuf/compiler/plugin_pb2.py` as well. 65 666. Update Version, CPEPrefix and Revision in this file. 67 68Notes (hints) for the next roll(er): 69 70* This is probably harder to roll than most things you've rolled in the past. 71 Good luck! Also please reach out for help proactively. The current roll as of 72 writing this required help from multiple very-senior people to even figure out 73 what was broken in the first place. `protobuf` rolling is not in a good place. 74* Update README.chromium as you go so you don't forget (after step 2. above, so 75 you don't nuke those changes). 76* Rolling one version of protobuf likely introduces a large amount of changes. 77 We should possibly figure out if it's reasonable to stay close to tip of tree 78 and roll frequently rather than use released versions. Sharp corners here 79 likely include that the version is encoded in protobuf output and I (pbos@) 80 don't know if that version tag changes immediately on format incompatibilities 81 or get bumped every time something format incompatible is introduced. 82* After v3.20 protobuf-javascript/ split out from upstream protobuf/. You may 83 need to be aware of both repositories. Also upstream protobuf/ seems to move 84 faster / out of sync with protobuf-javascript/. Hopefully that doesn't cause 85 format incompatibilities in the future (protobuf/ supports something we need 86 that protobuf-javascript/ doesn't). 87* Any argument changes to `protoc_wrapper` in `third_party/protobuf/BUILD.gn` 88 may require updating `build/config/siso/protoc_wrapper.star` as well. 89* We've seen instances where instead of rolling protobuf a local copy of a new 90 built-in type has been checked in. When that happens you may see ODR 91 violations as your built-in type is defined in multiple files. If that happens 92 you may want to move the copy that should never have been checked in into its 93 own namespace, complete the roll and then cleanup the local copy. 94 95Note about vpython: 96 97Some Python scripts end up mixing protoc output from this copy of protobuf with 98the google.protobuf module from vpython's protobuf. If Python scripts break due 99to the vpython copy of protobuf, you may need to update the version in 100//.vpython3. See https://crbug.com/1320047. 101 102Description of the patches: 103 104- 0004-fix-shared-library-exports.patch 105 106 This patch allows exporting protobuf symbols in Linux .so libraries, so 107 that protobuf can be built as a component (see http://crrev.com/179806). 108 109- 0008-uninline_get_empty_string.patch 110- 0010-uninline-generated-code.patch 111 112 These patches uninline some functions, resulting in a significant reduction 113 (somewhere between 500 KB and 1 MB) of binary size. 114 115- 0021-Fix-protobuf-s-library-.gitinore-file.patch 116 117 Un-ignores python/google/protobuf/descriptor_pb2.py and 118 python/google/protobuf/compiler/plugin_pb2.py 119 120- 0022-Allow-deprecated-fields.patch 121 122 Allows deprecated fields to be used without extra C++ compiler warnings. 123 124- 0026-remove-sprintf.patch 125 126 Imports 127 https://github.com/protocolbuffers/protobuf/commit/c0fc2e881bc36aafb0bf539bf41889611370f60c 128 to remove use of sprintf. 129 130- 0027-no-noreturn.patch 131 132 Removes an instance of [[noreturn]]. The attribute is correct, but the way 133 protobuf's GOOGLE_LOG(FATAL) is defined, the compiler can't see this and it 134 trips -Winvalid-noreturn. See https://github.com/protocolbuffers/protobuf/issues/9817 135 136- 0029-make-initializers-optimizable.patch 137 138 Makes the InitProtobufDefaults() static initializer optimizable by Clang when 139 built with libc++. It patches out the OnShutdownDestroyString call, which we 140 do not need, and removes the thread-safe initialization. Thread safety is only 141 needed if a static initializer spawns a thread which then calls 142 InitProtobufDefaults() without synchronizing with the start of main(). 143 (Anything which happens after main() starts can rely on the initializer 144 running.) 145 146- 0030-workaround-window-constinit.patch 147 148 Disables PROTOBUF_CONSTINIT in generated code in Windows shared library 149 builds. Protobuf's default instances take pointers to a dllimport variable, 150 fixed_address_empty_string. This is not constinit on Windows. This is a bug in 151 protobuf as the default instance was intended to be constant-initialized. But 152 the components build in Chromium is a developer configuration, so we tolerate 153 an initializer as long as the build works, until protobuf has a proper fix. 154 155 See https://github.com/protocolbuffers/protobuf/issues/10159. 156 157- 0031-workaround-cfi-unrelated-cast.patch 158 159 A workaround for Clang's Control Flow Integrity check for casting pointers to 160 memory that his not yet initialized to be of that type for empty arrays, does 161 not work, and still fails. This patch removes the workaround and instead 162 disables cfi-unrelated-cast for the affected methods and simplifies them. 163 164 See https://github.com/protocolbuffers/protobuf/issues/10186. 165 See https://bugs.chromium.org/p/chromium/issues/detail?id=1294200#c26. 166 167- 0032-cxx20.patch 168 169 Fixes necessary to build in --std=c++20 mode. 170 171 Imports https://critique.corp.google.com/cl/451177197 (a portion of 172 https://github.com/protocolbuffers/protobuf/commit/6dd8af4ecfa7987bddb309862932886b84f1e4ef 173 ). 174 175- 0033-no-enum-conversion-warn.patch 176 177 Avoid hitting the clang error -Wenum-constexpr-conversion by specifying width 178 of the enum. 179 180 Imports https://critique.corp.google.com/cl/466986872. 181 182- 0034-change-macro-to-avoid-pedantic-warning.patch 183 184 Avoid hitting -Wextra-semi. 185 186 Imports (rebased): 187 https://github.com/protocolbuffers/protobuf/commit/def602dd07b7eae1cac6823705975317b5607fc3 188 189- 0035-fix-shared-library-constants 190 191 Fixes for component build when building with MediaPipe. AnyMetadata::PackFrom 192 is called which require string constants to be exported. 193 194- 0036-fix-undefined-memcpy-call.patch 195 196 Fixes an undefined call to memcpy which may be passed NULL, 0. NULL, 0 is 197 forbidden in C, due to a mistake in the C language specification. This 198 partially integrates 199 https://github.com/protocolbuffers/protobuf/commit/b2e1d7d8a1b1959c782595cd815c22fb690ac8e2 200 from upstream and may be removed when protobuf is updated past that commit. 201 202- 0037-fix-wextra-semi.patch 203 204 Removes an extra semicolon, fixed in upstream 205 https://github.com/protocolbuffers/protobuf/commit/3e6f8ee152db71ae49cc95649feab50d2faacdfa 206 207- 0038-silence-implicit-precision-loss.patch 208 209 Silences -Wshorten-64-to-32 for now. Fixed in upstream 210 https://github.com/protocolbuffers/protobuf/commit/d85c9944c55fb38f4eae149979a0f680ea125ecb 211 212- 0039-generate-mediapipe-anylite.patch 213 214 Workaround to allow generating protobuf code compatible with 215 third_party/mediapipe. This replaces checked-in precompiled .pb.cc files. See 216 https://crbug.com/332939935, which when/if resolved should make this patch 217 obsolete. 218 219- 0040-fix-ndk-major.patch 220 221 Fix Android compile error that affects webrtc. Fixed in upstream 222 https://github.com/protocolbuffers/protobuf/commit/9471a882256eaf01027524e8b6c15cbb5e42bef6 223