Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b611cf42 authored by Jeffrey Vander Stoep's avatar Jeffrey Vander Stoep Committed by Gerrit Code Review
Browse files

Merge "Add option to use protobuf3"

parents a4c93e3b c1490ec2
Loading
Loading
Loading
Loading
+25 −1
Original line number Diff line number Diff line
@@ -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)
	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")
	}
+49 −0
Original line number Diff line number Diff line
@@ -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 {
+6 −0
Original line number Diff line number Diff line
@@ -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",