| # Updating protobuf |
| |
| You will create and merge the following Pull Requests. |
| |
| ## 1st PR: add the new protobuf version to the Bazel tree |
| |
| 1. Fetch the desired protobuf version and copy it in a folder `new_proto` under |
| `third_party/protobuf`. |
| |
| **Example:** to upgrade to 3.6.1, download and unpack |
| [protobuf-all-3.6.1.zip](https://github.com/protocolbuffers/protobuf/releases/download/v3.6.1/protobuf-all-3.6.1.zip). |
| |
| 1. Build the Java proto library from source and, in case you cloned an upstream version |
| of protobuf, remove the .git folders: |
| |
| ``` |
| cd third_party/protobuf/new_proto |
| bazel build :protobuf_java :protobuf_java_util |
| cp bazel-bin/libprotobuf_java.jar . |
| cp bazel-bin/libprotobuf_java_util.jar . |
| bazel clean --expunge |
| rm -rf .git .gitignore .gitmodules |
| ``` |
| |
| **Reason:** Bazel uses upstream protobuf from source, except for Java, as Bazel's bootstrapping |
| scripts currently don't build protobuf Java when bootstrapping Bazel but use pre-built jars |
| instead. |
| |
| 1. Modify protobuf's `BUILD` file to not build java from source, but to use the jars instead: |
| |
| 1. In the BUILD file delete the rules listed under `Java support`. |
| |
| 1. From the `third_party/protobuf/<old_proto>/BUILD` file copy the rules under the |
| "Modifications made by bazel" section to the new BUILD file. The java rules in there should |
| have the same names as the ones you just deleted under "Java support". You might need to |
| update the names of the jars in the rules sources to the ones you just build. |
| |
| 1. Copy `third_party/protobuf/<old_proto>/com_google_protobuf_java.BUILD` to the new directory. |
| |
| 1. From `third_party/protobuf/<old_proto>/util/python/BUILD`, |
| `third_party/protobuf/<old_proto>/examples/BUILD`, and |
| `third_party/protobuf/<old_proto>/third_party/googletest/BUILD.bazel`: |
| copy the `licenses` declaration and the `srcs` filegroup to the corresponding file under |
| `third_party/protobuf/<new_proto>`. |
| |
| 1. Modify the new protobuf to be compatible with #9006 (until upstream protobuf migrates): |
| In the `BUILD`, `protobuf.bzl`, and `six.BUILD` files under `third_party/protobuf/<new_proto>`, |
| copy the line that loads from `@rules_python` along with its explanatory comment, from the |
| corresponding files in the old proto directory. (See also #9019.) |
| |
| 1. In `third_party/protobuf/<new_proto>/BUILD`, in the `srcs` filegroup rule, update the version |
| number referring to the newly added `srcs` rules. |
| |
| 1. Rename `third_party/protobuf/<new_proto>` directory according to the protobuf version number. |
| |
| 1. In `third_party/protobuf/BUILD`: |
| |
| 1. Add a new variable `_NEW_PROTOBUF_VERSION`, set to value of the version. |
| |
| 1. In the `srcs` filegroup rule, add: |
| |
| ```diff |
| srcs = [ |
| "//third_party/protobuf/" + PROTOBUF_VERSION + ":srcs", |
| + "//third_party/protobuf/" + _NEW_PROTOBUF_VERSION + ":srcs", |
| ], |
| ``` |
| |
| 1. Create a PR of these changes and merge it directly to |
| https://bazel.googlesource.com/bazel/+/master (without the usual process of importing it to |
| the Google-internal version control). |
| |
| ## 2nd and 3rd PRs: update references in the Bazel tree |
| |
| 1. In `third_party/protobuf/BUILD`: |
| |
| 1. rename `PROTOBUF_VERSION` to `_OLD_PROTOBUF_VERSION` |
| |
| 1. rename `_NEW_PROTOBUF_VERSION` to `PROTOBUF_VERSION` |
| |
| 1. In the root `WORKSPACE` file update relative paths of protobuf to point to the new version. |
| |
| 1. Update version number in `src/main/protobuf/BUILD` and `src/test/shell/testenv.sh`. |
| |
| 1. Update the current version in this file. |
| |
| 1. Create a PR of these changes and get it imported. Some files won't be imported (those that are |
| only hosted on GitHub); this is expected. |
| |
| 2. Wait for the imported PR to be pushed back to GitHub. Rebase the PR from the previous step, and |
| merge it to https://bazel.googlesource.com/bazel/+/master . |
| |
| ## 4th PR: remove the old directory |
| |
| 1. Delete the `third_party/protobuf/<old_proto>` directory. |
| |
| 1. Remove `_OLD_PROTOBUF_VERSION` from `third_party/protobuf/BUILD`. |
| |
| 1. Create a PR of these changes and merge it directly to |
| https://bazel.googlesource.com/bazel/+/master . |
| |
| **Update this file if you found these instructions to be wrong or incomplete.** |
| |
| # Current protobuf version |
| |
| The current version of protobuf is [3.6.1](https://github.com/google/protobuf/releases/tag/v3.6.1). |