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

Commit 093a57ed authored by Vinh Tran's avatar Vinh Tran
Browse files

Implement bp2build converter for rust_binary

Test: go test
Bug: 295910295
Change-Id: Ieb18d9071f28e53a0463614594cee0fd755b7b3c
parent 9b84678f
Loading
Loading
Loading
Loading
+74 −0
Original line number Diff line number Diff line
package bp2build

import (
	"android/soong/android"
	"android/soong/rust"
	"testing"
)

func runRustBinaryTestCase(t *testing.T, tc Bp2buildTestCase) {
	t.Helper()
	RunBp2BuildTestCase(t, registerRustBinaryModuleTypes, tc)
}

func registerRustBinaryModuleTypes(ctx android.RegistrationContext) {
	ctx.RegisterModuleType("rust_binary_host", rust.RustBinaryHostFactory)
	ctx.RegisterModuleType("rust_library_host", rust.RustLibraryHostFactory)
	ctx.RegisterModuleType("rust_proc_macro", rust.ProcMacroFactory)

}

func TestRustBinaryHost(t *testing.T) {
	runRustBinaryTestCase(t, Bp2buildTestCase{
		Dir:       "external/rust/crates/foo",
		Blueprint: "",
		Filesystem: map[string]string{
			"external/rust/crates/foo/src/lib.rs":    "",
			"external/rust/crates/foo/src/helper.rs": "",
			"external/rust/crates/foo/Android.bp": `
rust_binary_host {
	name: "libfoo",
	crate_name: "foo",
	srcs: ["src/main.rs"],
	edition: "2021",
	features: ["bah-enabled"],
	cfgs: ["baz"],
	rustlibs: ["libbar"],
	proc_macros: ["libbah"],
    bazel_module: { bp2build_available: true },
}
`,
			"external/rust/crates/bar/Android.bp": `
rust_library_host {
	name: "libbar",
	crate_name: "bar",
	srcs: ["src/lib.rs"],
    bazel_module: { bp2build_available: true },
}
`,
			"external/rust/crates/bah/Android.bp": `
rust_proc_macro {
	name: "libbah",
	crate_name: "bah",
	srcs: ["src/lib.rs"],
    bazel_module: { bp2build_available: true },
}
`,
		},
		ExpectedBazelTargets: []string{
			makeBazelTargetHostOrDevice("rust_binary", "libfoo", AttrNameToString{
				"crate_name": `"foo"`,
				"srcs": `[
        "src/helper.rs",
        "src/lib.rs",
    ]`,
				"deps":            `["//external/rust/crates/bar:libbar"]`,
				"proc_macro_deps": `["//external/rust/crates/bah:libbah"]`,
				"edition":         `"2021"`,
				"crate_features":  `["bah-enabled"]`,
				"rustc_flags":     `["--cfg=baz"]`,
			}, android.HostSupported),
		},
	},
	)
}
+89 −0
Original line number Diff line number Diff line
@@ -16,6 +16,8 @@ package rust

import (
	"android/soong/android"
	"android/soong/bazel"
	"fmt"
)

func init() {
@@ -60,6 +62,8 @@ func RustBinaryHostFactory() android.Module {
func NewRustBinary(hod android.HostOrDeviceSupported) (*Module, *binaryDecorator) {
	module := newModule(hod, android.MultilibFirst)

	android.InitBazelModule(module)

	binary := &binaryDecorator{
		baseCompiler: NewBaseCompiler("bin", "", InstallInSystem),
	}
@@ -183,3 +187,88 @@ func (binary *binaryDecorator) staticallyLinked() bool {
func (binary *binaryDecorator) testBinary() bool {
	return false
}

type rustBinaryLibraryAttributes struct {
	Srcs            bazel.LabelListAttribute
	Compile_data    bazel.LabelListAttribute
	Crate_name      bazel.StringAttribute
	Edition         bazel.StringAttribute
	Crate_features  bazel.StringListAttribute
	Deps            bazel.LabelListAttribute
	Proc_macro_deps bazel.LabelListAttribute
	Rustc_flags     bazel.StringListAttribute
}

func binaryBp2build(ctx android.TopDownMutatorContext, m *Module) {
	binary := m.compiler.(*binaryDecorator)

	var srcs bazel.LabelList
	var compileData bazel.LabelList

	if binary.baseCompiler.Properties.Srcs[0] == "src/main.rs" {
		srcs = android.BazelLabelForModuleSrc(ctx, []string{"src/**/*.rs"})
		compileData = android.BazelLabelForModuleSrc(
			ctx,
			[]string{
				"src/**/*.proto",
				"examples/**/*.rs",
				"**/*.md",
				"templates/**/*.template",
			},
		)
	} else {
		srcs = android.BazelLabelForModuleSrc(ctx, binary.baseCompiler.Properties.Srcs)
	}

	deps := android.BazelLabelForModuleDeps(ctx, append(
		binary.baseCompiler.Properties.Rustlibs,
	))

	procMacroDeps := android.BazelLabelForModuleDeps(ctx, binary.baseCompiler.Properties.Proc_macros)

	var rustcFLags []string
	for _, cfg := range binary.baseCompiler.Properties.Cfgs {
		rustcFLags = append(rustcFLags, fmt.Sprintf("--cfg=%s", cfg))
	}

	attrs := &rustBinaryLibraryAttributes{
		Srcs: bazel.MakeLabelListAttribute(
			srcs,
		),
		Compile_data: bazel.MakeLabelListAttribute(
			compileData,
		),
		Crate_name: bazel.StringAttribute{
			Value: &binary.baseCompiler.Properties.Crate_name,
		},
		Edition: bazel.StringAttribute{
			Value: binary.baseCompiler.Properties.Edition,
		},
		Crate_features: bazel.StringListAttribute{
			Value: binary.baseCompiler.Properties.Features,
		},
		Deps: bazel.MakeLabelListAttribute(
			deps,
		),
		Proc_macro_deps: bazel.MakeLabelListAttribute(
			procMacroDeps,
		),
		Rustc_flags: bazel.StringListAttribute{
			Value: append(
				rustcFLags,
				binary.baseCompiler.Properties.Flags...,
			),
		},
	}

	ctx.CreateBazelTargetModule(
		bazel.BazelTargetModuleProperties{
			Rule_class:        "rust_binary",
			Bzl_load_location: "@rules_rust//rust:defs.bzl",
		},
		android.CommonAttributes{
			Name: m.Name(),
		},
		attrs,
	)
}
+2 −0
Original line number Diff line number Diff line
@@ -1850,6 +1850,8 @@ func (m *Module) ConvertWithBp2build(ctx android.TopDownMutatorContext) {
		libraryBp2build(ctx, m)
	} else if ctx.ModuleType() == "rust_proc_macro" {
		procMacroBp2build(ctx, m)
	} else if ctx.ModuleType() == "rust_binary_host" {
		binaryBp2build(ctx, m)
	} else {
		ctx.MarkBp2buildUnconvertible(bp2build_metrics_proto.UnconvertedReasonType_TYPE_UNSUPPORTED, "")
	}