diff --git a/cc/library.go b/cc/library.go index 42115cc04..2b0ee464c 100644 --- a/cc/library.go +++ b/cc/library.go @@ -1257,6 +1257,7 @@ func (library *libraryDecorator) linkShared(ctx ModuleContext, UnstrippedSharedLibrary: library.unstrippedOutputFile, CoverageSharedLibrary: library.coverageOutputFile, StaticAnalogue: staticAnalogue, + Target: ctx.Target(), }) stubs := ctx.GetDirectDepsWithTag(stubImplDepTag) diff --git a/cc/linkable.go b/cc/linkable.go index 571a3bb71..0fb9c0944 100644 --- a/cc/linkable.go +++ b/cc/linkable.go @@ -209,6 +209,7 @@ func HeaderDepTag() blueprint.DependencyTag { type SharedLibraryInfo struct { SharedLibrary android.Path UnstrippedSharedLibrary android.Path + Target android.Target TableOfContents android.OptionalPath CoverageSharedLibrary android.OptionalPath diff --git a/cc/ndk_prebuilt.go b/cc/ndk_prebuilt.go index 8d522d0c4..b91c73722 100644 --- a/cc/ndk_prebuilt.go +++ b/cc/ndk_prebuilt.go @@ -188,6 +188,7 @@ func (ndk *ndkPrebuiltStlLinker) link(ctx ModuleContext, flags Flags, ctx.SetProvider(SharedLibraryInfoProvider, SharedLibraryInfo{ SharedLibrary: lib, UnstrippedSharedLibrary: lib, + Target: ctx.Target(), }) } diff --git a/cc/prebuilt.go b/cc/prebuilt.go index c19b1ffe9..bea1782f1 100644 --- a/cc/prebuilt.go +++ b/cc/prebuilt.go @@ -185,6 +185,7 @@ func (p *prebuiltLibraryLinker) link(ctx ModuleContext, ctx.SetProvider(SharedLibraryInfoProvider, SharedLibraryInfo{ SharedLibrary: outputFile, UnstrippedSharedLibrary: p.unstrippedOutputFile, + Target: ctx.Target(), TableOfContents: p.tocFile, }) diff --git a/cc/snapshot_prebuilt.go b/cc/snapshot_prebuilt.go index 6d48aed64..885a0ce6d 100644 --- a/cc/snapshot_prebuilt.go +++ b/cc/snapshot_prebuilt.go @@ -591,6 +591,7 @@ func (p *snapshotLibraryDecorator) link(ctx ModuleContext, flags Flags, deps Pat ctx.SetProvider(SharedLibraryInfoProvider, SharedLibraryInfo{ SharedLibrary: in, UnstrippedSharedLibrary: p.unstrippedOutputFile, + Target: ctx.Target(), TableOfContents: p.tocFile, }) diff --git a/cc/vndk_prebuilt.go b/cc/vndk_prebuilt.go index 71e6427c1..fc4412a75 100644 --- a/cc/vndk_prebuilt.go +++ b/cc/vndk_prebuilt.go @@ -170,6 +170,7 @@ func (p *vndkPrebuiltLibraryDecorator) link(ctx ModuleContext, ctx.SetProvider(SharedLibraryInfoProvider, SharedLibraryInfo{ SharedLibrary: in, UnstrippedSharedLibrary: p.unstrippedOutputFile, + Target: ctx.Target(), TableOfContents: p.tocFile, }) diff --git a/java/java.go b/java/java.go index ee4f2eb0b..adb0c5644 100644 --- a/java/java.go +++ b/java/java.go @@ -27,6 +27,7 @@ import ( "github.com/google/blueprint/proptools" "android/soong/android" + "android/soong/cc" "android/soong/dexpreopt" "android/soong/java/config" "android/soong/tradefed" @@ -708,6 +709,9 @@ type testProperties struct { // Test options. Test_options TestOptions + + // Names of modules containing JNI libraries that should be installed alongside the test. + Jni_libs []string } type hostTestProperties struct { @@ -769,6 +773,13 @@ func (j *TestHost) DepsMutator(ctx android.BottomUpMutatorContext) { } } + if len(j.testProperties.Jni_libs) > 0 { + for _, target := range ctx.MultiTargets() { + sharedLibVariations := append(target.Variations(), blueprint.Variation{Mutator: "link", Variation: "shared"}) + ctx.AddFarVariationDependencies(sharedLibVariations, jniLibTag, j.testProperties.Jni_libs...) + } + } + j.deps(ctx) } @@ -793,6 +804,29 @@ func (j *Test) GenerateAndroidBuildActions(ctx android.ModuleContext) { j.data = append(j.data, android.OutputFileForModule(ctx, dep, "")) }) + ctx.VisitDirectDepsWithTag(jniLibTag, func(dep android.Module) { + sharedLibInfo := ctx.OtherModuleProvider(dep, cc.SharedLibraryInfoProvider).(cc.SharedLibraryInfo) + if sharedLibInfo.SharedLibrary != nil { + // Copy to an intermediate output directory to append "lib[64]" to the path, + // so that it's compatible with the default rpath values. + var relPath string + if sharedLibInfo.Target.Arch.ArchType.Multilib == "lib64" { + relPath = filepath.Join("lib64", sharedLibInfo.SharedLibrary.Base()) + } else { + relPath = filepath.Join("lib", sharedLibInfo.SharedLibrary.Base()) + } + relocatedLib := android.PathForModuleOut(ctx, "relocated").Join(ctx, relPath) + ctx.Build(pctx, android.BuildParams{ + Rule: android.Cp, + Input: sharedLibInfo.SharedLibrary, + Output: relocatedLib, + }) + j.data = append(j.data, relocatedLib) + } else { + ctx.PropertyErrorf("jni_libs", "%q of type %q is not supported", dep.Name(), ctx.OtherModuleType(dep)) + } + }) + j.Library.GenerateAndroidBuildActions(ctx) } diff --git a/java/java_test.go b/java/java_test.go index 052345871..4fc35265f 100644 --- a/java/java_test.go +++ b/java/java_test.go @@ -462,6 +462,32 @@ func TestBinary(t *testing.T) { } } +func TestTest(t *testing.T) { + ctx, _ := testJava(t, ` + java_test_host { + name: "foo", + srcs: ["a.java"], + jni_libs: ["libjni"], + } + + cc_library_shared { + name: "libjni", + host_supported: true, + device_supported: false, + stl: "none", + } + `) + + buildOS := android.BuildOs.String() + + foo := ctx.ModuleForTests("foo", buildOS+"_common").Module().(*TestHost) + + fooTestData := foo.data + if len(fooTestData) != 1 || fooTestData[0].Rel() != "lib64/libjni.so" { + t.Errorf(`expected foo test data relative path ["lib64/libjni.so"], got %q`, fooTestData.Strings()) + } +} + func TestHostBinaryNoJavaDebugInfoOverride(t *testing.T) { bp := ` java_library { diff --git a/rust/library.go b/rust/library.go index 26c104c95..052fb3a63 100644 --- a/rust/library.go +++ b/rust/library.go @@ -496,6 +496,7 @@ func (library *libraryDecorator) compile(ctx ModuleContext, flags Flags, deps Pa ctx.SetProvider(cc.SharedLibraryInfoProvider, cc.SharedLibraryInfo{ SharedLibrary: outputFile, UnstrippedSharedLibrary: outputFile, + Target: ctx.Target(), }) }