diff options
author | 2024-05-17 14:13:41 -0400 | |
---|---|---|
committer | 2024-06-26 01:35:41 +0000 | |
commit | fd47b1ab6a51ce3b148e2d4644b1d96b058c2064 (patch) | |
tree | 70d50006ec4333b14d8f47c4fc790283b92e87dc /rust/library.go | |
parent | 9c067f62d0b4d3e9c5a245f51f14dc51521c0e63 (diff) |
cc/rust: Alias ffi rlib variant for static_libs
Alias the rlib variant to "link: static". This allows declaring
rust_ffi_rlib modules in static_libs. This effectively removes any
distinction between rust_ffi_static and rust_ffi_rlib. Removing the
functionality for building Rust staticlib modules will be cleaned up in
a follow-on CL.
This should have the effect of changing the default linkage for all rust
modules in static_libs from linking individual staticlibs to building a
single staticlib that includes all rust_ffi rlib dependencies.
This removes the static_rlibs property, as we're now handling
the choice dynamically. This also makes rlibs only propagate through
cc_library_static modules if the rlib is included in
whole_static_lib. This both mirrors the expected behavior of
cc libraries and helps control which version of a crate ends up in the
final link (e.g. libdoh_ffi vs libdoh_ffi_for_test).
Bug: 254469782
Test: m
Test: m blueprint_tests
Change-Id: I2925f67f6dc9329dae3dcccafb8560900ac8a6fc
Diffstat (limited to 'rust/library.go')
-rw-r--r-- | rust/library.go | 52 |
1 files changed, 19 insertions, 33 deletions
diff --git a/rust/library.go b/rust/library.go index 2a21263bd..96c02c832 100644 --- a/rust/library.go +++ b/rust/library.go @@ -43,9 +43,9 @@ func init() { android.RegisterModuleType("rust_ffi_host_rlib", RustFFIRlibHostFactory) // TODO: Remove when all instances of rust_ffi_static have been switched to rust_ffi_rlib - // Alias rust_ffi_static to the combined rust_ffi_rlib factory - android.RegisterModuleType("rust_ffi_static", RustFFIStaticRlibFactory) - android.RegisterModuleType("rust_ffi_host_static", RustFFIStaticRlibHostFactory) + // Alias rust_ffi_static to the rust_ffi_rlib factory + android.RegisterModuleType("rust_ffi_static", RustFFIRlibFactory) + android.RegisterModuleType("rust_ffi_host_static", RustFFIRlibHostFactory) } type VariantLibraryProperties struct { @@ -353,7 +353,7 @@ func RustFFISharedHostFactory() android.Module { // type "rlib"). func RustFFIRlibHostFactory() android.Module { module, library := NewRustLibrary(android.HostSupported) - library.BuildOnlyRlibStatic() + library.BuildOnlyRlib() library.isFFI = true return module.Init() @@ -368,30 +368,12 @@ func RustFFIRlibFactory() android.Module { return module.Init() } -// rust_ffi_static produces a staticlib and an rlib variant -func RustFFIStaticRlibFactory() android.Module { - module, library := NewRustLibrary(android.HostAndDeviceSupported) - library.BuildOnlyRlibStatic() - - library.isFFI = true - return module.Init() -} - -// rust_ffi_static_host produces a staticlib and an rlib variant for the host -func RustFFIStaticRlibHostFactory() android.Module { - module, library := NewRustLibrary(android.HostSupported) - library.BuildOnlyRlibStatic() - - 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 = true + library.MutatedProperties.BuildStatic = false library.isFFI = true } @@ -417,14 +399,6 @@ func (library *libraryDecorator) BuildOnlyRlib() { library.MutatedProperties.BuildStatic = false } -func (library *libraryDecorator) BuildOnlyRlibStatic() { - library.MutatedProperties.BuildDylib = false - library.MutatedProperties.BuildRlib = true - library.MutatedProperties.BuildShared = false - library.MutatedProperties.BuildStatic = true - library.isFFI = true -} - func (library *libraryDecorator) BuildOnlyStatic() { library.MutatedProperties.BuildRlib = false library.MutatedProperties.BuildDylib = false @@ -766,10 +740,13 @@ func LibraryMutator(mctx android.BottomUpMutatorContext) { // The order of the variations (modules) matches the variant names provided. Iterate // through the new variation modules and set their mutated properties. + var emptyVariant = false + var rlibVariant = false for i, v := range modules { switch variants[i] { case rlibVariation: v.(*Module).compiler.(libraryInterface).setRlib() + rlibVariant = true case dylibVariation: v.(*Module).compiler.(libraryInterface).setDylib() if v.(*Module).ModuleBase.ImageVariation().Variation == android.VendorRamdiskVariation { @@ -784,11 +761,19 @@ func LibraryMutator(mctx android.BottomUpMutatorContext) { // Disable the compilation steps. v.(*Module).compiler.SetDisabled() case "": - // if there's an empty variant, alias it so it is the default variant - mctx.AliasVariation("") + emptyVariant = true } } + if rlibVariant && library.isFFILibrary() { + // If an rlib variant is set and this is an FFI library, make it the + // default variant so CC can link against it appropriately. + mctx.AliasVariation(rlibVariation) + } else if emptyVariant { + // If there's an empty variant, alias it so it is the default variant + mctx.AliasVariation("") + } + // If a source variant is created, add an inter-variant dependency // between the other variants and the source variant. if sourceVariant { @@ -817,6 +802,7 @@ func LibstdMutator(mctx android.BottomUpMutatorContext) { rlib := modules[0].(*Module) rlib.compiler.(libraryInterface).setRlibStd() rlib.Properties.RustSubName += RlibStdlibSuffix + mctx.AliasVariation("rlib-std") } else { variants := []string{"rlib-std", "dylib-std"} modules := mctx.CreateLocalVariations(variants...) |