From 806efd3885d6eecfa1b1bd1697431c0ab073a76a Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Wed, 11 Dec 2024 21:38:53 +0000 Subject: rust: Alias rust_ffi_rlib to rust_library_rlib With the new transition mutators, the distinctions between rust_ffi_rlib and rust_library_rlib are not necessary. This CL removes the remaining distinctions to allow an unusual use case where a rust_library and a rust_ffi_rlib would otherwise be created from the same source. This would allow defining a single rust_library_rlib that works for both rust modules and cc modules. One key change is that rust_ffi_rlibs only produced an rlib-std variant previously, and now produce dylib-std variants as well.This surfaced an issue where a libstd linkage mismatch would cause rustc to throw a consufing missing crate error. We instead add logic to catch this in Soong and provide a more useful error message. Bug: 383552450 Test: m rust Test: m blueprint_tests Change-Id: I611ca46934059735d06229952cfd8e0ab7050486 --- rust/rust.go | 33 +++++++++++++++++++++------------ 1 file changed, 21 insertions(+), 12 deletions(-) (limited to 'rust/rust.go') diff --git a/rust/rust.go b/rust/rust.go index 64cfa40d2..cd4bd4355 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -594,7 +594,7 @@ func (mod *Module) CcLibraryInterface() bool { if mod.compiler != nil { // use build{Static,Shared}() instead of {static,shared}() here because this might be called before // VariantIs{Static,Shared} is set. - if lib, ok := mod.compiler.(libraryInterface); ok && (lib.buildShared() || lib.buildStatic()) { + if lib, ok := mod.compiler.(libraryInterface); ok && (lib.buildShared() || lib.buildStatic() || lib.buildRlib()) { return true } } @@ -680,15 +680,6 @@ func (mod *Module) BuildRlibVariant() bool { panic(fmt.Errorf("BuildRlibVariant called on non-library module: %q", mod.BaseModuleName())) } -func (mod *Module) IsRustFFI() bool { - if mod.compiler != nil { - if library, ok := mod.compiler.(libraryInterface); ok { - return library.isFFILibrary() - } - } - return false -} - func (mod *Module) BuildSharedVariant() bool { if mod.compiler != nil { if library, ok := mod.compiler.(libraryInterface); ok { @@ -1236,6 +1227,8 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { ctx.VisitDirectDeps(func(dep android.Module) { depName := ctx.OtherModuleName(dep) depTag := ctx.OtherModuleDependencyTag(dep) + modStdLinkage := mod.compiler.stdLinkage(ctx.Device()) + if _, exists := skipModuleList[depName]; exists { return } @@ -1264,6 +1257,14 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps) } + if !rustDep.compiler.noStdlibs() { + rustDepStdLinkage := rustDep.compiler.stdLinkage(ctx.Device()) + if rustDepStdLinkage != modStdLinkage { + ctx.ModuleErrorf("Rust dependency %q has the wrong StdLinkage; expected %#v, got %#v", depName, modStdLinkage, rustDepStdLinkage) + return + } + } + case depTag == rlibDepTag: rlib, ok := rustDep.compiler.(libraryInterface) if !ok || !rlib.rlib() { @@ -1284,6 +1285,14 @@ func (mod *Module) depsToPaths(ctx android.ModuleContext) PathDeps { depPaths.transitiveImplementationDeps = append(depPaths.transitiveImplementationDeps, info.ImplementationDeps) } + if !rustDep.compiler.noStdlibs() { + rustDepStdLinkage := rustDep.compiler.stdLinkage(ctx.Device()) + if rustDepStdLinkage != modStdLinkage { + ctx.ModuleErrorf("Rust dependency %q has the wrong StdLinkage; expected %#v, got %#v", depName, modStdLinkage, rustDepStdLinkage) + return + } + } + case depTag == procMacroDepTag: directProcMacroDeps = append(directProcMacroDeps, rustDep) mod.Properties.AndroidMkProcMacroLibs = append(mod.Properties.AndroidMkProcMacroLibs, makeLibName) @@ -1602,7 +1611,7 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { } stdLinkage := "dylib-std" - if mod.compiler.stdLinkage(ctx) == RlibLinkage { + if mod.compiler.stdLinkage(ctx.Device()) == RlibLinkage { stdLinkage = "rlib-std" } @@ -1669,7 +1678,7 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { // stdlibs if deps.Stdlibs != nil { - if mod.compiler.stdLinkage(ctx) == RlibLinkage { + if mod.compiler.stdLinkage(ctx.Device()) == RlibLinkage { for _, lib := range deps.Stdlibs { actx.AddVariationDependencies(append(commonDepVariations, []blueprint.Variation{{Mutator: "rust_libraries", Variation: "rlib"}}...), rlibDepTag, lib) -- cgit v1.2.3-59-g8ed1b