Include NDK CRT object variants in the sysroot.

The actual NDK distribution will overwrite these (they're branded with
the platform's version information, which isn't what the NDK wants to
brand apps with), but including them here makes it easier to iterate
on the platform sysroot in situations that don't require a strictly
correct NDK sysroot.

Bug: None
Test: None
Change-Id: I22d4de9caa8753578a2327b1ece0deb005708b08
This commit is contained in:
Dan Albert 2023-04-04 23:22:11 +00:00
parent 4048bb0a89
commit 5b0d4f3a30
3 changed files with 31 additions and 8 deletions

View file

@ -142,6 +142,13 @@ func (n *ndkSingleton) GenerateBuildActions(ctx android.SingletonContext) {
staticLibInstallPaths, library.ndkSysrootPath)
}
}
if object, ok := m.linker.(*objectLinker); ok {
if object.ndkSysrootPath != nil {
staticLibInstallPaths = append(
staticLibInstallPaths, object.ndkSysrootPath)
}
}
}
})

View file

@ -44,6 +44,10 @@ var ccObjectSdkMemberType = &librarySdkMemberType{
type objectLinker struct {
*baseLinker
Properties ObjectLinkerProperties
// Location of the object in the sysroot. Empty if the object is not
// included in the NDK.
ndkSysrootPath android.Path
}
type objectBazelHandler struct {
@ -99,6 +103,10 @@ type ObjectLinkerProperties struct {
// Indicates that this module is a CRT object. CRT objects will be split
// into a variant per-API level between min_sdk_version and current.
Crt *bool
// Indicates that this module should not be included in the NDK sysroot.
// Only applies to CRT objects. Defaults to false.
Exclude_from_ndk_sysroot *bool
}
func newObject(hod android.HostOrDeviceSupported) *Module {
@ -268,17 +276,28 @@ func (object *objectLinker) link(ctx ModuleContext,
objs = objs.Append(deps.Objs)
var outputFile android.Path
var output android.WritablePath
builderFlags := flagsToBuilderFlags(flags)
outputName := ctx.ModuleName()
if !strings.HasSuffix(outputName, objectExtension) {
outputName += objectExtension
}
if len(objs.objFiles) == 1 && String(object.Properties.Linker_script) == "" {
output := android.PathForModuleOut(ctx, outputName)
outputFile = output
// isForPlatform is terribly named and actually means isNotApex.
if Bool(object.Properties.Crt) &&
!Bool(object.Properties.Exclude_from_ndk_sysroot) && ctx.useSdk() &&
ctx.isSdkVariant() && ctx.isForPlatform() {
output = getVersionedLibraryInstallPath(ctx,
nativeApiLevelOrPanic(ctx, ctx.sdkVersion())).Join(ctx, outputName)
object.ndkSysrootPath = output
} else {
output = android.PathForModuleOut(ctx, outputName)
}
outputFile := output
if len(objs.objFiles) == 1 && String(object.Properties.Linker_script) == "" {
if String(object.Properties.Prefix_symbols) != "" {
transformBinaryPrefixSymbols(ctx, String(object.Properties.Prefix_symbols), objs.objFiles[0],
builderFlags, output)
@ -290,9 +309,6 @@ func (object *objectLinker) link(ctx ModuleContext,
})
}
} else {
output := android.PathForModuleOut(ctx, outputName)
outputFile = output
if String(object.Properties.Prefix_symbols) != "" {
input := android.PathForModuleOut(ctx, "unprefixed", outputName)
transformBinaryPrefixSymbols(ctx, String(object.Properties.Prefix_symbols), input,

View file

@ -65,7 +65,7 @@ func TestUseCrtObjectOfCorrectVersion(t *testing.T) {
variant := "android_arm64_armv8-a_sdk"
crt := ctx.ModuleForTests("bin", variant).Rule("ld").Args["crtBegin"]
android.AssertStringDoesContain(t, "crt dep of sdk variant", crt,
variant+"_29/crtbegin_dynamic.o")
"29/crtbegin_dynamic.o")
// platform variant uses the crt object built for platform
variant = "android_arm64_armv8-a"