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

Commit a6351caf authored by Thiébaud Weksteen's avatar Thiébaud Weksteen
Browse files

rust: Add ref to generated sources (aidl, bindgen)

Test: SOONG_GEN_RUST_PROJECT=1 m nothing; Edit
  system/security/keystore2/selinux/src/lib.rs;
  Check name resolution in IDE.
Bug: 168263887
Change-Id: Icbbf176c4355c3043807ce3fe0c3967c4a1374e2
parent 3805f5cd
Loading
Loading
Loading
Loading
+29 −3
Original line number Diff line number Diff line
@@ -75,6 +75,32 @@ func init() {
	android.RegisterSingletonType("rust_project_generator", rustProjectGeneratorSingleton)
}

// librarySource finds the main source file (.rs) for a crate.
func librarySource(ctx android.SingletonContext, rModule *Module, rustLib *libraryDecorator) (string, bool) {
	srcs := rustLib.baseCompiler.Properties.Srcs
	if len(srcs) != 0 {
		return path.Join(ctx.ModuleDir(rModule), srcs[0]), true
	}
	if !rustLib.source() {
		return "", false
	}
	// It is a SourceProvider module. If this module is host only, uses the variation for the host.
	// Otherwise, use the variation for the primary target.
	switch rModule.hod {
	case android.HostSupported:
	case android.HostSupportedNoCross:
		if rModule.Target().String() != ctx.Config().BuildOSTarget.String() {
			return "", false
		}
	default:
		if rModule.Target().String() != ctx.Config().Targets[android.Android][0].String() {
			return "", false
		}
	}
	src := rustLib.sourceProvider.Srcs()[0]
	return src.String(), true
}

func (singleton *projectGeneratorSingleton) mergeDependencies(ctx android.SingletonContext,
	module android.Module, crate *rustProjectCrate, deps map[string]int) {

@@ -116,11 +142,11 @@ func (singleton *projectGeneratorSingleton) appendLibraryAndDeps(ctx android.Sin
		return cInfo.ID, crateName, true
	}
	crate := rustProjectCrate{Deps: make([]rustProjectDep, 0), Cfgs: make([]string, 0)}
	srcs := rustLib.baseCompiler.Properties.Srcs
	if len(srcs) == 0 {
	rootModule, ok := librarySource(ctx, rModule, rustLib)
	if !ok {
		return 0, "", false
	}
	crate.RootModule = path.Join(ctx.ModuleDir(rModule), srcs[0])
	crate.RootModule = rootModule
	crate.Edition = rustLib.baseCompiler.edition()

	deps := make(map[string]int)
+34 −5
Original line number Diff line number Diff line
@@ -18,6 +18,7 @@ import (
	"encoding/json"
	"io/ioutil"
	"path/filepath"
	"strings"
	"testing"

	"android/soong/android"
@@ -100,22 +101,50 @@ func TestProjectJsonBindGen(t *testing.T) {
	rust_library {
		name: "liba",
		srcs: ["src/lib.rs"],
		rlibs: ["libbindings"],
		rlibs: ["libbindings1"],
		crate_name: "a"
	}
	rust_bindgen {
		name: "libbindings",
		crate_name: "bindings",
		source_stem: "bindings",
		name: "libbindings1",
		crate_name: "bindings1",
		source_stem: "bindings1",
		host_supported: true,
		wrapper_src: "src/any.h",
	}
	rust_library_host {
		name: "libb",
		srcs: ["src/lib.rs"],
		rustlibs: ["libbindings2"],
		crate_name: "b"
	}
	rust_bindgen_host {
		name: "libbindings2",
		crate_name: "bindings2",
		source_stem: "bindings2",
		wrapper_src: "src/any.h",
	}
	` + GatherRequiredDepsForTest()
	fs := map[string][]byte{
		"src/lib.rs": nil,
	}
	jsonContent := testProjectJson(t, bp, fs)
	validateJsonCrates(t, jsonContent)
	crates := validateJsonCrates(t, jsonContent)
	for _, c := range crates {
		crate, ok := c.(map[string]interface{})
		if !ok {
			t.Fatalf("Unexpected type for crate: %v", c)
		}
		rootModule, ok := crate["root_module"].(string)
		if !ok {
			t.Fatalf("Unexpected type for root_module: %v", crate["root_module"])
		}
		if strings.Contains(rootModule, "libbindings1") && !strings.Contains(rootModule, "android_arm64") {
			t.Errorf("The source for libbindings1 does not contain android_arm64, got %v", rootModule)
		}
		if strings.Contains(rootModule, "libbindings2") && !strings.Contains(rootModule, "linux_glibc") {
			t.Errorf("The source for libbindings2 does not contain linux_glibc, got %v", rootModule)
		}
	}
}

func TestProjectJsonMultiVersion(t *testing.T) {
+1 −0
Original line number Diff line number Diff line
@@ -117,6 +117,7 @@ func CreateTestContext() *android.TestContext {
	ctx.RegisterModuleType("rust_binary", RustBinaryFactory)
	ctx.RegisterModuleType("rust_binary_host", RustBinaryHostFactory)
	ctx.RegisterModuleType("rust_bindgen", RustBindgenFactory)
	ctx.RegisterModuleType("rust_bindgen_host", RustBindgenHostFactory)
	ctx.RegisterModuleType("rust_test", RustTestFactory)
	ctx.RegisterModuleType("rust_test_host", RustTestHostFactory)
	ctx.RegisterModuleType("rust_library", RustLibraryFactory)