diff options
author | 2024-12-17 06:08:02 -0800 | |
---|---|---|
committer | 2024-12-17 06:08:02 -0800 | |
commit | aea639d61264b9b22027d8c274180883d1143ea7 (patch) | |
tree | a52113bf022d30df9b7607d2f15eb686ad8ab435 | |
parent | 9e1f9b9d73dae437aadd9b204136b2fcc8fc4a98 (diff) | |
parent | 806efd3885d6eecfa1b1bd1697431c0ab073a76a (diff) |
Merge "rust: Alias rust_ffi_rlib to rust_library_rlib" into main
-rw-r--r-- | cc/cc.go | 5 | ||||
-rw-r--r-- | cc/library.go | 4 | ||||
-rw-r--r-- | cc/linkable.go | 3 | ||||
-rw-r--r-- | rust/benchmark.go | 2 | ||||
-rw-r--r-- | rust/binary.go | 4 | ||||
-rw-r--r-- | rust/compiler.go | 9 | ||||
-rw-r--r-- | rust/fuzz.go | 2 | ||||
-rw-r--r-- | rust/library.go | 63 | ||||
-rw-r--r-- | rust/rust.go | 33 | ||||
-rw-r--r-- | rust/rust_test.go | 28 | ||||
-rw-r--r-- | rust/test.go | 2 | ||||
-rw-r--r-- | rust/testing.go | 8 |
12 files changed, 78 insertions, 85 deletions
@@ -1194,11 +1194,6 @@ func (c *Module) BuildRlibVariant() bool { return false } -func (c *Module) IsRustFFI() bool { - // cc modules are not Rust modules - return false -} - func (c *Module) Module() android.Module { return c } diff --git a/cc/library.go b/cc/library.go index a3a2f5c77..be27b0191 100644 --- a/cc/library.go +++ b/cc/library.go @@ -2122,7 +2122,7 @@ func (linkageTransitionMutator) Split(ctx android.BaseModuleContext) []string { } else { // Header only } - } else if library, ok := ctx.Module().(LinkableInterface); ok && (library.CcLibraryInterface() || library.RustLibraryInterface()) { + } else if library, ok := ctx.Module().(LinkableInterface); ok && (library.CcLibraryInterface()) { // Non-cc.Modules may need an empty variant for their mutators. variations := []string{} if library.NonCcVariants() { @@ -2177,7 +2177,7 @@ func (linkageTransitionMutator) IncomingTransition(ctx android.IncomingTransitio } buildStatic := library.BuildStaticVariant() && !isLLNDK buildShared := library.BuildSharedVariant() - if library.BuildRlibVariant() && library.IsRustFFI() && !buildStatic && (incomingVariation == "static" || incomingVariation == "") { + if library.BuildRlibVariant() && !buildStatic && (incomingVariation == "static" || incomingVariation == "") { // Rust modules do not build static libs, but rlibs are used as if they // were via `static_libs`. Thus we need to alias the BuildRlibVariant // to "static" for Rust FFI libraries. diff --git a/cc/linkable.go b/cc/linkable.go index 1a9a9abbc..78ea71c7c 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -102,9 +102,6 @@ type LinkableInterface interface { IsPrebuilt() bool Toc() android.OptionalPath - // IsRustFFI returns true if this is a Rust FFI library. - IsRustFFI() bool - // IsFuzzModule returns true if this a *_fuzz module. IsFuzzModule() bool diff --git a/rust/benchmark.go b/rust/benchmark.go index 8c3e5151e..eaa2176a2 100644 --- a/rust/benchmark.go +++ b/rust/benchmark.go @@ -89,7 +89,7 @@ func (benchmark *benchmarkDecorator) autoDep(ctx android.BottomUpMutatorContext) return rlibAutoDep } -func (benchmark *benchmarkDecorator) stdLinkage(ctx *depsContext) RustLinkage { +func (benchmark *benchmarkDecorator) stdLinkage(device bool) RustLinkage { return RlibLinkage } diff --git a/rust/binary.go b/rust/binary.go index cba29a023..d22041b27 100644 --- a/rust/binary.go +++ b/rust/binary.go @@ -165,11 +165,11 @@ func (binary *binaryDecorator) autoDep(ctx android.BottomUpMutatorContext) autoD } } -func (binary *binaryDecorator) stdLinkage(ctx *depsContext) RustLinkage { +func (binary *binaryDecorator) stdLinkage(device bool) RustLinkage { if binary.preferRlib() { return RlibLinkage } - return binary.baseCompiler.stdLinkage(ctx) + return binary.baseCompiler.stdLinkage(device) } func (binary *binaryDecorator) binary() bool { diff --git a/rust/compiler.go b/rust/compiler.go index fd869174c..b93019b30 100644 --- a/rust/compiler.go +++ b/rust/compiler.go @@ -30,9 +30,8 @@ import ( type RustLinkage int const ( - DefaultLinkage RustLinkage = iota + DylibLinkage RustLinkage = iota RlibLinkage - DylibLinkage ) type compiler interface { @@ -69,7 +68,7 @@ type compiler interface { Disabled() bool SetDisabled() - stdLinkage(ctx *depsContext) RustLinkage + stdLinkage(device bool) RustLinkage noStdlibs() bool unstrippedOutputFilePath() android.Path @@ -316,11 +315,11 @@ func (compiler *baseCompiler) Aliases() map[string]string { return aliases } -func (compiler *baseCompiler) stdLinkage(ctx *depsContext) RustLinkage { +func (compiler *baseCompiler) stdLinkage(device bool) RustLinkage { // For devices, we always link stdlibs in as dylibs by default. if compiler.preferRlib() { return RlibLinkage - } else if ctx.Device() { + } else if device { return DylibLinkage } else { return RlibLinkage diff --git a/rust/fuzz.go b/rust/fuzz.go index c4a4b4924..9e8efd754 100644 --- a/rust/fuzz.go +++ b/rust/fuzz.go @@ -121,7 +121,7 @@ func (fuzzer *fuzzDecorator) compile(ctx ModuleContext, flags Flags, deps PathDe return out } -func (fuzzer *fuzzDecorator) stdLinkage(ctx *depsContext) RustLinkage { +func (fuzzer *fuzzDecorator) stdLinkage(device bool) RustLinkage { return RlibLinkage } diff --git a/rust/library.go b/rust/library.go index 9f9c40281..bc8935473 100644 --- a/rust/library.go +++ b/rust/library.go @@ -40,15 +40,15 @@ func init() { android.RegisterModuleType("rust_library_host_rlib", RustLibraryRlibHostFactory) android.RegisterModuleType("rust_ffi", RustFFIFactory) android.RegisterModuleType("rust_ffi_shared", RustFFISharedFactory) - android.RegisterModuleType("rust_ffi_rlib", RustFFIRlibFactory) + android.RegisterModuleType("rust_ffi_rlib", RustLibraryRlibFactory) android.RegisterModuleType("rust_ffi_host", RustFFIHostFactory) android.RegisterModuleType("rust_ffi_host_shared", RustFFISharedHostFactory) - android.RegisterModuleType("rust_ffi_host_rlib", RustFFIRlibHostFactory) + android.RegisterModuleType("rust_ffi_host_rlib", RustLibraryRlibHostFactory) // TODO: Remove when all instances of rust_ffi_static have been switched to rust_ffi_rlib // Alias rust_ffi_static to the rust_ffi_rlib factory - android.RegisterModuleType("rust_ffi_static", RustFFIRlibFactory) - android.RegisterModuleType("rust_ffi_host_static", RustFFIRlibHostFactory) + android.RegisterModuleType("rust_ffi_static", RustLibraryRlibFactory) + android.RegisterModuleType("rust_ffi_host_static", RustLibraryRlibHostFactory) } type VariantLibraryProperties struct { @@ -126,8 +126,6 @@ type libraryDecorator struct { includeDirs android.Paths sourceProvider SourceProvider - isFFI bool - // table-of-contents file for cdylib crates to optimize out relinking when possible tocFile android.OptionalPath } @@ -168,8 +166,6 @@ type libraryInterface interface { BuildOnlyShared() toc() android.OptionalPath - - isFFILibrary() bool } func (library *libraryDecorator) nativeCoverage() bool { @@ -274,13 +270,13 @@ func (library *libraryDecorator) autoDep(ctx android.BottomUpMutatorContext) aut } } -func (library *libraryDecorator) stdLinkage(ctx *depsContext) RustLinkage { - if library.static() || library.MutatedProperties.VariantIsStaticStd || (library.rlib() && library.isFFILibrary()) { +func (library *libraryDecorator) stdLinkage(device bool) RustLinkage { + if library.static() || library.MutatedProperties.VariantIsStaticStd { return RlibLinkage } else if library.baseCompiler.preferRlib() { return RlibLinkage } - return DefaultLinkage + return DylibLinkage } var _ compiler = (*libraryDecorator)(nil) @@ -310,7 +306,7 @@ func RustLibraryDylibFactory() android.Module { return module.Init() } -// rust_library_rlib produces an rlib (Rust crate type "rlib"). +// rust_library_rlib and rust_ffi_static produces an rlib (Rust crate type "rlib"). func RustLibraryRlibFactory() android.Module { module, library := NewRustLibrary(android.HostAndDeviceSupported) library.BuildOnlyRlib() @@ -349,8 +345,8 @@ func RustLibraryDylibHostFactory() android.Module { return module.Init() } -// rust_library_rlib_host produces an rlib for the host (Rust crate -// type "rlib"). +// rust_library_rlib_host and rust_ffi_static_host produces an rlib for the host +// (Rust crate type "rlib"). func RustLibraryRlibHostFactory() android.Module { module, library := NewRustLibrary(android.HostSupported) library.BuildOnlyRlib() @@ -365,33 +361,12 @@ func RustFFISharedHostFactory() android.Module { return module.Init() } -// rust_ffi_rlib_host produces an rlib for the host (Rust crate -// type "rlib"). -func RustFFIRlibHostFactory() android.Module { - module, library := NewRustLibrary(android.HostSupported) - library.BuildOnlyRlib() - - library.isFFI = true - return module.Init() -} - -// rust_ffi_rlib produces an rlib (Rust crate type "rlib"). -func RustFFIRlibFactory() android.Module { - module, library := NewRustLibrary(android.HostAndDeviceSupported) - library.BuildOnlyRlib() - - library.isFFI = true - return module.Init() -} - func (library *libraryDecorator) BuildOnlyFFI() { library.MutatedProperties.BuildDylib = false // we build rlibs for later static ffi linkage. library.MutatedProperties.BuildRlib = true library.MutatedProperties.BuildShared = true library.MutatedProperties.BuildStatic = false - - library.isFFI = true } func (library *libraryDecorator) BuildOnlyRust() { @@ -420,8 +395,6 @@ func (library *libraryDecorator) BuildOnlyStatic() { library.MutatedProperties.BuildDylib = false library.MutatedProperties.BuildShared = false library.MutatedProperties.BuildStatic = true - - library.isFFI = true } func (library *libraryDecorator) BuildOnlyShared() { @@ -429,12 +402,6 @@ func (library *libraryDecorator) BuildOnlyShared() { library.MutatedProperties.BuildDylib = false library.MutatedProperties.BuildStatic = false library.MutatedProperties.BuildShared = true - - library.isFFI = true -} - -func (library *libraryDecorator) isFFILibrary() bool { - return library.isFFI } func NewRustLibrary(hod android.HostOrDeviceSupported) (*Module, *libraryDecorator) { @@ -523,7 +490,9 @@ func (library *libraryDecorator) compilerFlags(ctx ModuleContext, flags Flags) F flags = CommonLibraryCompilerFlags(ctx, flags) - if library.isFFI { + if library.rlib() || library.shared() { + // rlibs collect include dirs as well since they are used to + // produce staticlibs in the final C linkages library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Include_dirs)...) library.includeDirs = append(library.includeDirs, android.PathsForModuleSrc(ctx, library.Properties.Export_include_dirs)...) } @@ -857,11 +826,7 @@ func (libstdTransitionMutator) Split(ctx android.BaseModuleContext) []string { // Only create a variant if a library is actually being built. if library, ok := m.compiler.(libraryInterface); ok { if library.rlib() && !library.sysroot() { - if library.isFFILibrary() { - return []string{"rlib-std"} - } else { - return []string{"rlib-std", "dylib-std"} - } + return []string{"rlib-std", "dylib-std"} } } } diff --git a/rust/rust.go b/rust/rust.go index 6fc682f25..0c48154bb 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -595,7 +595,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 } } @@ -681,15 +681,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 { @@ -1237,6 +1228,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 } @@ -1265,6 +1258,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() { @@ -1285,6 +1286,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) @@ -1603,7 +1612,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" } @@ -1670,7 +1679,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) diff --git a/rust/rust_test.go b/rust/rust_test.go index 767508d5f..7e64c0a9e 100644 --- a/rust/rust_test.go +++ b/rust/rust_test.go @@ -547,3 +547,31 @@ func assertString(t *testing.T, got, expected string) { t.Errorf("expected %q got %q", expected, got) } } + +func TestStdLinkMismatch(t *testing.T) { + // Test that we catch cases where the std linkage mismatches. This leads to + // a confusing rustc error where a crate is declared missing despite being + // passed in as a rustlib dependency / via the --extern flag. Thus, we want + // to make sure we detect it in Soong. + + // libfoo depends on libbar as an rlib, but does not link libstd as an rlib. + // libbar only links libstd as an rlib (prefer_rlib). + testRustError(t, "wrong StdLinkage", ` + rust_library { + name: "libfoo", + crate_name: "foo", + srcs: [ + "foo.rs", + ], + rlibs: ["libbar"], + } + rust_library { + name: "libbar", + crate_name: "bar", + srcs: [ + "bar.rs", + ], + prefer_rlib: true, + } + `) +} diff --git a/rust/test.go b/rust/test.go index 20ccfb31c..dce5e0391 100644 --- a/rust/test.go +++ b/rust/test.go @@ -238,7 +238,7 @@ func RustTestHostFactory() android.Module { return module.Init() } -func (test *testDecorator) stdLinkage(ctx *depsContext) RustLinkage { +func (test *testDecorator) stdLinkage(device bool) RustLinkage { return RlibLinkage } diff --git a/rust/testing.go b/rust/testing.go index 32cc82354..2e50e1e68 100644 --- a/rust/testing.go +++ b/rust/testing.go @@ -188,12 +188,12 @@ func registerRequiredBuildComponentsForTest(ctx android.RegistrationContext) { ctx.RegisterModuleType("rust_fuzz_host", RustFuzzHostFactory) ctx.RegisterModuleType("rust_ffi", RustFFIFactory) ctx.RegisterModuleType("rust_ffi_shared", RustFFISharedFactory) - ctx.RegisterModuleType("rust_ffi_rlib", RustFFIRlibFactory) - ctx.RegisterModuleType("rust_ffi_static", RustFFIRlibFactory) + ctx.RegisterModuleType("rust_ffi_rlib", RustLibraryRlibFactory) + ctx.RegisterModuleType("rust_ffi_static", RustLibraryRlibFactory) ctx.RegisterModuleType("rust_ffi_host", RustFFIHostFactory) ctx.RegisterModuleType("rust_ffi_host_shared", RustFFISharedHostFactory) - ctx.RegisterModuleType("rust_ffi_host_rlib", RustFFIRlibHostFactory) - ctx.RegisterModuleType("rust_ffi_host_static", RustFFIRlibHostFactory) + ctx.RegisterModuleType("rust_ffi_host_rlib", RustLibraryRlibHostFactory) + ctx.RegisterModuleType("rust_ffi_host_static", RustLibraryRlibHostFactory) ctx.RegisterModuleType("rust_proc_macro", ProcMacroFactory) ctx.RegisterModuleType("rust_protobuf", RustProtobufFactory) ctx.RegisterModuleType("rust_protobuf_host", RustProtobufHostFactory) |