Loading cc/androidmk.go +3 −3 Original line number Diff line number Diff line Loading @@ -505,7 +505,7 @@ func (c *vndkPrebuiltLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, en }) } func (c *vendorSnapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { func (c *snapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { // Each vendor snapshot is exported to androidMk only when BOARD_VNDK_VERSION != current // and the version of the prebuilt is same as BOARD_VNDK_VERSION. if c.shared() { Loading Loading @@ -549,7 +549,7 @@ func (c *vendorSnapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, }) } func (c *vendorSnapshotBinaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { func (c *snapshotBinaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { entries.Class = "EXECUTABLES" if c.androidMkVendorSuffix { Loading @@ -563,7 +563,7 @@ func (c *vendorSnapshotBinaryDecorator) AndroidMkEntries(ctx AndroidMkContext, e }) } func (c *vendorSnapshotObjectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { func (c *snapshotObjectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { entries.Class = "STATIC_LIBRARIES" if c.androidMkVendorSuffix { Loading cc/cc.go +9 −4 Original line number Diff line number Diff line Loading @@ -305,10 +305,11 @@ type BaseProperties struct { // Normally Soong uses the directory structure to decide which modules // should be included (framework) or excluded (non-framework) from the // vendor snapshot, but this property allows a partner to exclude a // module normally thought of as a framework module from the vendor // snapshot. // different snapshots (vendor, recovery, etc.), but these properties // allow a partner to exclude a module normally thought of as a // framework module from a snapshot. Exclude_from_vendor_snapshot *bool Exclude_from_recovery_snapshot *bool } type VendorProperties struct { Loading Loading @@ -1051,6 +1052,10 @@ func (c *Module) ExcludeFromVendorSnapshot() bool { return Bool(c.Properties.Exclude_from_vendor_snapshot) } func (c *Module) ExcludeFromRecoverySnapshot() bool { return Bool(c.Properties.Exclude_from_recovery_snapshot) } func isBionic(name string) bool { switch name { case "libc", "libm", "libdl", "libdl_android", "linker": Loading cc/cc_test.go +128 −0 Original line number Diff line number Diff line Loading @@ -1551,6 +1551,8 @@ func TestVendorSnapshotExcludeInVendorProprietaryPathErrors(t *testing.T) { android.CheckErrorsAgainstExpectations(t, errs, []string{ `module "libvendor\{.+,image:vendor.+,arch:arm64_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`, `module "libvendor\{.+,image:vendor.+,arch:arm_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`, `module "libvendor\{.+,image:vendor.+,arch:arm64_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`, `module "libvendor\{.+,image:vendor.+,arch:arm_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`, }) } Loading Loading @@ -1597,6 +1599,132 @@ func TestVendorSnapshotExcludeWithVendorAvailable(t *testing.T) { }) } func TestRecoverySnapshotCapture(t *testing.T) { bp := ` cc_library { name: "libvndk", vendor_available: true, recovery_available: true, product_available: true, vndk: { enabled: true, }, nocrt: true, } cc_library { name: "librecovery", recovery: true, nocrt: true, } cc_library { name: "librecovery_available", recovery_available: true, nocrt: true, } cc_library_headers { name: "librecovery_headers", recovery_available: true, nocrt: true, } cc_binary { name: "recovery_bin", recovery: true, nocrt: true, } cc_binary { name: "recovery_available_bin", recovery_available: true, nocrt: true, } toolchain_library { name: "libb", recovery_available: true, src: "libb.a", } cc_object { name: "obj", recovery_available: true, } ` config := TestConfig(buildDir, android.Android, nil, bp, nil) config.TestProductVariables.DeviceVndkVersion = StringPtr("current") config.TestProductVariables.Platform_vndk_version = StringPtr("VER") ctx := testCcWithConfig(t, config) // Check Recovery snapshot output. snapshotDir := "recovery-snapshot" snapshotVariantPath := filepath.Join(buildDir, snapshotDir, "arm64") snapshotSingleton := ctx.SingletonForTests("recovery-snapshot") var jsonFiles []string for _, arch := range [][]string{ []string{"arm64", "armv8-a"}, } { archType := arch[0] archVariant := arch[1] archDir := fmt.Sprintf("arch-%s-%s", archType, archVariant) // For shared libraries, only recovery_available modules are captured. sharedVariant := fmt.Sprintf("android_recovery_%s_%s_shared", archType, archVariant) sharedDir := filepath.Join(snapshotVariantPath, archDir, "shared") checkSnapshot(t, ctx, snapshotSingleton, "libvndk", "libvndk.so", sharedDir, sharedVariant) checkSnapshot(t, ctx, snapshotSingleton, "librecovery", "librecovery.so", sharedDir, sharedVariant) checkSnapshot(t, ctx, snapshotSingleton, "librecovery_available", "librecovery_available.so", sharedDir, sharedVariant) jsonFiles = append(jsonFiles, filepath.Join(sharedDir, "libvndk.so.json"), filepath.Join(sharedDir, "librecovery.so.json"), filepath.Join(sharedDir, "librecovery_available.so.json")) // For static libraries, all recovery:true and recovery_available modules are captured. staticVariant := fmt.Sprintf("android_recovery_%s_%s_static", archType, archVariant) staticDir := filepath.Join(snapshotVariantPath, archDir, "static") checkSnapshot(t, ctx, snapshotSingleton, "libb", "libb.a", staticDir, staticVariant) checkSnapshot(t, ctx, snapshotSingleton, "librecovery", "librecovery.a", staticDir, staticVariant) checkSnapshot(t, ctx, snapshotSingleton, "librecovery_available", "librecovery_available.a", staticDir, staticVariant) jsonFiles = append(jsonFiles, filepath.Join(staticDir, "libb.a.json"), filepath.Join(staticDir, "librecovery.a.json"), filepath.Join(staticDir, "librecovery_available.a.json")) // For binary executables, all recovery:true and recovery_available modules are captured. if archType == "arm64" { binaryVariant := fmt.Sprintf("android_recovery_%s_%s", archType, archVariant) binaryDir := filepath.Join(snapshotVariantPath, archDir, "binary") checkSnapshot(t, ctx, snapshotSingleton, "recovery_bin", "recovery_bin", binaryDir, binaryVariant) checkSnapshot(t, ctx, snapshotSingleton, "recovery_available_bin", "recovery_available_bin", binaryDir, binaryVariant) jsonFiles = append(jsonFiles, filepath.Join(binaryDir, "recovery_bin.json"), filepath.Join(binaryDir, "recovery_available_bin.json")) } // For header libraries, all vendor:true and vendor_available modules are captured. headerDir := filepath.Join(snapshotVariantPath, archDir, "header") jsonFiles = append(jsonFiles, filepath.Join(headerDir, "librecovery_headers.json")) // For object modules, all vendor:true and vendor_available modules are captured. objectVariant := fmt.Sprintf("android_recovery_%s_%s", archType, archVariant) objectDir := filepath.Join(snapshotVariantPath, archDir, "object") checkSnapshot(t, ctx, snapshotSingleton, "obj", "obj.o", objectDir, objectVariant) jsonFiles = append(jsonFiles, filepath.Join(objectDir, "obj.o.json")) } for _, jsonFile := range jsonFiles { // verify all json files exist if snapshotSingleton.MaybeOutput(jsonFile).Rule == nil { t.Errorf("%q expected but not found", jsonFile) } } } func TestDoubleLoadableDepError(t *testing.T) { // Check whether an error is emitted when a LLNDK depends on a non-double_loadable VNDK lib. testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", ` Loading cc/sanitize.go +1 −1 Original line number Diff line number Diff line Loading @@ -847,7 +847,7 @@ func sanitizerRuntimeDepsMutator(mctx android.TopDownMutatorContext) { return true } if p, ok := d.linker.(*vendorSnapshotLibraryDecorator); ok { if p, ok := d.linker.(*snapshotLibraryDecorator); ok { if Bool(p.properties.Sanitize_minimal_dep) { c.sanitize.Properties.MinimalRuntimeDep = true } Loading cc/snapshot_utils.go +2 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,8 @@ func (s *snapshotMap) get(name string, arch android.ArchType) (snapshot string, func isSnapshotAware(ctx android.ModuleContext, m *Module, apexInfo android.ApexInfo) bool { if _, _, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m, apexInfo); ok { return ctx.Config().VndkSnapshotBuildArtifacts() } else if isVendorSnapshotModule(m, isVendorProprietaryPath(ctx.ModuleDir()), apexInfo) { } else if isVendorSnapshotModule(m, isVendorProprietaryPath(ctx.ModuleDir()), apexInfo) || isRecoverySnapshotModule(m, isVendorProprietaryPath(ctx.ModuleDir()), apexInfo) { return true } return false Loading Loading
cc/androidmk.go +3 −3 Original line number Diff line number Diff line Loading @@ -505,7 +505,7 @@ func (c *vndkPrebuiltLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, en }) } func (c *vendorSnapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { func (c *snapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { // Each vendor snapshot is exported to androidMk only when BOARD_VNDK_VERSION != current // and the version of the prebuilt is same as BOARD_VNDK_VERSION. if c.shared() { Loading Loading @@ -549,7 +549,7 @@ func (c *vendorSnapshotLibraryDecorator) AndroidMkEntries(ctx AndroidMkContext, }) } func (c *vendorSnapshotBinaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { func (c *snapshotBinaryDecorator) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { entries.Class = "EXECUTABLES" if c.androidMkVendorSuffix { Loading @@ -563,7 +563,7 @@ func (c *vendorSnapshotBinaryDecorator) AndroidMkEntries(ctx AndroidMkContext, e }) } func (c *vendorSnapshotObjectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { func (c *snapshotObjectLinker) AndroidMkEntries(ctx AndroidMkContext, entries *android.AndroidMkEntries) { entries.Class = "STATIC_LIBRARIES" if c.androidMkVendorSuffix { Loading
cc/cc.go +9 −4 Original line number Diff line number Diff line Loading @@ -305,10 +305,11 @@ type BaseProperties struct { // Normally Soong uses the directory structure to decide which modules // should be included (framework) or excluded (non-framework) from the // vendor snapshot, but this property allows a partner to exclude a // module normally thought of as a framework module from the vendor // snapshot. // different snapshots (vendor, recovery, etc.), but these properties // allow a partner to exclude a module normally thought of as a // framework module from a snapshot. Exclude_from_vendor_snapshot *bool Exclude_from_recovery_snapshot *bool } type VendorProperties struct { Loading Loading @@ -1051,6 +1052,10 @@ func (c *Module) ExcludeFromVendorSnapshot() bool { return Bool(c.Properties.Exclude_from_vendor_snapshot) } func (c *Module) ExcludeFromRecoverySnapshot() bool { return Bool(c.Properties.Exclude_from_recovery_snapshot) } func isBionic(name string) bool { switch name { case "libc", "libm", "libdl", "libdl_android", "linker": Loading
cc/cc_test.go +128 −0 Original line number Diff line number Diff line Loading @@ -1551,6 +1551,8 @@ func TestVendorSnapshotExcludeInVendorProprietaryPathErrors(t *testing.T) { android.CheckErrorsAgainstExpectations(t, errs, []string{ `module "libvendor\{.+,image:vendor.+,arch:arm64_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`, `module "libvendor\{.+,image:vendor.+,arch:arm_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`, `module "libvendor\{.+,image:vendor.+,arch:arm64_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`, `module "libvendor\{.+,image:vendor.+,arch:arm_.+\}" in vendor proprietary path "device" may not use "exclude_from_vendor_snapshot: true"`, }) } Loading Loading @@ -1597,6 +1599,132 @@ func TestVendorSnapshotExcludeWithVendorAvailable(t *testing.T) { }) } func TestRecoverySnapshotCapture(t *testing.T) { bp := ` cc_library { name: "libvndk", vendor_available: true, recovery_available: true, product_available: true, vndk: { enabled: true, }, nocrt: true, } cc_library { name: "librecovery", recovery: true, nocrt: true, } cc_library { name: "librecovery_available", recovery_available: true, nocrt: true, } cc_library_headers { name: "librecovery_headers", recovery_available: true, nocrt: true, } cc_binary { name: "recovery_bin", recovery: true, nocrt: true, } cc_binary { name: "recovery_available_bin", recovery_available: true, nocrt: true, } toolchain_library { name: "libb", recovery_available: true, src: "libb.a", } cc_object { name: "obj", recovery_available: true, } ` config := TestConfig(buildDir, android.Android, nil, bp, nil) config.TestProductVariables.DeviceVndkVersion = StringPtr("current") config.TestProductVariables.Platform_vndk_version = StringPtr("VER") ctx := testCcWithConfig(t, config) // Check Recovery snapshot output. snapshotDir := "recovery-snapshot" snapshotVariantPath := filepath.Join(buildDir, snapshotDir, "arm64") snapshotSingleton := ctx.SingletonForTests("recovery-snapshot") var jsonFiles []string for _, arch := range [][]string{ []string{"arm64", "armv8-a"}, } { archType := arch[0] archVariant := arch[1] archDir := fmt.Sprintf("arch-%s-%s", archType, archVariant) // For shared libraries, only recovery_available modules are captured. sharedVariant := fmt.Sprintf("android_recovery_%s_%s_shared", archType, archVariant) sharedDir := filepath.Join(snapshotVariantPath, archDir, "shared") checkSnapshot(t, ctx, snapshotSingleton, "libvndk", "libvndk.so", sharedDir, sharedVariant) checkSnapshot(t, ctx, snapshotSingleton, "librecovery", "librecovery.so", sharedDir, sharedVariant) checkSnapshot(t, ctx, snapshotSingleton, "librecovery_available", "librecovery_available.so", sharedDir, sharedVariant) jsonFiles = append(jsonFiles, filepath.Join(sharedDir, "libvndk.so.json"), filepath.Join(sharedDir, "librecovery.so.json"), filepath.Join(sharedDir, "librecovery_available.so.json")) // For static libraries, all recovery:true and recovery_available modules are captured. staticVariant := fmt.Sprintf("android_recovery_%s_%s_static", archType, archVariant) staticDir := filepath.Join(snapshotVariantPath, archDir, "static") checkSnapshot(t, ctx, snapshotSingleton, "libb", "libb.a", staticDir, staticVariant) checkSnapshot(t, ctx, snapshotSingleton, "librecovery", "librecovery.a", staticDir, staticVariant) checkSnapshot(t, ctx, snapshotSingleton, "librecovery_available", "librecovery_available.a", staticDir, staticVariant) jsonFiles = append(jsonFiles, filepath.Join(staticDir, "libb.a.json"), filepath.Join(staticDir, "librecovery.a.json"), filepath.Join(staticDir, "librecovery_available.a.json")) // For binary executables, all recovery:true and recovery_available modules are captured. if archType == "arm64" { binaryVariant := fmt.Sprintf("android_recovery_%s_%s", archType, archVariant) binaryDir := filepath.Join(snapshotVariantPath, archDir, "binary") checkSnapshot(t, ctx, snapshotSingleton, "recovery_bin", "recovery_bin", binaryDir, binaryVariant) checkSnapshot(t, ctx, snapshotSingleton, "recovery_available_bin", "recovery_available_bin", binaryDir, binaryVariant) jsonFiles = append(jsonFiles, filepath.Join(binaryDir, "recovery_bin.json"), filepath.Join(binaryDir, "recovery_available_bin.json")) } // For header libraries, all vendor:true and vendor_available modules are captured. headerDir := filepath.Join(snapshotVariantPath, archDir, "header") jsonFiles = append(jsonFiles, filepath.Join(headerDir, "librecovery_headers.json")) // For object modules, all vendor:true and vendor_available modules are captured. objectVariant := fmt.Sprintf("android_recovery_%s_%s", archType, archVariant) objectDir := filepath.Join(snapshotVariantPath, archDir, "object") checkSnapshot(t, ctx, snapshotSingleton, "obj", "obj.o", objectDir, objectVariant) jsonFiles = append(jsonFiles, filepath.Join(objectDir, "obj.o.json")) } for _, jsonFile := range jsonFiles { // verify all json files exist if snapshotSingleton.MaybeOutput(jsonFile).Rule == nil { t.Errorf("%q expected but not found", jsonFile) } } } func TestDoubleLoadableDepError(t *testing.T) { // Check whether an error is emitted when a LLNDK depends on a non-double_loadable VNDK lib. testCcError(t, "module \".*\" variant \".*\": link.* \".*\" which is not LL-NDK, VNDK-SP, .*double_loadable", ` Loading
cc/sanitize.go +1 −1 Original line number Diff line number Diff line Loading @@ -847,7 +847,7 @@ func sanitizerRuntimeDepsMutator(mctx android.TopDownMutatorContext) { return true } if p, ok := d.linker.(*vendorSnapshotLibraryDecorator); ok { if p, ok := d.linker.(*snapshotLibraryDecorator); ok { if Bool(p.properties.Sanitize_minimal_dep) { c.sanitize.Properties.MinimalRuntimeDep = true } Loading
cc/snapshot_utils.go +2 −1 Original line number Diff line number Diff line Loading @@ -60,7 +60,8 @@ func (s *snapshotMap) get(name string, arch android.ArchType) (snapshot string, func isSnapshotAware(ctx android.ModuleContext, m *Module, apexInfo android.ApexInfo) bool { if _, _, ok := isVndkSnapshotLibrary(ctx.DeviceConfig(), m, apexInfo); ok { return ctx.Config().VndkSnapshotBuildArtifacts() } else if isVendorSnapshotModule(m, isVendorProprietaryPath(ctx.ModuleDir()), apexInfo) { } else if isVendorSnapshotModule(m, isVendorProprietaryPath(ctx.ModuleDir()), apexInfo) || isRecoverySnapshotModule(m, isVendorProprietaryPath(ctx.ModuleDir()), apexInfo) { return true } return false Loading