From 2d407633ae8fbc0e513c53aa0e70dbb379eed48b Mon Sep 17 00:00:00 2001 From: Ivan Lozano Date: Thu, 7 Apr 2022 12:59:11 -0400 Subject: [PATCH] rust: Allow rustlibs to fallback to rlibs. Allow adding rlib-only libraries to rustlibs by having it fallback to selecting the rlib variant if a dylib variant is requested but not available. Bug: 224771894 Test: m nothing Test: New Soong test Change-Id: I47b19ec9dbf3da90a2b090aeda04556a0400c7d1 --- rust/library_test.go | 39 ++++++++++++++++++++++++++------------- rust/rust.go | 39 ++++++++++++++++++++++++--------------- 2 files changed, 50 insertions(+), 28 deletions(-) diff --git a/rust/library_test.go b/rust/library_test.go index d78dcdd97..4633cc7ba 100644 --- a/rust/library_test.go +++ b/rust/library_test.go @@ -200,23 +200,34 @@ func TestStaticLibraryLinkage(t *testing.T) { func TestAutoDeps(t *testing.T) { ctx := testRust(t, ` - rust_library_host { - name: "libbar", - srcs: ["bar.rs"], - crate_name: "bar", - } + rust_library_host { + name: "libbar", + srcs: ["bar.rs"], + crate_name: "bar", + } + rust_library_host_rlib { + name: "librlib_only", + srcs: ["bar.rs"], + crate_name: "rlib_only", + } rust_library_host { name: "libfoo", srcs: ["foo.rs"], crate_name: "foo", - rustlibs: ["libbar"], + rustlibs: [ + "libbar", + "librlib_only", + ], } - rust_ffi_host { - name: "libfoo.ffi", - srcs: ["foo.rs"], - crate_name: "foo", - rustlibs: ["libbar"], - }`) + rust_ffi_host { + name: "libfoo.ffi", + srcs: ["foo.rs"], + crate_name: "foo", + rustlibs: [ + "libbar", + "librlib_only", + ], + }`) libfooRlib := ctx.ModuleForTests("libfoo", "linux_glibc_x86_64_rlib_rlib-std") 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) { 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.") + } } } diff --git a/rust/rust.go b/rust/rust.go index d62726162..b287f678d 100644 --- a/rust/rust.go +++ b/rust/rust.go @@ -1371,13 +1371,12 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { } // rlibs + rlibDepVariations = append(rlibDepVariations, blueprint.Variation{Mutator: "rust_libraries", Variation: rlibVariation}) for _, lib := range deps.Rlibs { depTag := rlibDepTag lib = cc.RewriteSnapshotLib(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Rlibs) - actx.AddVariationDependencies(append(rlibDepVariations, []blueprint.Variation{ - {Mutator: "rust_libraries", Variation: rlibVariation}, - }...), depTag, lib) + actx.AddVariationDependencies(rlibDepVariations, depTag, lib) } // dylibs @@ -1389,21 +1388,25 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { // rustlibs if deps.Rustlibs != nil && !mod.compiler.Disabled() { autoDep := mod.compiler.(autoDeppable).autoDep(ctx) - if autoDep.depTag == rlibDepTag { - for _, lib := range deps.Rustlibs { - depTag := autoDep.depTag - lib = cc.RewriteSnapshotLib(lib, cc.GetSnapshot(mod, &snapshotInfo, actx).Rlibs) - actx.AddVariationDependencies(append(rlibDepVariations, []blueprint.Variation{ - {Mutator: "rust_libraries", Variation: autoDep.variation}, - }...), depTag, lib) + for _, lib := range deps.Rustlibs { + if autoDep.depTag == rlibDepTag { + // Handle the rlib deptag case + addRlibDependency(actx, lib, mod, snapshotInfo, rlibDepVariations) + } else { + // autoDep.depTag is a dylib depTag. Not all rustlibs may be available as a dylib however. + // 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 if deps.Stdlibs != nil { if mod.compiler.stdLinkage(ctx) == RlibLinkage { @@ -1479,6 +1482,12 @@ func (mod *Module) DepsMutator(actx android.BottomUpMutatorContext) { 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) { if mod, ok := ctx.Module().(*Module); ok && mod.Enabled() { mod.beginMutator(ctx)