From f2cc1b77f34d49036e674311e73194b47ff36760 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Wed, 9 Dec 2020 00:20:45 +0900 Subject: [PATCH] rust ffi libraries can be included in APEX This CL fixes a bug that rust_ffi_shared libraries can't be included in an APEX either directly (via native_shared_libs property) or indirectly. Bug: 175105284 Test: m Change-Id: I2e2d3e11b3901f3412b9725e47a8ebf31f93847b --- apex/apex.go | 15 ++++++++++----- apex/apex_test.go | 28 ++++++++++++++++++++++++++-- 2 files changed, 36 insertions(+), 7 deletions(-) diff --git a/apex/apex.go b/apex/apex.go index 7ab74541f..35859b92d 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -522,11 +522,8 @@ func addDependenciesForNativeModules(ctx android.BottomUpMutatorContext, nativeM if ctx.Device() { binVariations = append(binVariations, blueprint.Variation{Mutator: "image", Variation: imageVariation}) - libVariations = append(libVariations, - blueprint.Variation{Mutator: "image", Variation: imageVariation}, - blueprint.Variation{Mutator: "version", Variation: ""}) // "" is the non-stub variant - rustLibVariations = append(rustLibVariations, - blueprint.Variation{Mutator: "image", Variation: imageVariation}) + libVariations = append(libVariations, blueprint.Variation{Mutator: "image", Variation: imageVariation}) + rustLibVariations = append(rustLibVariations, blueprint.Variation{Mutator: "image", Variation: imageVariation}) } // Use *FarVariation* to be able to depend on modules having conflicting variations with @@ -1522,6 +1519,9 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { provideNativeLibs = append(provideNativeLibs, fi.stem()) } return true // track transitive dependencies + } else if r, ok := child.(*rust.Module); ok { + fi := apexFileForRustLibrary(ctx, r) + filesInfo = append(filesInfo, fi) } else { propertyName := "native_shared_libs" if isJniLib { @@ -1683,6 +1683,11 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { } filesInfo = append(filesInfo, af) return true // track transitive dependencies + } else if rm, ok := child.(*rust.Module); ok { + af := apexFileForRustLibrary(ctx, rm) + af.transitiveDep = true + filesInfo = append(filesInfo, af) + return true // track transitive dependencies } } else if cc.IsTestPerSrcDepTag(depTag) { if cc, ok := child.(*cc.Module); ok { diff --git a/apex/apex_test.go b/apex/apex_test.go index 0b67ef577..79f7441f9 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -355,7 +355,10 @@ func TestBasicApex(t *testing.T) { androidManifest: ":myapex.androidmanifest", key: "myapex.key", binaries: ["foo.rust"], - native_shared_libs: ["mylib"], + native_shared_libs: [ + "mylib", + "libfoo.ffi", + ], rust_dyn_libs: ["libfoo.dylib.rust"], multilib: { both: { @@ -392,7 +395,10 @@ func TestBasicApex(t *testing.T) { cc_library { name: "mylib", srcs: ["mylib.cpp"], - shared_libs: ["mylib2"], + shared_libs: [ + "mylib2", + "libbar.ffi", + ], system_shared_libs: [], stl: "none", // TODO: remove //apex_available:platform @@ -444,6 +450,20 @@ func TestBasicApex(t *testing.T) { apex_available: ["myapex"], } + rust_ffi_shared { + name: "libfoo.ffi", + srcs: ["foo.rs"], + crate_name: "foo", + apex_available: ["myapex"], + } + + rust_ffi_shared { + name: "libbar.ffi", + srcs: ["foo.rs"], + crate_name: "bar", + apex_available: ["myapex"], + } + apex { name: "com.android.gki.fake", binaries: ["foo"], @@ -559,12 +579,14 @@ func TestBasicApex(t *testing.T) { ensureListContains(t, ctx.ModuleVariantsForTests("myjar"), "android_common_apex10000") ensureListContains(t, ctx.ModuleVariantsForTests("myjar_dex"), "android_common_apex10000") ensureListContains(t, ctx.ModuleVariantsForTests("foo.rust"), "android_arm64_armv8-a_apex10000") + ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.ffi"), "android_arm64_armv8-a_shared_apex10000") // Ensure that apex variant is created for the indirect dep ensureListContains(t, ctx.ModuleVariantsForTests("mylib2"), "android_arm64_armv8-a_shared_apex10000") ensureListContains(t, ctx.ModuleVariantsForTests("myotherjar"), "android_common_apex10000") ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.rlib.rust"), "android_arm64_armv8-a_rlib_dylib-std_apex10000") ensureListContains(t, ctx.ModuleVariantsForTests("libfoo.dylib.rust"), "android_arm64_armv8-a_dylib_apex10000") + ensureListContains(t, ctx.ModuleVariantsForTests("libbar.ffi"), "android_arm64_armv8-a_shared_apex10000") // Ensure that both direct and indirect deps are copied into apex ensureContains(t, copyCmds, "image.apex/lib64/mylib.so") @@ -572,6 +594,8 @@ func TestBasicApex(t *testing.T) { ensureContains(t, copyCmds, "image.apex/javalib/myjar_stem.jar") ensureContains(t, copyCmds, "image.apex/javalib/myjar_dex.jar") ensureContains(t, copyCmds, "image.apex/lib64/libfoo.dylib.rust.dylib.so") + ensureContains(t, copyCmds, "image.apex/lib64/libfoo.ffi.so") + ensureContains(t, copyCmds, "image.apex/lib64/libbar.ffi.so") // .. but not for java libs ensureNotContains(t, copyCmds, "image.apex/javalib/myotherjar.jar") ensureNotContains(t, copyCmds, "image.apex/javalib/msharedjar.jar")