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
This commit is contained in:
parent
3805f5cd2e
commit
a6351caf12
|
@ -75,6 +75,32 @@ func init() {
|
||||||
android.RegisterSingletonType("rust_project_generator", rustProjectGeneratorSingleton)
|
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,
|
func (singleton *projectGeneratorSingleton) mergeDependencies(ctx android.SingletonContext,
|
||||||
module android.Module, crate *rustProjectCrate, deps map[string]int) {
|
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
|
return cInfo.ID, crateName, true
|
||||||
}
|
}
|
||||||
crate := rustProjectCrate{Deps: make([]rustProjectDep, 0), Cfgs: make([]string, 0)}
|
crate := rustProjectCrate{Deps: make([]rustProjectDep, 0), Cfgs: make([]string, 0)}
|
||||||
srcs := rustLib.baseCompiler.Properties.Srcs
|
rootModule, ok := librarySource(ctx, rModule, rustLib)
|
||||||
if len(srcs) == 0 {
|
if !ok {
|
||||||
return 0, "", false
|
return 0, "", false
|
||||||
}
|
}
|
||||||
crate.RootModule = path.Join(ctx.ModuleDir(rModule), srcs[0])
|
crate.RootModule = rootModule
|
||||||
crate.Edition = rustLib.baseCompiler.edition()
|
crate.Edition = rustLib.baseCompiler.edition()
|
||||||
|
|
||||||
deps := make(map[string]int)
|
deps := make(map[string]int)
|
||||||
|
|
|
@ -18,6 +18,7 @@ import (
|
||||||
"encoding/json"
|
"encoding/json"
|
||||||
"io/ioutil"
|
"io/ioutil"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
"strings"
|
||||||
"testing"
|
"testing"
|
||||||
|
|
||||||
"android/soong/android"
|
"android/soong/android"
|
||||||
|
@ -100,22 +101,50 @@ func TestProjectJsonBindGen(t *testing.T) {
|
||||||
rust_library {
|
rust_library {
|
||||||
name: "liba",
|
name: "liba",
|
||||||
srcs: ["src/lib.rs"],
|
srcs: ["src/lib.rs"],
|
||||||
rlibs: ["libbindings"],
|
rlibs: ["libbindings1"],
|
||||||
crate_name: "a"
|
crate_name: "a"
|
||||||
}
|
}
|
||||||
rust_bindgen {
|
rust_bindgen {
|
||||||
name: "libbindings",
|
name: "libbindings1",
|
||||||
crate_name: "bindings",
|
crate_name: "bindings1",
|
||||||
source_stem: "bindings",
|
source_stem: "bindings1",
|
||||||
host_supported: true,
|
host_supported: true,
|
||||||
wrapper_src: "src/any.h",
|
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()
|
` + GatherRequiredDepsForTest()
|
||||||
fs := map[string][]byte{
|
fs := map[string][]byte{
|
||||||
"src/lib.rs": nil,
|
"src/lib.rs": nil,
|
||||||
}
|
}
|
||||||
jsonContent := testProjectJson(t, bp, fs)
|
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) {
|
func TestProjectJsonMultiVersion(t *testing.T) {
|
||||||
|
|
|
@ -117,6 +117,7 @@ func CreateTestContext() *android.TestContext {
|
||||||
ctx.RegisterModuleType("rust_binary", RustBinaryFactory)
|
ctx.RegisterModuleType("rust_binary", RustBinaryFactory)
|
||||||
ctx.RegisterModuleType("rust_binary_host", RustBinaryHostFactory)
|
ctx.RegisterModuleType("rust_binary_host", RustBinaryHostFactory)
|
||||||
ctx.RegisterModuleType("rust_bindgen", RustBindgenFactory)
|
ctx.RegisterModuleType("rust_bindgen", RustBindgenFactory)
|
||||||
|
ctx.RegisterModuleType("rust_bindgen_host", RustBindgenHostFactory)
|
||||||
ctx.RegisterModuleType("rust_test", RustTestFactory)
|
ctx.RegisterModuleType("rust_test", RustTestFactory)
|
||||||
ctx.RegisterModuleType("rust_test_host", RustTestHostFactory)
|
ctx.RegisterModuleType("rust_test_host", RustTestHostFactory)
|
||||||
ctx.RegisterModuleType("rust_library", RustLibraryFactory)
|
ctx.RegisterModuleType("rust_library", RustLibraryFactory)
|
||||||
|
|
Loading…
Reference in New Issue