Merge "Diff source dump and previous version dump for Cross-Version ABI Check"
This commit is contained in:
@@ -226,17 +226,27 @@ func (library *libraryDecorator) androidMkWriteExportedFlags(entries *android.An
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (library *libraryDecorator) androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries *android.AndroidMkEntries) {
|
func (library *libraryDecorator) getAbiDiffsForAndroidMkDeps() []string {
|
||||||
if library.sAbiDiff.Valid() && !library.static() {
|
if library.static() {
|
||||||
entries.AddStrings("LOCAL_ADDITIONAL_DEPENDENCIES", library.sAbiDiff.String())
|
return nil
|
||||||
}
|
}
|
||||||
|
var abiDiffs []string
|
||||||
|
if library.sAbiDiff.Valid() {
|
||||||
|
abiDiffs = append(abiDiffs, library.sAbiDiff.String())
|
||||||
|
}
|
||||||
|
if library.prevSAbiDiff.Valid() {
|
||||||
|
abiDiffs = append(abiDiffs, library.prevSAbiDiff.String())
|
||||||
|
}
|
||||||
|
return abiDiffs
|
||||||
|
}
|
||||||
|
|
||||||
|
func (library *libraryDecorator) androidMkEntriesWriteAdditionalDependenciesForSourceAbiDiff(entries *android.AndroidMkEntries) {
|
||||||
|
entries.AddStrings("LOCAL_ADDITIONAL_DEPENDENCIES", library.getAbiDiffsForAndroidMkDeps()...)
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO(ccross): remove this once apex/androidmk.go is converted to AndroidMkEntries
|
// TODO(ccross): remove this once apex/androidmk.go is converted to AndroidMkEntries
|
||||||
func (library *libraryDecorator) androidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
|
func (library *libraryDecorator) androidMkWriteAdditionalDependenciesForSourceAbiDiff(w io.Writer) {
|
||||||
if library.sAbiDiff.Valid() && !library.static() {
|
fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES +=", strings.Join(library.getAbiDiffsForAndroidMkDeps(), " "))
|
||||||
fmt.Fprintln(w, "LOCAL_ADDITIONAL_DEPENDENCIES +=", library.sAbiDiff.String())
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (library *libraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
|
func (library *libraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) {
|
||||||
|
@@ -920,10 +920,15 @@ func unzipRefDump(ctx android.ModuleContext, zippedRefDump android.Path, baseNam
|
|||||||
|
|
||||||
// sourceAbiDiff registers a build statement to compare linked sAbi dump files (.lsdump).
|
// sourceAbiDiff registers a build statement to compare linked sAbi dump files (.lsdump).
|
||||||
func sourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
|
func sourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceDump android.Path,
|
||||||
baseName, exportedHeaderFlags string, diffFlags []string,
|
baseName, prevVersion, exportedHeaderFlags string, diffFlags []string,
|
||||||
checkAllApis, isLlndk, isNdk, isVndkExt bool) android.OptionalPath {
|
checkAllApis, isLlndk, isNdk, isVndkExt, previousVersionDiff bool) android.OptionalPath {
|
||||||
|
|
||||||
outputFile := android.PathForModuleOut(ctx, baseName+".abidiff")
|
var outputFile android.ModuleOutPath
|
||||||
|
if prevVersion == "" {
|
||||||
|
outputFile = android.PathForModuleOut(ctx, baseName+".abidiff")
|
||||||
|
} else {
|
||||||
|
outputFile = android.PathForModuleOut(ctx, baseName+"."+prevVersion+".abidiff")
|
||||||
|
}
|
||||||
libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
|
libName := strings.TrimSuffix(baseName, filepath.Ext(baseName))
|
||||||
|
|
||||||
var extraFlags []string
|
var extraFlags []string
|
||||||
@@ -935,10 +940,15 @@ func sourceAbiDiff(ctx android.ModuleContext, inputDump android.Path, referenceD
|
|||||||
"-allow-unreferenced-elf-symbol-changes")
|
"-allow-unreferenced-elf-symbol-changes")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// TODO(b/241496591): Remove -advice-only after b/239792343 and b/239790286 are reolved.
|
||||||
|
if previousVersionDiff {
|
||||||
|
extraFlags = append(extraFlags, "-advice-only")
|
||||||
|
}
|
||||||
|
|
||||||
if isLlndk || isNdk {
|
if isLlndk || isNdk {
|
||||||
extraFlags = append(extraFlags, "-consider-opaque-types-different")
|
extraFlags = append(extraFlags, "-consider-opaque-types-different")
|
||||||
}
|
}
|
||||||
if isVndkExt {
|
if isVndkExt || previousVersionDiff {
|
||||||
extraFlags = append(extraFlags, "-allow-extensions")
|
extraFlags = append(extraFlags, "-allow-extensions")
|
||||||
}
|
}
|
||||||
// TODO(b/232891473): Simplify the above logic with diffFlags.
|
// TODO(b/232891473): Simplify the above logic with diffFlags.
|
||||||
|
@@ -613,6 +613,9 @@ type libraryDecorator struct {
|
|||||||
// Source Abi Diff
|
// Source Abi Diff
|
||||||
sAbiDiff android.OptionalPath
|
sAbiDiff android.OptionalPath
|
||||||
|
|
||||||
|
// Source Abi Diff against previous SDK version
|
||||||
|
prevSAbiDiff android.OptionalPath
|
||||||
|
|
||||||
// Location of the static library in the sysroot. Empty if the library is
|
// Location of the static library in the sysroot. Empty if the library is
|
||||||
// not included in the NDK.
|
// not included in the NDK.
|
||||||
ndkSysrootPath android.Path
|
ndkSysrootPath android.Path
|
||||||
@@ -1620,9 +1623,39 @@ func getRefAbiDumpFile(ctx ModuleContext, vndkVersion, fileName string) android.
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func prevDumpRefVersion(ctx ModuleContext) string {
|
||||||
|
sdkVersionInt := ctx.Config().PlatformSdkVersion().FinalInt()
|
||||||
|
sdkVersionStr := ctx.Config().PlatformSdkVersion().String()
|
||||||
|
|
||||||
|
if ctx.Config().PlatformSdkFinal() {
|
||||||
|
return strconv.Itoa(sdkVersionInt - 1)
|
||||||
|
} else {
|
||||||
|
var dirName string
|
||||||
|
|
||||||
|
isNdk := ctx.isNdk(ctx.Config())
|
||||||
|
if isNdk {
|
||||||
|
dirName = "ndk"
|
||||||
|
} else {
|
||||||
|
dirName = "platform"
|
||||||
|
}
|
||||||
|
|
||||||
|
// The platform SDK version can be upgraded before finalization while the corresponding abi dumps hasn't
|
||||||
|
// been generated. Thus the Cross-Version Check chooses PLATFORM_SDK_VERION - 1 as previous version.
|
||||||
|
// This situation could be identified by checking the existence of the PLATFORM_SDK_VERION dump directory.
|
||||||
|
refDumpDir := android.ExistentPathForSource(ctx, "prebuilts", "abi-dumps", dirName, sdkVersionStr)
|
||||||
|
if refDumpDir.Valid() {
|
||||||
|
return sdkVersionStr
|
||||||
|
} else {
|
||||||
|
return strconv.Itoa(sdkVersionInt - 1)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objects, fileName string, soFile android.Path) {
|
func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objects, fileName string, soFile android.Path) {
|
||||||
if library.sabi.shouldCreateSourceAbiDump() {
|
if library.sabi.shouldCreateSourceAbiDump() {
|
||||||
var version string
|
var version string
|
||||||
|
var prevVersion string
|
||||||
|
|
||||||
if ctx.useVndk() {
|
if ctx.useVndk() {
|
||||||
// For modules linking against vndk, follow its vndk version
|
// For modules linking against vndk, follow its vndk version
|
||||||
version = ctx.Module().(*Module).VndkVersion()
|
version = ctx.Module().(*Module).VndkVersion()
|
||||||
@@ -1634,6 +1667,7 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec
|
|||||||
} else {
|
} else {
|
||||||
version = "current"
|
version = "current"
|
||||||
}
|
}
|
||||||
|
prevVersion = prevDumpRefVersion(ctx)
|
||||||
}
|
}
|
||||||
|
|
||||||
exportIncludeDirs := library.flagExporter.exportedIncludes(ctx)
|
exportIncludeDirs := library.flagExporter.exportedIncludes(ctx)
|
||||||
@@ -1652,13 +1686,24 @@ func (library *libraryDecorator) linkSAbiDumpFiles(ctx ModuleContext, objs Objec
|
|||||||
|
|
||||||
addLsdumpPath(classifySourceAbiDump(ctx) + ":" + library.sAbiOutputFile.String())
|
addLsdumpPath(classifySourceAbiDump(ctx) + ":" + library.sAbiOutputFile.String())
|
||||||
|
|
||||||
|
if prevVersion != "" {
|
||||||
|
prevRefAbiDumpFile := getRefAbiDumpFile(ctx, prevVersion, fileName)
|
||||||
|
if prevRefAbiDumpFile != nil {
|
||||||
|
library.prevSAbiDiff = sourceAbiDiff(ctx, library.sAbiOutputFile.Path(),
|
||||||
|
prevRefAbiDumpFile, fileName, prevVersion, exportedHeaderFlags,
|
||||||
|
library.Properties.Header_abi_checker.Diff_flags,
|
||||||
|
Bool(library.Properties.Header_abi_checker.Check_all_apis),
|
||||||
|
ctx.IsLlndk(), ctx.isNdk(ctx.Config()), ctx.IsVndkExt(), true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
refAbiDumpFile := getRefAbiDumpFile(ctx, version, fileName)
|
refAbiDumpFile := getRefAbiDumpFile(ctx, version, fileName)
|
||||||
if refAbiDumpFile != nil {
|
if refAbiDumpFile != nil {
|
||||||
library.sAbiDiff = sourceAbiDiff(ctx, library.sAbiOutputFile.Path(),
|
library.sAbiDiff = sourceAbiDiff(ctx, library.sAbiOutputFile.Path(),
|
||||||
refAbiDumpFile, fileName, exportedHeaderFlags,
|
refAbiDumpFile, fileName, "", exportedHeaderFlags,
|
||||||
library.Properties.Header_abi_checker.Diff_flags,
|
library.Properties.Header_abi_checker.Diff_flags,
|
||||||
Bool(library.Properties.Header_abi_checker.Check_all_apis),
|
Bool(library.Properties.Header_abi_checker.Check_all_apis),
|
||||||
ctx.IsLlndk(), ctx.isNdk(ctx.Config()), ctx.IsVndkExt())
|
ctx.IsLlndk(), ctx.isNdk(ctx.Config()), ctx.IsVndkExt(), false)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user