diff options
-rw-r--r-- | rust/binary.go | 3 | ||||
-rw-r--r-- | rust/library.go | 3 | ||||
-rw-r--r-- | rust/proc_macro.go | 3 | ||||
-rw-r--r-- | rust/rust.go | 39 | ||||
-rw-r--r-- | rust/rust_test.go | 20 |
5 files changed, 62 insertions, 6 deletions
diff --git a/rust/binary.go b/rust/binary.go index 48f51dbdf..1e9e11990 100644 --- a/rust/binary.go +++ b/rust/binary.go @@ -106,8 +106,7 @@ func (binary *binaryDecorator) nativeCoverage() bool { func (binary *binaryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) android.Path { fileName := binary.getStem(ctx) + ctx.toolchain().ExecutableSuffix() - srcPath, paths := srcPathFromModuleSrcs(ctx, binary.baseCompiler.Properties.Srcs) - deps.SrcDeps = append(deps.SrcDeps, paths...) + srcPath, _ := srcPathFromModuleSrcs(ctx, binary.baseCompiler.Properties.Srcs) outputFile := android.PathForModuleOut(ctx, fileName) binary.unstrippedOutputFile = outputFile diff --git a/rust/library.go b/rust/library.go index acca25627..ac725d7da 100644 --- a/rust/library.go +++ b/rust/library.go @@ -368,8 +368,7 @@ func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) F func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps PathDeps) android.Path { var outputFile android.WritablePath - srcPath, paths := srcPathFromModuleSrcs(ctx, library.baseCompiler.Properties.Srcs) - deps.SrcDeps = append(deps.SrcDeps, paths...) + srcPath, _ := srcPathFromModuleSrcs(ctx, library.baseCompiler.Properties.Srcs) flags.RustFlags = append(flags.RustFlags, deps.depFlags...) diff --git a/rust/proc_macro.go b/rust/proc_macro.go index 2752dc3aa..3dd2521a3 100644 --- a/rust/proc_macro.go +++ b/rust/proc_macro.go @@ -65,8 +65,7 @@ func (procMacro *procMacroDecorator) compile(ctx ModuleContext, flags Flags, dep fileName := procMacro.getStem(ctx) + ctx.toolchain().ProcMacroSuffix() outputFile := android.PathForModuleOut(ctx, fileName) - srcPath, paths := srcPathFromModuleSrcs(ctx, procMacro.baseCompiler.Properties.Srcs) - deps.SrcDeps = append(deps.SrcDeps, paths...) + srcPath, _ := srcPathFromModuleSrcs(ctx, procMacro.baseCompiler.Properties.Srcs) procMacro.unstrippedOutputFile = outputFile diff --git a/rust/rust.go b/rust/rust.go index 28f8e1a62..89b89e20c 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -743,6 +743,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { directProcMacroDeps := []*Module{} directSharedLibDeps := [](cc.LinkableInterface){} directStaticLibDeps := [](cc.LinkableInterface){} + directSrcProvidersDeps := []*Module{} + directSrcDeps := [](android.SourceFileProducer){} ctx.VisitDirectDeps(func(dep android.Module) { depName := ctx.OtherModuleName(dep) @@ -776,6 +778,24 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { case procMacroDepTag: directProcMacroDeps = append(directProcMacroDeps, rustDep) mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, depName) + case android.SourceDepTag: + // Since these deps are added in path_properties.go via AddDependencies, we need to ensure the correct + // OS/Arch variant is used. + var helper string + if ctx.Host() { + helper = "missing 'host_supported'?" + } else { + helper = "device module defined?" + } + + if dep.Target().Os != ctx.Os() { + ctx.ModuleErrorf("OS mismatch on dependency %q (%s)", dep.Name(), helper) + return + } else if dep.Target().Arch.ArchType != ctx.Arch().ArchType { + ctx.ModuleErrorf("Arch mismatch on dependency %q (%s)", dep.Name(), helper) + return + } + directSrcProvidersDeps = append(directSrcProvidersDeps, rustDep) } //Append the dependencies exportedDirs @@ -793,6 +813,14 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { } + if srcDep, ok := dep.(android.SourceFileProducer); ok { + switch depTag { + case android.SourceDepTag: + // These are usually genrules which don't have per-target variants. + directSrcDeps = append(directSrcDeps, srcDep) + } + } + if ccDep, ok := dep.(cc.LinkableInterface); ok { //Handle C dependencies if _, ok := ccDep.(*Module); !ok { @@ -868,11 +896,22 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { sharedLibDepFiles = append(sharedLibDepFiles, dep.OutputFile().Path()) } + var srcProviderDepFiles android.Paths + for _, dep := range directSrcProvidersDeps { + srcs, _ := dep.OutputFiles("") + srcProviderDepFiles = append(srcProviderDepFiles, srcs...) + } + for _, dep := range directSrcDeps { + srcs := dep.Srcs() + srcProviderDepFiles = append(srcProviderDepFiles, srcs...) + } + depPaths.RLibs = append(depPaths.RLibs, rlibDepFiles...) depPaths.DyLibs = append(depPaths.DyLibs, dylibDepFiles...) depPaths.SharedLibs = append(depPaths.SharedLibs, sharedLibDepFiles...) depPaths.StaticLibs = append(depPaths.StaticLibs, staticLibDepFiles...) depPaths.ProcMacros = append(depPaths.ProcMacros, procMacroDepFiles...) + depPaths.SrcDeps = append(depPaths.SrcDeps, srcProviderDepFiles...) // Dedup exported flags from dependencies depPaths.linkDirs = android.FirstUniqueStrings(depPaths.linkDirs) diff --git a/rust/rust_test.go b/rust/rust_test.go index 89dfb67e1..b3bbddbc6 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -291,6 +291,26 @@ func TestSourceProviderDeps(t *testing.T) { } } +func TestSourceProviderTargetMismatch(t *testing.T) { + // This might error while building the dependency tree or when calling depsToPaths() depending on the lunched + // target, which results in two different errors. So don't check the error, just confirm there is one. + testRustError(t, ".*", ` + rust_proc_macro { + name: "libprocmacro", + srcs: [ + "foo.rs", + ":libbindings", + ], + crate_name: "procmacro", + } + rust_bindgen { + name: "libbindings", + stem: "bindings", + wrapper_src: "src/any.h", + } + `) +} + // Test to make sure proc_macros use host variants when building device modules. func TestProcMacroDeviceDeps(t *testing.T) { ctx := testRust(t, ` |