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

Commit cd11c953 authored by Ludovic Barman's avatar Ludovic Barman Committed by Gerrit Code Review
Browse files

Merge "Rust protobuf 2->3: Update build system" into main

parents db0eeb5b 19739bf6
Loading
Loading
Loading
Loading
+4 −28
Original line number Diff line number Diff line
@@ -56,6 +56,7 @@ type ProtobufProperties struct {

	// Use protobuf version 3.x. This will be deleted once we migrate all current users
	// of protobuf off of 2.x.
	// ludovicb@: DEPRECATED, to be removed
	Use_protobuf3 *bool

	// List of exported include paths containing proto files for dependent rust_protobuf modules.
@@ -74,10 +75,6 @@ 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
@@ -87,12 +84,7 @@ func (proto *protobufDecorator) GenerateSource(ctx ModuleContext, deps PathDeps)
	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")
	}
	protoPluginPath := ctx.Config().HostToolPath(ctx, "protoc-gen-rust")

	commonProtoFlags = append(commonProtoFlags, defaultProtobufFlags...)
	commonProtoFlags = append(commonProtoFlags, proto.Properties.Proto_flags...)
@@ -216,13 +208,7 @@ func (proto *protobufDecorator) genModFileContents() string {
		lines = append(
			lines,
			"pub mod empty {",
			"    pub use protobuf::well_known_types::Empty;",
			"}",
			"pub mod wrappers {",
			"    pub use protobuf::well_known_types::{",
			"        DoubleValue, FloatValue, Int64Value, UInt64Value, Int32Value, UInt32Value,",
			"        BoolValue, StringValue, BytesValue",
			"    };",
			"    pub use protobuf::well_known_types::empty::Empty;",
			"}")
	}

@@ -235,20 +221,10 @@ 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")
	}
+0 −48
Original line number Diff line number Diff line
@@ -21,54 +21,6 @@ import (
	"android/soong/android"
)

func TestRustProtobuf(t *testing.T) {
	ctx := testRust(t, `
		rust_protobuf {
			name: "librust_proto",
			protos: ["buf.proto", "proto.proto"],
			crate_name: "rust_proto",
			source_stem: "buf",
			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_deprecated", librust_proto.Properties.AndroidMkDylibs) {
		t.Errorf("libprotobuf_deprecated 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-deprecated"; !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 TestRustProtobuf3(t *testing.T) {
	ctx := testRust(t, `
		rust_protobuf {
+0 −6
Original line number Diff line number Diff line
@@ -132,12 +132,6 @@ func GatherRequiredDepsForTest() string {
			srcs: ["foo.rs"],
			host_supported: true,
		}
		rust_library {
			name: "libprotobuf_deprecated",
			crate_name: "protobuf",
			srcs: ["foo.rs"],
			host_supported: true,
		}
		rust_library {
			name: "libgrpcio",
			crate_name: "grpcio",