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
diff --git a/rust/library.go b/rust/library.go
index 2a21263..96c02c8 100644
--- a/rust/library.go
+++ b/rust/library.go
@@ -43,9 +43,9 @@
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 @@
// 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 @@
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 @@
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 @@
// 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 @@
// 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 @@
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...)