android_filesystem_defaults and visibility rule

android_systemimage_defaults is deleted and android_filesystem_defaults
is created so that we can have defaults not only for
android_system_image, but also all android_filesystem modules and its
derivatives.

Also, change adds a check which ensures that the partition_type of the
filesystem and its defaults are the same.

Bug: 330665150
Test: m
Change-Id: If635c794534ed89d264eaf7dfc406a8245b8e9f0
This commit is contained in:
Jiyong Park 2024-04-05 18:13:33 +09:00
parent fe66e13714
commit f46b1af969
3 changed files with 83 additions and 21 deletions

View file

@ -35,8 +35,8 @@ func init() {
func registerBuildComponents(ctx android.RegistrationContext) {
ctx.RegisterModuleType("android_filesystem", filesystemFactory)
ctx.RegisterModuleType("android_filesystem_defaults", filesystemDefaultsFactory)
ctx.RegisterModuleType("android_system_image", systemImageFactory)
ctx.RegisterModuleType("android_system_image_defaults", systemImageDefaultsFactory)
ctx.RegisterModuleType("avb_add_hash_footer", avbAddHashFooterFactory)
ctx.RegisterModuleType("avb_add_hash_footer_defaults", avbAddHashFooterDefaultsFactory)
ctx.RegisterModuleType("avb_gen_vbmeta_image", avbGenVbmetaImageFactory)
@ -46,6 +46,7 @@ func registerBuildComponents(ctx android.RegistrationContext) {
type filesystem struct {
android.ModuleBase
android.PackagingBase
android.DefaultableModuleBase
properties filesystemProperties
@ -140,6 +141,7 @@ func initFilesystemModule(module *filesystem) {
module.AddProperties(&module.properties)
android.InitPackageModule(module)
android.InitAndroidMultiTargetsArchModule(module, android.DeviceSupported, android.MultilibCommon)
android.InitDefaultableModule(module)
}
var dependencyTag = struct {
@ -186,9 +188,7 @@ func (f *filesystem) partitionName() string {
var pctx = android.NewPackageContext("android/soong/filesystem")
func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) {
if !android.InList(f.PartitionType(), validPartitions) {
ctx.PropertyErrorf("partition_type", "partition_type must be one of %s, found: %s", validPartitions, f.PartitionType())
}
validatePartitionType(ctx, f)
switch f.fsType(ctx) {
case ext4Type:
f.output = f.buildImageUsingBuildImage(ctx)
@ -204,6 +204,22 @@ func (f *filesystem) GenerateAndroidBuildActions(ctx android.ModuleContext) {
ctx.InstallFile(f.installDir, f.installFileName(), f.output)
}
func validatePartitionType(ctx android.ModuleContext, p partition) {
if !android.InList(p.PartitionType(), validPartitions) {
ctx.PropertyErrorf("partition_type", "partition_type must be one of %s, found: %s", validPartitions, p.PartitionType())
}
ctx.VisitDirectDepsWithTag(android.DefaultsDepTag, func(m android.Module) {
if fdm, ok := m.(*filesystemDefaults); ok {
if p.PartitionType() != fdm.PartitionType() {
ctx.PropertyErrorf("partition_type",
"%s doesn't match with the partition type %s of the filesystem default module %s",
p.PartitionType(), fdm.PartitionType(), m.Name())
}
}
})
}
// Copy extra files/dirs that are not from the `deps` property to `rootDir`, checking for conflicts with files
// already in `rootDir`.
func (f *filesystem) buildNonDepsFiles(ctx android.ModuleContext, builder *android.RuleBuilder, rootDir android.OutputPath) {
@ -458,10 +474,16 @@ func (f *filesystem) addMakeBuiltFiles(ctx android.ModuleContext, builder *andro
Text(android.PathForArbitraryOutput(ctx, stagingDir).String())
}
type partition interface {
PartitionType() string
}
func (f *filesystem) PartitionType() string {
return proptools.StringDefault(f.properties.Partition_type, "system")
}
var _ partition = (*filesystem)(nil)
var _ android.AndroidMkEntriesProvider = (*filesystem)(nil)
// Implements android.AndroidMkEntriesProvider
@ -535,3 +557,37 @@ var _ cc.UseCoverage = (*filesystem)(nil)
func (*filesystem) IsNativeCoverageNeeded(ctx android.IncomingTransitionContext) bool {
return ctx.Device() && ctx.DeviceConfig().NativeCoverageEnabled()
}
// android_filesystem_defaults
type filesystemDefaults struct {
android.ModuleBase
android.DefaultsModuleBase
properties filesystemDefaultsProperties
}
type filesystemDefaultsProperties struct {
// Identifies which partition this is for //visibility:any_system_image (and others) visibility
// checks, and will be used in the future for API surface checks.
Partition_type *string
}
// android_filesystem_defaults is a default module for android_filesystem and android_system_image
func filesystemDefaultsFactory() android.Module {
module := &filesystemDefaults{}
module.AddProperties(&module.properties)
module.AddProperties(&android.PackagingProperties{})
android.InitDefaultsModule(module)
return module
}
func (f *filesystemDefaults) PartitionType() string {
return proptools.StringDefault(f.properties.Partition_type, "system")
}
var _ partition = (*filesystemDefaults)(nil)
func (f *filesystemDefaults) GenerateAndroidBuildActions(ctx android.ModuleContext) {
validatePartitionType(ctx, f)
}

View file

@ -367,7 +367,7 @@ func TestFileSystemWithCoverageVariants(t *testing.T) {
func TestSystemImageDefaults(t *testing.T) {
result := fixture.RunTestWithBp(t, `
android_system_image_defaults {
android_filesystem_defaults {
name: "defaults",
multilib: {
common: {
@ -433,3 +433,25 @@ func TestSystemImageDefaults(t *testing.T) {
android.AssertStringListContains(t, "missing entry", fs.entries, e)
}
}
func TestInconsistentPartitionTypesInDefaults(t *testing.T) {
fixture.ExtendWithErrorHandler(android.FixtureExpectsOneErrorPattern(
"doesn't match with the partition type")).
RunTestWithBp(t, `
android_filesystem_defaults {
name: "system_ext_def",
partition_type: "system_ext",
}
android_filesystem_defaults {
name: "system_def",
partition_type: "system",
defaults: ["system_ext_def"],
}
android_system_image {
name: "system",
defaults: ["system_def"],
}
`)
}

View file

@ -21,7 +21,6 @@ import (
type systemImage struct {
filesystem
android.DefaultableModuleBase
properties systemImageProperties
}
@ -40,7 +39,6 @@ func systemImageFactory() android.Module {
module.filesystem.buildExtraFiles = module.buildExtraFiles
module.filesystem.filterPackagingSpec = module.filterPackagingSpec
initFilesystemModule(&module.filesystem)
android.InitDefaultableModule(module)
return module
}
@ -102,17 +100,3 @@ func (s *systemImage) buildLinkerConfigFile(ctx android.ModuleContext, root andr
func (s *systemImage) filterPackagingSpec(ps android.PackagingSpec) bool {
return ps.Partition() == "system"
}
type systemImageDefaults struct {
android.ModuleBase
android.DefaultsModuleBase
}
// android_system_image_defaults is a default module for android_system_image module.
func systemImageDefaultsFactory() android.Module {
module := &systemImageDefaults{}
module.AddProperties(&android.PackagingProperties{})
module.AddProperties(&systemImageProperties{})
android.InitDefaultsModule(module)
return module
}