Merge "rust: Allow rustlibs to fallback to rlibs."

This commit is contained in:
Ivan Lozano
2022-04-18 18:53:58 +00:00
committed by Gerrit Code Review
2 changed files with 50 additions and 28 deletions

View File

@@ -200,23 +200,34 @@ func TestStaticLibraryLinkage(t *testing.T) {
func TestAutoDeps(t *testing.T) { func TestAutoDeps(t *testing.T) {
ctx := testRust(t, ` ctx := testRust(t, `
rust_library_host { rust_library_host {
name: "libbar", name: "libbar",
srcs: ["bar.rs"], srcs: ["bar.rs"],
crate_name: "bar", crate_name: "bar",
} }
rust_library_host_rlib {
name: "librlib_only",
srcs: ["bar.rs"],
crate_name: "rlib_only",
}
rust_library_host { rust_library_host {
name: "libfoo", name: "libfoo",
srcs: ["foo.rs"], srcs: ["foo.rs"],
crate_name: "foo", crate_name: "foo",
rustlibs: ["libbar"], rustlibs: [
"libbar",
"librlib_only",
],
} }
rust_ffi_host { rust_ffi_host {
name: "libfoo.ffi", name: "libfoo.ffi",
srcs: ["foo.rs"], srcs: ["foo.rs"],
crate_name: "foo", crate_name: "foo",
rustlibs: ["libbar"], rustlibs: [
}`) "libbar",
"librlib_only",
],
}`)
libfooRlib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_rlib_rlib-std") libfooRlib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_rlib_rlib-std")
libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib") libfooDylib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_dylib")
@@ -239,7 +250,9 @@ func TestAutoDeps(t *testing.T) {
if android.InList("libbar.dylib-std", dyn.Module().(*Module).Properties.AndroidMkRlibs) { if android.InList("libbar.dylib-std", dyn.Module().(*Module).Properties.AndroidMkRlibs) {
t.Errorf("libbar present as rlib dependency in dynamic lib") t.Errorf("libbar present as rlib dependency in dynamic lib")
} }
if !android.InList("librlib_only.dylib-std", dyn.Module().(*Module).Properties.AndroidMkRlibs) {
t.Errorf("librlib_only should be selected by rustlibs as an rlib.")
}
} }
} }

View File

@@ -1368,13 +1368,12 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
} }
// rlibs // rlibs
rlibDepVariations = append(rlibDepVariations, blueprint.Variation{Mutator: "rust_libraries", Variation: rlibVariation})
for _, lib := range deps.Rlibs { for _, lib := range deps.Rlibs {
depTag := rlibDepTag depTag := rlibDepTag
lib = cc.RewriteSnapshotLib(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Rlibs) lib = cc.RewriteSnapshotLib(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Rlibs)
actx.AddVariationDependencies(append(rlibDepVariations, []blueprint.Variation{ actx.AddVariationDependencies(rlibDepVariations, depTag, lib)
{Mutator: "rust_libraries", Variation: rlibVariation},
}...), depTag, lib)
} }
// dylibs // dylibs
@@ -1386,21 +1385,25 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
// rustlibs // rustlibs
if deps.Rustlibs != nil && !mod.compiler.Disabled() { if deps.Rustlibs != nil && !mod.compiler.Disabled() {
autoDep := mod.compiler.(autoDeppable).autoDep(ctx) autoDep := mod.compiler.(autoDeppable).autoDep(ctx)
if autoDep.depTag == rlibDepTag { for _, lib := range deps.Rustlibs {
for _, lib := range deps.Rustlibs { if autoDep.depTag == rlibDepTag {
depTag := autoDep.depTag // Handle the rlib deptag case
lib = cc.RewriteSnapshotLib(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Rlibs) addRlibDependency(actx, lib, mod, snapshotInfo, rlibDepVariations)
actx.AddVariationDependencies(append(rlibDepVariations, []blueprint.Variation{ } else {
{Mutator: "rust_libraries", Variation: autoDep.variation}, // autoDep.depTag is a dylib depTag. Not all rustlibs may be available as a dylib however.
}...), depTag, lib) // Check for the existence of the dylib deptag variant. Select it if available,
// otherwise select the rlib variant.
autoDepVariations := append(commonDepVariations,
blueprint.Variation{Mutator: "rust_libraries", Variation: autoDep.variation})
if actx.OtherModuleDependencyVariantExists(autoDepVariations, lib) {
actx.AddVariationDependencies(autoDepVariations, autoDep.depTag, lib)
} else {
// If there's no dylib dependency available, try to add the rlib dependency instead.
addRlibDependency(actx, lib, mod, snapshotInfo, rlibDepVariations)
}
} }
} else {
actx.AddVariationDependencies(
append(commonDepVariations, blueprint.Variation{Mutator: "rust_libraries", Variation: autoDep.variation}),
autoDep.depTag, deps.Rustlibs...)
} }
} }
// stdlibs // stdlibs
if deps.Stdlibs != nil { if deps.Stdlibs != nil {
if mod.compiler.stdLinkage(ctx) == RlibLinkage { if mod.compiler.stdLinkage(ctx) == RlibLinkage {
@@ -1476,6 +1479,12 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) {
actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), procMacroDepTag, deps.ProcMacros...) actx.AddFarVariationDependencies(ctx.Config().BuildOSTarget.Variations(), procMacroDepTag, deps.ProcMacros...)
} }
// addRlibDependency will add an rlib dependency, rewriting to the snapshot library if available.
func addRlibDependency(actx android.BottomUpMutatorContext, lib string, mod *Module, snapshotInfo *cc.SnapshotInfo, variations []blueprint.Variation) {
lib = cc.RewriteSnapshotLib(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Rlibs)
actx.AddVariationDependencies(variations, rlibDepTag, lib)
}
func BeginMutator(ctx android.BottomUpMutatorContext) { func BeginMutator(ctx android.BottomUpMutatorContext) {
if mod, ok := ctx.Module().(*Module); ok && mod.Enabled() { if mod, ok := ctx.Module().(*Module); ok && mod.Enabled() {
mod.beginMutator(ctx) mod.beginMutator(ctx)