Merge "Add option to use protobuf3"
This commit is contained in:
@@ -52,6 +52,10 @@ type ProtobufProperties struct {
|
|||||||
|
|
||||||
// List of libraries which export include paths required for this module
|
// List of libraries which export include paths required for this module
|
||||||
Header_libs []string `android:"arch_variant,variant_prepend"`
|
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 {
|
type protobufDecorator struct {
|
||||||
@@ -65,6 +69,10 @@ type protobufDecorator struct {
|
|||||||
protoFlags android.ProtoFlags
|
protoFlags android.ProtoFlags
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (proto *protobufDecorator) useProtobuf3() bool {
|
||||||
|
return Bool(proto.Properties.Use_protobuf3)
|
||||||
|
}
|
||||||
|
|
||||||
func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) android.Path {
|
func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps) android.Path {
|
||||||
var protoFlags android.ProtoFlags
|
var protoFlags android.ProtoFlags
|
||||||
var grpcProtoFlags android.ProtoFlags
|
var grpcProtoFlags android.ProtoFlags
|
||||||
@@ -73,7 +81,13 @@ func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps)
|
|||||||
outDir := android.PathForModuleOut(ctx)
|
outDir := android.PathForModuleOut(ctx)
|
||||||
protoFiles := android.PathsForModuleSrc(ctx, proto.Properties.Protos)
|
protoFiles := android.PathsForModuleSrc(ctx, proto.Properties.Protos)
|
||||||
grpcFiles := android.PathsForModuleSrc(ctx, proto.Properties.Grpc_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")
|
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, defaultProtobufFlags...)
|
||||||
commonProtoFlags = append(commonProtoFlags, proto.Properties.Proto_flags...)
|
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 {
|
func (proto *protobufDecorator) SourceProviderDeps(ctx DepsContext, deps Deps) Deps {
|
||||||
deps = proto.BaseSourceProvider.SourceProviderDeps(ctx, 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...)
|
deps.HeaderLibs = append(deps.SharedLibs, proto.Properties.Header_libs...)
|
||||||
|
|
||||||
if len(proto.Properties.Grpc_protos) > 0 {
|
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.Rustlibs = append(deps.Rustlibs, "libgrpcio", "libfutures")
|
||||||
deps.HeaderLibs = append(deps.HeaderLibs, "libprotobuf-cpp-full")
|
deps.HeaderLibs = append(deps.HeaderLibs, "libprotobuf-cpp-full")
|
||||||
}
|
}
|
||||||
|
@@ -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) {
|
func TestRustGrpc(t *testing.T) {
|
||||||
ctx := testRust(t, `
|
ctx := testRust(t, `
|
||||||
rust_protobuf {
|
rust_protobuf {
|
||||||
|
@@ -126,6 +126,12 @@ func GatherRequiredDepsForTest() string {
|
|||||||
apex_available: ["//apex_available:platform", "//apex_available:anyapex"],
|
apex_available: ["//apex_available:platform", "//apex_available:anyapex"],
|
||||||
min_sdk_version: "29",
|
min_sdk_version: "29",
|
||||||
}
|
}
|
||||||
|
rust_library {
|
||||||
|
name: "libprotobuf",
|
||||||
|
crate_name: "protobuf",
|
||||||
|
srcs: ["foo.rs"],
|
||||||
|
host_supported: true,
|
||||||
|
}
|
||||||
rust_library {
|
rust_library {
|
||||||
name: "libprotobuf_deprecated",
|
name: "libprotobuf_deprecated",
|
||||||
crate_name: "protobuf",
|
crate_name: "protobuf",
|
||||||
|
Reference in New Issue
Block a user