diff options
author | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-02-04 00:54:27 +0000 |
---|---|---|
committer | Automerger Merge Worker <android-build-automerger-merge-worker@system.gserviceaccount.com> | 2020-02-04 00:54:27 +0000 |
commit | 8ee870a540764c8b8ca538fec4ddf18d056b6ec4 (patch) | |
tree | a861806004653c8cb5543528356938bcd9b2497f | |
parent | 8d8639d5f506d2058949a517c170d277203da566 (diff) | |
parent | abc4f820a1e5c7bd69412c802dbaf0743a2f18db (diff) | |
download | build_soong-8ee870a540764c8b8ca538fec4ddf18d056b6ec4.tar.gz build_soong-8ee870a540764c8b8ca538fec4ddf18d056b6ec4.tar.bz2 build_soong-8ee870a540764c8b8ca538fec4ddf18d056b6ec4.zip |
Merge "Build native coverage variant of APEXes when needed" into qt-dev am: abc4f820a1
Change-Id: Id11c85eb9c5dea8a43486a70409ae370d1faa938
-rw-r--r-- | apex/apex.go | 32 | ||||
-rw-r--r-- | cc/binary.go | 4 | ||||
-rw-r--r-- | cc/cc.go | 8 | ||||
-rw-r--r-- | cc/coverage.go | 18 | ||||
-rw-r--r-- | cc/library.go | 4 | ||||
-rw-r--r-- | cc/object.go | 4 |
6 files changed, 66 insertions, 4 deletions
diff --git a/apex/apex.go b/apex/apex.go index beb1cfbf..81160a9c 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -267,6 +267,10 @@ type apexBundleProperties struct { // List of sanitizer names that this APEX is enabled for SanitizerNames []string `blueprint:"mutated"` + + PreventInstall bool `blueprint:"mutated"` + + HideFromMake bool `blueprint:"mutated"` } type apexTargetBundleProperties struct { @@ -560,7 +564,7 @@ func (a *apexBundle) Srcs() android.Paths { } func (a *apexBundle) installable() bool { - return a.properties.Installable == nil || proptools.Bool(a.properties.Installable) + return !a.properties.PreventInstall && (a.properties.Installable == nil || proptools.Bool(a.properties.Installable)) } func (a *apexBundle) getImageVariation(config android.DeviceConfig) string { @@ -595,6 +599,18 @@ func (a *apexBundle) IsSanitizerEnabled(ctx android.BaseModuleContext, sanitizer return android.InList(sanitizerName, globalSanitizerNames) } +func (a *apexBundle) IsNativeCoverageNeeded(ctx android.BaseContext) bool { + return ctx.Device() && ctx.DeviceConfig().NativeCoverageEnabled() +} + +func (a *apexBundle) PreventInstall() { + a.properties.PreventInstall = true +} + +func (a *apexBundle) HideFromMake() { + a.properties.HideFromMake = true +} + func getCopyManifestForNativeLibrary(cc *cc.Module, handleSpecialLibs bool) (fileToCopy android.Path, dirInApex string) { // Decide the APEX-local directory by the multilib of the library // In the future, we may query this to the module. @@ -1094,6 +1110,11 @@ func (a *apexBundle) buildFlattenedApex(ctx android.ModuleContext) { } func (a *apexBundle) AndroidMk() android.AndroidMkData { + if a.properties.HideFromMake { + return android.AndroidMkData{ + Disabled: true, + } + } writers := []android.AndroidMkData{} if a.apexTypes.image() { writers = append(writers, a.androidMkForType(imageApex)) @@ -1183,8 +1204,13 @@ func (a *apexBundle) androidMkForFiles(w io.Writer, name, moduleDir string, apex fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_java_prebuilt.mk") } else if fi.class == nativeSharedLib || fi.class == nativeExecutable { fmt.Fprintln(w, "LOCAL_MODULE_STEM :=", fi.builtFile.Base()) - if cc, ok := fi.module.(*cc.Module); ok && cc.UnstrippedOutputFile() != nil { - fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", cc.UnstrippedOutputFile().String()) + if cc, ok := fi.module.(*cc.Module); ok { + if cc.UnstrippedOutputFile() != nil { + fmt.Fprintln(w, "LOCAL_SOONG_UNSTRIPPED_BINARY :=", cc.UnstrippedOutputFile().String()) + } + if cc.CoverageOutputFile().Valid() { + fmt.Fprintln(w, "LOCAL_PREBUILT_COVERAGE_ARCHIVE :=", cc.CoverageOutputFile().String()) + } } fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_cc_prebuilt.mk") } else { diff --git a/cc/binary.go b/cc/binary.go index 1b749146..2a6ceb82 100644 --- a/cc/binary.go +++ b/cc/binary.go @@ -421,6 +421,10 @@ func (binary *binaryDecorator) nativeCoverage() bool { return true } +func (binary *binaryDecorator) coverageOutputFilePath() android.OptionalPath { + return binary.coverageOutputFile +} + // /system/bin/linker -> /apex/com.android.runtime/bin/linker func (binary *binaryDecorator) installSymlinkToRuntimeApex(ctx ModuleContext, file android.Path) { dir := binary.baseInstaller.installDir(ctx) @@ -314,6 +314,7 @@ type linker interface { unstrippedOutputFilePath() android.Path nativeCoverage() bool + coverageOutputFilePath() android.OptionalPath } type installer interface { @@ -423,6 +424,13 @@ func (c *Module) UnstrippedOutputFile() android.Path { return nil } +func (c *Module) CoverageOutputFile() android.OptionalPath { + if c.linker != nil { + return c.linker.coverageOutputFilePath() + } + return android.OptionalPath{} +} + func (c *Module) RelativeInstallPath() string { if c.installer != nil { return c.installer.relativeInstallPath() diff --git a/cc/coverage.go b/cc/coverage.go index 0de0c1c9..2e81a9e4 100644 --- a/cc/coverage.go +++ b/cc/coverage.go @@ -140,7 +140,6 @@ func (cov *coverage) begin(ctx BaseModuleContext) { } else { // Check if Native_coverage is set to false. This property defaults to true. needCoverageVariant = BoolDefault(cov.Properties.Native_coverage, true) - if sdk_version := ctx.sdkVersion(); ctx.useSdk() && sdk_version != "current" { // Native coverage is not supported for SDK versions < 23 if fromApi, err := strconv.Atoi(sdk_version); err == nil && fromApi < 23 { @@ -158,6 +157,14 @@ func (cov *coverage) begin(ctx BaseModuleContext) { cov.Properties.NeedCoverageVariant = needCoverageVariant } +// Coverage is an interface for non-CC modules to implement to be mutated for coverage +type Coverage interface { + android.Module + IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool + PreventInstall() + HideFromMake() +} + func coverageMutator(mctx android.BottomUpMutatorContext) { if c, ok := mctx.Module().(*Module); ok && c.coverage != nil { needCoverageVariant := c.coverage.Properties.NeedCoverageVariant @@ -177,5 +184,14 @@ func coverageMutator(mctx android.BottomUpMutatorContext) { m[1].(*Module).coverage.Properties.CoverageEnabled = needCoverageBuild m[1].(*Module).coverage.Properties.IsCoverageVariant = true } + } else if cov, ok := mctx.Module().(Coverage); ok && cov.IsNativeCoverageNeeded(mctx) { + // APEX modules fall here + + // Note: variant "" is also created because an APEX can be depended on by another + // module which are split into "" and "cov" variants. e.g. when cc_test refers + // to an APEX via 'data' property. + m := mctx.CreateVariations("", "cov") + m[0].(Coverage).PreventInstall() + m[0].(Coverage).HideFromMake() } } diff --git a/cc/library.go b/cc/library.go index 71d8170e..39f7a724 100644 --- a/cc/library.go +++ b/cc/library.go @@ -758,6 +758,10 @@ func (library *libraryDecorator) nativeCoverage() bool { return true } +func (library *libraryDecorator) coverageOutputFilePath() android.OptionalPath { + return library.coverageOutputFile +} + func getRefAbiDumpFile(ctx ModuleContext, vndkVersion, fileName string) android.Path { isLlndk := inList(ctx.baseModuleName(), llndkLibraries) || inList(ctx.baseModuleName(), ndkMigratedLibs) diff --git a/cc/object.go b/cc/object.go index 50ecc38e..2fefd301 100644 --- a/cc/object.go +++ b/cc/object.go @@ -118,3 +118,7 @@ func (object *objectLinker) unstrippedOutputFilePath() android.Path { func (object *objectLinker) nativeCoverage() bool { return true } + +func (object *objectLinker) coverageOutputFilePath() android.OptionalPath { + return android.OptionalPath{} +} |