Merge "Include NDK CRT object variants in the sysroot."

This commit is contained in:
Treehugger Robot
2023-04-11 01:00:04 +00:00
committed by Gerrit Code Review
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) 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 { type objectLinker struct {
*baseLinker *baseLinker
Properties ObjectLinkerProperties 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 { type objectBazelHandler struct {
@@ -99,6 +103,10 @@ type ObjectLinkerProperties struct {
// Indicates that this module is a CRT object. CRT objects will be split // 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. // into a variant per-API level between min_sdk_version and current.
Crt *bool 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 { func newObject(hod android.HostOrDeviceSupported) *Module {
@@ -268,17 +276,28 @@ func (object *objectLinker) link(ctx ModuleContext,
objs = objs.Append(deps.Objs) objs = objs.Append(deps.Objs)
var outputFile android.Path var output android.WritablePath
builderFlags := flagsToBuilderFlags(flags) builderFlags := flagsToBuilderFlags(flags)
outputName := ctx.ModuleName() outputName := ctx.ModuleName()
if !strings.HasSuffix(outputName, objectExtension) { if !strings.HasSuffix(outputName, objectExtension) {
outputName += objectExtension outputName += objectExtension
} }
if len(objs.objFiles) == 1 && String(object.Properties.Linker_script) == "" { // isForPlatform is terribly named and actually means isNotApex.
output := android.PathForModuleOut(ctx, outputName) if Bool(object.Properties.Crt) &&
outputFile = output !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) != "" { if String(object.Properties.Prefix_symbols) != "" {
transformBinaryPrefixSymbols(ctx, String(object.Properties.Prefix_symbols), objs.objFiles[0], transformBinaryPrefixSymbols(ctx, String(object.Properties.Prefix_symbols), objs.objFiles[0],
builderFlags, output) builderFlags, output)
@@ -290,9 +309,6 @@ func (object *objectLinker) link(ctx ModuleContext,
}) })
} }
} else { } else {
output := android.PathForModuleOut(ctx, outputName)
outputFile = output
if String(object.Properties.Prefix_symbols) != "" { if String(object.Properties.Prefix_symbols) != "" {
input := android.PathForModuleOut(ctx, "unprefixed", outputName) input := android.PathForModuleOut(ctx, "unprefixed", outputName)
transformBinaryPrefixSymbols(ctx, String(object.Properties.Prefix_symbols), input, 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" variant := "android_arm64_armv8-a_sdk"
crt := ctx.ModuleForTests("bin", variant).Rule("ld").Args["crtBegin"] crt := ctx.ModuleForTests("bin", variant).Rule("ld").Args["crtBegin"]
android.AssertStringDoesContain(t, "crt dep of sdk variant", crt, 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 // platform variant uses the crt object built for platform
variant = "android_arm64_armv8-a" variant = "android_arm64_armv8-a"