Loading rust/protobuf.go +25 −1 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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 Loading @@ -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...) Loading Loading @@ -206,10 +220,20 @@ func (proto *protobufDecorator) SourceProviderProps() []interface{} { func (proto *protobufDecorator) SourceProviderDeps(ctx DepsContext, deps Deps) Deps { deps = proto.BaseSourceProvider.SourceProviderDeps(ctx, deps) 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") } Loading rust/protobuf_test.go +49 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading rust/testing.go +6 −0 Original line number Diff line number Diff line Loading @@ -126,6 +126,12 @@ func GatherRequiredDepsForTest() string { apex_available: ["//apex_available:platform", "//apex_available:anyapex"], 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", Loading Loading
rust/protobuf.go +25 −1 Original line number Diff line number Diff line Loading @@ -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 { Loading @@ -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 Loading @@ -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...) Loading Loading @@ -206,10 +220,20 @@ func (proto *protobufDecorator) SourceProviderProps() []interface{} { func (proto *protobufDecorator) SourceProviderDeps(ctx DepsContext, deps Deps) Deps { deps = proto.BaseSourceProvider.SourceProviderDeps(ctx, deps) 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") } Loading
rust/protobuf_test.go +49 −0 Original line number Diff line number Diff line Loading @@ -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 { Loading
rust/testing.go +6 −0 Original line number Diff line number Diff line Loading @@ -126,6 +126,12 @@ func GatherRequiredDepsForTest() string { apex_available: ["//apex_available:platform", "//apex_available:anyapex"], 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", Loading