Merge "Implement directed vendor snapshot"
This commit is contained in:
@@ -1266,6 +1266,95 @@ func TestVendorSnapshotCapture(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestVendorSnapshotDirected(t *testing.T) {
|
||||
bp := `
|
||||
cc_library_shared {
|
||||
name: "libvendor",
|
||||
vendor: true,
|
||||
nocrt: true,
|
||||
}
|
||||
|
||||
cc_library_shared {
|
||||
name: "libvendor_available",
|
||||
vendor_available: true,
|
||||
nocrt: true,
|
||||
}
|
||||
|
||||
genrule {
|
||||
name: "libfoo_gen",
|
||||
cmd: "",
|
||||
out: ["libfoo.so"],
|
||||
}
|
||||
|
||||
cc_prebuilt_library_shared {
|
||||
name: "libfoo",
|
||||
vendor: true,
|
||||
prefer: true,
|
||||
srcs: [":libfoo_gen"],
|
||||
}
|
||||
|
||||
cc_library_shared {
|
||||
name: "libfoo",
|
||||
vendor: true,
|
||||
nocrt: true,
|
||||
}
|
||||
`
|
||||
config := TestConfig(buildDir, android.Android, nil, bp, nil)
|
||||
config.TestProductVariables.DeviceVndkVersion = StringPtr("current")
|
||||
config.TestProductVariables.Platform_vndk_version = StringPtr("VER")
|
||||
config.TestProductVariables.DirectedVendorSnapshot = true
|
||||
config.TestProductVariables.VendorSnapshotModules = make(map[string]bool)
|
||||
config.TestProductVariables.VendorSnapshotModules["libvendor"] = true
|
||||
config.TestProductVariables.VendorSnapshotModules["libfoo"] = true
|
||||
ctx := testCcWithConfig(t, config)
|
||||
|
||||
// Check Vendor snapshot output.
|
||||
|
||||
snapshotDir := "vendor-snapshot"
|
||||
snapshotVariantPath := filepath.Join(buildDir, snapshotDir, "arm64")
|
||||
snapshotSingleton := ctx.SingletonForTests("vendor-snapshot")
|
||||
|
||||
var includeJsonFiles []string
|
||||
var excludeJsonFiles []string
|
||||
|
||||
for _, arch := range [][]string{
|
||||
[]string{"arm64", "armv8-a"},
|
||||
[]string{"arm", "armv7-a-neon"},
|
||||
} {
|
||||
archType := arch[0]
|
||||
archVariant := arch[1]
|
||||
archDir := fmt.Sprintf("arch-%s-%s", archType, archVariant)
|
||||
|
||||
sharedVariant := fmt.Sprintf("android_vendor.VER_%s_%s_shared", archType, archVariant)
|
||||
sharedDir := filepath.Join(snapshotVariantPath, archDir, "shared")
|
||||
|
||||
// Included modules
|
||||
checkSnapshot(t, ctx, snapshotSingleton, "libvendor", "libvendor.so", sharedDir, sharedVariant)
|
||||
includeJsonFiles = append(includeJsonFiles, filepath.Join(sharedDir, "libvendor.so.json"))
|
||||
// Check that snapshot captures "prefer: true" prebuilt
|
||||
checkSnapshot(t, ctx, snapshotSingleton, "prebuilt_libfoo", "libfoo.so", sharedDir, sharedVariant)
|
||||
includeJsonFiles = append(includeJsonFiles, filepath.Join(sharedDir, "libfoo.so.json"))
|
||||
|
||||
// Excluded modules
|
||||
checkSnapshotExclude(t, ctx, snapshotSingleton, "libvendor_available", "libvendor_available.so", sharedDir, sharedVariant)
|
||||
excludeJsonFiles = append(excludeJsonFiles, filepath.Join(sharedDir, "libvendor_available.so.json"))
|
||||
}
|
||||
|
||||
// Verify that each json file for an included module has a rule.
|
||||
for _, jsonFile := range includeJsonFiles {
|
||||
if snapshotSingleton.MaybeOutput(jsonFile).Rule == nil {
|
||||
t.Errorf("include json file %q not found", jsonFile)
|
||||
}
|
||||
}
|
||||
|
||||
// Verify that each json file for an excluded module has no rule.
|
||||
for _, jsonFile := range excludeJsonFiles {
|
||||
if snapshotSingleton.MaybeOutput(jsonFile).Rule != nil {
|
||||
t.Errorf("exclude json file %q found", jsonFile)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func TestVendorSnapshotUse(t *testing.T) {
|
||||
frameworkBp := `
|
||||
cc_library {
|
||||
|
@@ -82,6 +82,11 @@ type snapshotImage interface {
|
||||
|
||||
// Whether to skip the source mutator for a given module.
|
||||
skipSourceMutator(ctx android.BottomUpMutatorContext) bool
|
||||
|
||||
// Whether to exclude a given module from the directed snapshot or not.
|
||||
// If the makefile variable DIRECTED_{IMAGE}_SNAPSHOT is true, directed snapshot is turned on,
|
||||
// and only modules listed in {IMAGE}_SNAPSHOT_MODULES will be captured.
|
||||
excludeFromDirectedSnapshot(cfg android.DeviceConfig, name string) bool
|
||||
}
|
||||
|
||||
type vendorSnapshotImage struct{}
|
||||
@@ -193,6 +198,16 @@ func (vendorSnapshotImage) skipSourceMutator(ctx android.BottomUpMutatorContext)
|
||||
return false
|
||||
}
|
||||
|
||||
// returns true iff a given module SHOULD BE EXCLUDED, false if included
|
||||
func (vendorSnapshotImage) excludeFromDirectedSnapshot(cfg android.DeviceConfig, name string) bool {
|
||||
// If we're using full snapshot, not directed snapshot, capture every module
|
||||
if !cfg.DirectedVendorSnapshot() {
|
||||
return false
|
||||
}
|
||||
// Else, checks if name is in VENDOR_SNAPSHOT_MODULES.
|
||||
return !cfg.VendorSnapshotModules()[name]
|
||||
}
|
||||
|
||||
func (recoverySnapshotImage) init() {
|
||||
android.RegisterSingletonType("recovery-snapshot", RecoverySnapshotSingleton)
|
||||
android.RegisterModuleType("recovery_snapshot_shared", RecoverySnapshotSharedFactory)
|
||||
@@ -275,6 +290,11 @@ func (recoverySnapshotImage) skipSourceMutator(ctx android.BottomUpMutatorContex
|
||||
return !ok || !module.InRecovery()
|
||||
}
|
||||
|
||||
func (recoverySnapshotImage) excludeFromDirectedSnapshot(cfg android.DeviceConfig, name string) bool {
|
||||
// directed recovery snapshot is not implemented yet
|
||||
return false
|
||||
}
|
||||
|
||||
var vendorSnapshotImageSingleton vendorSnapshotImage
|
||||
var recoverySnapshotImageSingleton recoverySnapshotImage
|
||||
|
||||
|
@@ -80,7 +80,7 @@ func shouldCollectHeadersForSnapshot(ctx android.ModuleContext, m *Module, apexI
|
||||
}
|
||||
|
||||
for _, image := range []snapshotImage{vendorSnapshotImageSingleton, recoverySnapshotImageSingleton} {
|
||||
if isSnapshotAware(m, image.isProprietaryPath(ctx.ModuleDir()), apexInfo, image) {
|
||||
if isSnapshotAware(ctx.DeviceConfig(), m, image.isProprietaryPath(ctx.ModuleDir()), apexInfo, image) {
|
||||
return true
|
||||
}
|
||||
}
|
||||
|
@@ -198,7 +198,7 @@ func isRecoveryProprietaryModule(ctx android.BaseModuleContext) bool {
|
||||
}
|
||||
|
||||
// Determines if the module is a candidate for snapshot.
|
||||
func isSnapshotAware(m *Module, inProprietaryPath bool, apexInfo android.ApexInfo, image snapshotImage) bool {
|
||||
func isSnapshotAware(cfg android.DeviceConfig, m *Module, inProprietaryPath bool, apexInfo android.ApexInfo, image snapshotImage) bool {
|
||||
if !m.Enabled() || m.Properties.HideFromMake {
|
||||
return false
|
||||
}
|
||||
@@ -241,6 +241,10 @@ func isSnapshotAware(m *Module, inProprietaryPath bool, apexInfo android.ApexInf
|
||||
if _, ok := m.linker.(*llndkHeadersDecorator); ok {
|
||||
return false
|
||||
}
|
||||
// If we are using directed snapshot AND we have to exclude this module, skip this
|
||||
if image.excludeFromDirectedSnapshot(cfg, m.BaseModuleName()) {
|
||||
return false
|
||||
}
|
||||
|
||||
// Libraries
|
||||
if l, ok := m.linker.(snapshotLibraryInterface); ok {
|
||||
@@ -535,7 +539,7 @@ func (c *snapshotSingleton) GenerateBuildActions(ctx android.SingletonContext) {
|
||||
}
|
||||
}
|
||||
|
||||
if !isSnapshotAware(m, inProprietaryPath, apexInfo, c.image) {
|
||||
if !isSnapshotAware(ctx.DeviceConfig(), m, inProprietaryPath, apexInfo, c.image) {
|
||||
return
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user