diff options
author | 2023-04-24 11:28:25 +0200 | |
---|---|---|
committer | 2023-04-24 11:33:50 +0200 | |
commit | c1490ec25edd5a8d60915d2e2a5810983b2a70f0 (patch) | |
tree | 09798a98938678037545757d2e468c9b3a1b26ff | |
parent | 0933fd59d7bddcface4fddbb1b61d42c4a0a39cd (diff) |
Add option to use protobuf3
Users of the rust_protobuf module can use the 'use_protobuf3'
option to select version 3 of the protobuf crate instead of the
current default of version 2. This unblocks teams that would like
to use protobuf 3 immediately and provides a mechanism for us to
incrementally migrate users of protobuf 2 to protobuf 3.
Test: Adds tests that are executed during every build.
Bug: 270895633
Change-Id: Ib6a18b77cfa7dc3cc604cea05269004b3712bbb6
-rw-r--r-- | rust/protobuf.go | 26 | ||||
-rw-r--r-- | rust/protobuf_test.go | 49 | ||||
-rw-r--r-- | rust/testing.go | 6 |
3 files changed, 80 insertions, 1 deletions
diff --git a/rust/protobuf.go b/rust/protobuf.go index e30f25d95..0cf6e8c97 100644 --- a/rust/protobuf.go +++ b/rust/protobuf.go @@ -52,6 +52,10 @@ type ProtobufProperties struct { // List of libraries which export include paths required for this module Header_libs []string `android:"arch_variant,variant_prepend"` + + // Use protobuf version 3.x. This will be deleted once we migrate all current users + // of protobuf off of 2.x. + Use_protobuf3 *bool } type protobufDecorator struct { @@ -65,6 +69,10 @@ type protobufDecorator struct { protoFlags android.ProtoFlags } +func (proto *protobufDecorator) useProtobuf3() bool { + return Bool(proto.Properties.Use_protobuf3) +} + func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) android.Path { var protoFlags android.ProtoFlags var grpcProtoFlags android.ProtoFlags @@ -73,7 +81,13 @@ func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) outDir := android.PathForModuleOut(ctx) protoFiles := android.PathsForModuleSrc(ctx, proto.Properties.Protos) grpcFiles := android.PathsForModuleSrc(ctx, proto.Properties.Grpc_protos) + + // For now protobuf2 (the deprecated version) remains the default. This will change in the + // future as we update the various users. protoPluginPath := ctx.Config().HostToolPath(ctx, "protoc-gen-rust-deprecated") + if proto.useProtobuf3() == true { + protoPluginPath = ctx.Config().HostToolPath(ctx, "protoc-gen-rust") + } commonProtoFlags = append(commonProtoFlags, defaultProtobufFlags...) commonProtoFlags = append(commonProtoFlags, proto.Properties.Proto_flags...) @@ -206,10 +220,20 @@ func (proto *protobufDecorator) SourceProviderProps() []interface{} { func (proto *protobufDecorator) SourceProviderDeps(ctx DepsContext, deps Deps) Deps { deps = proto.BaseSourceProvider.SourceProviderDeps(ctx, deps) - deps.Rustlibs = append(deps.Rustlibs, "libprotobuf_deprecated") + useProtobuf3 := proto.useProtobuf3() + if useProtobuf3 == true { + deps.Rustlibs = append(deps.Rustlibs, "libprotobuf") + } else { + deps.Rustlibs = append(deps.Rustlibs, "libprotobuf_deprecated") + } deps.HeaderLibs = append(deps.SharedLibs, proto.Properties.Header_libs...) if len(proto.Properties.Grpc_protos) > 0 { + if useProtobuf3 == true { + ctx.PropertyErrorf("protos", "rust_protobuf with grpc_protos defined must currently use "+ + "`use_protobuf3: false,` in the Android.bp file. This is temporary until the "+ + "grpcio crate is updated to use the current version of the protobuf crate.") + } deps.Rustlibs = append(deps.Rustlibs, "libgrpcio", "libfutures") deps.HeaderLibs = append(deps.HeaderLibs, "libprotobuf-cpp-full") } diff --git a/rust/protobuf_test.go b/rust/protobuf_test.go index 0aa454975..b723f3f1a 100644 --- a/rust/protobuf_test.go +++ b/rust/protobuf_test.go @@ -69,6 +69,55 @@ func TestRustProtobuf(t *testing.T) { } } +func TestRustProtobuf3(t *testing.T) { + ctx := testRust(t, ` + rust_protobuf { + name: "librust_proto", + protos: ["buf.proto", "proto.proto"], + crate_name: "rust_proto", + source_stem: "buf", + use_protobuf3: true, + shared_libs: ["libfoo_shared"], + static_libs: ["libfoo_static"], + } + cc_library_shared { + name: "libfoo_shared", + export_include_dirs: ["shared_include"], + } + cc_library_static { + name: "libfoo_static", + export_include_dirs: ["static_include"], + } + `) + // Check that libprotobuf is added as a dependency. + librust_proto := ctx.ModuleForTests("librust_proto", "android_arm64_armv8-a_dylib").Module().(*Module) + if !android.InList("libprotobuf", librust_proto.Properties.AndroidMkDylibs) { + t.Errorf("libprotobuf dependency missing for rust_protobuf (dependency missing from AndroidMkDylibs)") + } + + // Make sure the correct plugin is being used. + librust_proto_out := ctx.ModuleForTests("librust_proto", "android_arm64_armv8-a_source").Output("buf.rs") + cmd := librust_proto_out.RuleParams.Command + if w := "protoc-gen-rust"; !strings.Contains(cmd, w) { + t.Errorf("expected %q in %q", w, cmd) + } + + // Check exported include directories + if w := "-Ishared_include"; !strings.Contains(cmd, w) { + t.Errorf("expected %q in %q", w, cmd) + } + if w := "-Istatic_include"; !strings.Contains(cmd, w) { + t.Errorf("expected %q in %q", w, cmd) + } + + // Check proto.rs, the second protobuf, is listed as an output + librust_proto_outputs := ctx.ModuleForTests("librust_proto", "android_arm64_armv8-a_source").AllOutputs() + if android.InList("proto.rs", librust_proto_outputs) { + t.Errorf("rust_protobuf is not producing multiple outputs; expected 'proto.rs' in list, got: %#v ", + librust_proto_outputs) + } +} + func TestRustGrpc(t *testing.T) { ctx := testRust(t, ` rust_protobuf { diff --git a/rust/testing.go b/rust/testing.go index a33d948db..0a6a870d8 100644 --- a/rust/testing.go +++ b/rust/testing.go @@ -127,6 +127,12 @@ func GatherRequiredDepsForTest() string { min_sdk_version: "29", } rust_library { + name: "libprotobuf", + crate_name: "protobuf", + srcs: ["foo.rs"], + host_supported: true, + } + rust_library { name: "libprotobuf_deprecated", crate_name: "protobuf", srcs: ["foo.rs"], |