|
|
|
@@ -246,7 +246,7 @@ func SetCoverageProperties(ctx android.BaseModuleContext, properties CoveragePro
|
|
|
|
|
|
|
|
|
|
type UseCoverage interface {
|
|
|
|
|
android.Module
|
|
|
|
|
IsNativeCoverageNeeded(ctx android.BaseModuleContext) bool
|
|
|
|
|
IsNativeCoverageNeeded(ctx android.IncomingTransitionContext) bool
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Coverage is an interface for non-CC modules to implement to be mutated for coverage
|
|
|
|
@@ -258,43 +258,86 @@ type Coverage interface {
|
|
|
|
|
EnableCoverageIfNeeded()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func coverageMutator(mctx android.BottomUpMutatorContext) {
|
|
|
|
|
if c, ok := mctx.Module().(*Module); ok && c.coverage != nil {
|
|
|
|
|
needCoverageVariant := c.coverage.Properties.NeedCoverageVariant
|
|
|
|
|
needCoverageBuild := c.coverage.Properties.NeedCoverageBuild
|
|
|
|
|
if needCoverageVariant {
|
|
|
|
|
m := mctx.CreateVariations("", "cov")
|
|
|
|
|
type coverageTransitionMutator struct{}
|
|
|
|
|
|
|
|
|
|
// Setup the non-coverage version and set HideFromMake and
|
|
|
|
|
// PreventInstall to true.
|
|
|
|
|
m[0].(*Module).coverage.Properties.CoverageEnabled = false
|
|
|
|
|
m[0].(*Module).coverage.Properties.IsCoverageVariant = false
|
|
|
|
|
m[0].(*Module).Properties.HideFromMake = true
|
|
|
|
|
m[0].(*Module).Properties.PreventInstall = true
|
|
|
|
|
var _ android.TransitionMutator = (*coverageTransitionMutator)(nil)
|
|
|
|
|
|
|
|
|
|
// The coverage-enabled version inherits HideFromMake,
|
|
|
|
|
// PreventInstall from the original module.
|
|
|
|
|
m[1].(*Module).coverage.Properties.CoverageEnabled = needCoverageBuild
|
|
|
|
|
m[1].(*Module).coverage.Properties.IsCoverageVariant = true
|
|
|
|
|
func (c coverageTransitionMutator) Split(ctx android.BaseModuleContext) []string {
|
|
|
|
|
if c, ok := ctx.Module().(*Module); ok && c.coverage != nil {
|
|
|
|
|
if c.coverage.Properties.NeedCoverageVariant {
|
|
|
|
|
return []string{"", "cov"}
|
|
|
|
|
}
|
|
|
|
|
} else if cov, ok := mctx.Module().(Coverage); ok && cov.IsNativeCoverageNeeded(mctx) {
|
|
|
|
|
} else if cov, ok := ctx.Module().(Coverage); ok && cov.IsNativeCoverageNeeded(ctx) {
|
|
|
|
|
// APEX and Rust 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).MarkAsCoverageVariant(false)
|
|
|
|
|
m[0].(Coverage).SetPreventInstall()
|
|
|
|
|
m[0].(Coverage).HideFromMake()
|
|
|
|
|
|
|
|
|
|
m[1].(Coverage).MarkAsCoverageVariant(true)
|
|
|
|
|
m[1].(Coverage).EnableCoverageIfNeeded()
|
|
|
|
|
} else if cov, ok := mctx.Module().(UseCoverage); ok && cov.IsNativeCoverageNeeded(mctx) {
|
|
|
|
|
return []string{"", "cov"}
|
|
|
|
|
} else if cov, ok := ctx.Module().(UseCoverage); ok && cov.IsNativeCoverageNeeded(ctx) {
|
|
|
|
|
// Module itself doesn't have to have "cov" variant, but it should use "cov" variants of
|
|
|
|
|
// deps.
|
|
|
|
|
return []string{"cov"}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return []string{""}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c coverageTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string {
|
|
|
|
|
return sourceVariation
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c coverageTransitionMutator) IncomingTransition(ctx android.IncomingTransitionContext, incomingVariation string) string {
|
|
|
|
|
if c, ok := ctx.Module().(*Module); ok && c.coverage != nil {
|
|
|
|
|
if !c.coverage.Properties.NeedCoverageVariant {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
} else if cov, ok := ctx.Module().(Coverage); ok {
|
|
|
|
|
if !cov.IsNativeCoverageNeeded(ctx) {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
} else if cov, ok := ctx.Module().(UseCoverage); ok && cov.IsNativeCoverageNeeded(ctx) {
|
|
|
|
|
// Module only has a "cov" variation, so all incoming variations should use "cov".
|
|
|
|
|
return "cov"
|
|
|
|
|
} else {
|
|
|
|
|
return ""
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return incomingVariation
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (c coverageTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, variation string) {
|
|
|
|
|
if c, ok := ctx.Module().(*Module); ok && c.coverage != nil {
|
|
|
|
|
if variation == "" && c.coverage.Properties.NeedCoverageVariant {
|
|
|
|
|
// Setup the non-coverage version and set HideFromMake and
|
|
|
|
|
// PreventInstall to true.
|
|
|
|
|
c.coverage.Properties.CoverageEnabled = false
|
|
|
|
|
c.coverage.Properties.IsCoverageVariant = false
|
|
|
|
|
c.Properties.HideFromMake = true
|
|
|
|
|
c.Properties.PreventInstall = true
|
|
|
|
|
} else if variation == "cov" {
|
|
|
|
|
// The coverage-enabled version inherits HideFromMake,
|
|
|
|
|
// PreventInstall from the original module.
|
|
|
|
|
c.coverage.Properties.CoverageEnabled = c.coverage.Properties.NeedCoverageBuild
|
|
|
|
|
c.coverage.Properties.IsCoverageVariant = true
|
|
|
|
|
}
|
|
|
|
|
} else if cov, ok := ctx.Module().(Coverage); ok && cov.IsNativeCoverageNeeded(ctx) {
|
|
|
|
|
// APEX and Rust 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.
|
|
|
|
|
if variation == "" {
|
|
|
|
|
cov.MarkAsCoverageVariant(false)
|
|
|
|
|
cov.SetPreventInstall()
|
|
|
|
|
cov.HideFromMake()
|
|
|
|
|
} else if variation == "cov" {
|
|
|
|
|
cov.MarkAsCoverageVariant(true)
|
|
|
|
|
cov.EnableCoverageIfNeeded()
|
|
|
|
|
}
|
|
|
|
|
} else if cov, ok := ctx.Module().(UseCoverage); ok && cov.IsNativeCoverageNeeded(ctx) {
|
|
|
|
|
// Module itself doesn't have to have "cov" variant, but it should use "cov" variants of
|
|
|
|
|
// deps.
|
|
|
|
|
mctx.CreateVariations("cov")
|
|
|
|
|
mctx.AliasVariation("cov")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|