diff options
| -rw-r--r-- | filesystem/filesystem.go | 55 | ||||
| -rw-r--r-- | fsgen/filesystem_creator.go | 12 | ||||
| -rw-r--r-- | java/app.go | 4 |
3 files changed, 69 insertions, 2 deletions
diff --git a/filesystem/filesystem.go b/filesystem/filesystem.go index 5b217aeec..eb3418064 100644 --- a/filesystem/filesystem.go +++ b/filesystem/filesystem.go @@ -25,6 +25,7 @@ import ( "android/soong/android" "android/soong/cc" + "android/soong/java" "android/soong/linkerconfig" "github.com/google/blueprint" @@ -33,6 +34,7 @@ import ( func init() { registerBuildComponents(android.InitRegistrationContext) + registerMutators(android.InitRegistrationContext) } func registerBuildComponents(ctx android.RegistrationContext) { @@ -45,6 +47,12 @@ func registerBuildComponents(ctx android.RegistrationContext) { ctx.RegisterModuleType("avb_gen_vbmeta_image_defaults", avbGenVbmetaImageDefaultsFactory) } +func registerMutators(ctx android.RegistrationContext) { + ctx.PostDepsMutators(func(ctx android.RegisterMutatorsContext) { + ctx.BottomUp("add_autogenerated_rro_deps", addAutogeneratedRroDeps) + }) +} + type filesystem struct { android.ModuleBase android.PackagingBase @@ -170,6 +178,14 @@ type FilesystemProperties struct { // Path to the dev nodes description file. This is only needed for building the ramdisk // partition and should not be explicitly specified. Dev_nodes_description_file *string `android:"path" blueprint:"mutated"` + + // Additional dependencies used for building android products + Android_filesystem_deps AndroidFilesystemDeps +} + +type AndroidFilesystemDeps struct { + System *string + System_ext *string } // Additional properties required to generate erofs FS partitions. @@ -235,6 +251,12 @@ type depTagWithVisibilityEnforcementBypass struct { depTag } +type interPartitionDepTag struct { + blueprint.BaseDependencyTag +} + +var interPartitionDependencyTag = interPartitionDepTag{} + var _ android.ExcludeFromVisibilityEnforcementTag = (*depTagWithVisibilityEnforcementBypass)(nil) func (t depTagWithVisibilityEnforcementBypass) ExcludeFromVisibilityEnforcement() {} @@ -257,6 +279,12 @@ func (f *filesystem) DepsMutator(ctx android.BottomUpMutatorContext) { } else { f.AddDeps(ctx, dependencyTag) } + if f.properties.Android_filesystem_deps.System != nil { + ctx.AddDependency(ctx.Module(), interPartitionDependencyTag, proptools.String(f.properties.Android_filesystem_deps.System)) + } + if f.properties.Android_filesystem_deps.System_ext != nil { + ctx.AddDependency(ctx.Module(), interPartitionDependencyTag, proptools.String(f.properties.Android_filesystem_deps.System_ext)) + } } type fsType int @@ -1004,3 +1032,30 @@ func assertMaxImageSize(builder *android.RuleBuilder, image android.Path, maxSiz image, maxSize) cmd.Implicit(image) } + +// addAutogeneratedRroDeps walks the transitive closure of vendor and product partitions. +// It visits apps installed in system and system_ext partitions, and adds the autogenerated +// RRO modules to its own deps. +func addAutogeneratedRroDeps(ctx android.BottomUpMutatorContext) { + f, ok := ctx.Module().(*filesystem) + if !ok { + return + } + thisPartition := f.PartitionType() + if thisPartition != "vendor" && thisPartition != "product" { + return + } + ctx.WalkDeps(func(child, parent android.Module) bool { + depTag := ctx.OtherModuleDependencyTag(child) + if parent.Name() == f.Name() && depTag != interPartitionDependencyTag { + return false // This is a module listed in deps of vendor/product filesystem + } + if vendorOverlay := java.AutogeneratedRroModuleName(ctx, child.Name(), "vendor"); ctx.OtherModuleExists(vendorOverlay) && thisPartition == "vendor" { + ctx.AddFarVariationDependencies(nil, dependencyTagWithVisibilityEnforcementBypass, vendorOverlay) + } + if productOverlay := java.AutogeneratedRroModuleName(ctx, child.Name(), "product"); ctx.OtherModuleExists(productOverlay) && thisPartition == "product" { + ctx.AddFarVariationDependencies(nil, dependencyTagWithVisibilityEnforcementBypass, productOverlay) + } + return true + }) +} diff --git a/fsgen/filesystem_creator.go b/fsgen/filesystem_creator.go index 8325b1ed5..46e93235a 100644 --- a/fsgen/filesystem_creator.go +++ b/fsgen/filesystem_creator.go @@ -205,7 +205,7 @@ func (f *filesystemCreator) createDeviceModule( ctx.CreateModule(filesystem.AndroidDeviceFactory, baseProps, partitionProps) } -func partitionSpecificFsProps(fsProps *filesystem.FilesystemProperties, partitionVars android.PartitionVariables, partitionType string) { +func partitionSpecificFsProps(ctx android.EarlyModuleContext, fsProps *filesystem.FilesystemProperties, partitionVars android.PartitionVariables, partitionType string) { switch partitionType { case "system": fsProps.Build_logtags = proptools.BoolPtr(true) @@ -356,6 +356,10 @@ func partitionSpecificFsProps(fsProps *filesystem.FilesystemProperties, partitio fsProps.Fsverity.Libs = []string{":framework-res{.export-package.apk}"} case "product": fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(true) + fsProps.Android_filesystem_deps.System = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system")) + if ctx.DeviceConfig().SystemExtPath() == "system_ext" { + fsProps.Android_filesystem_deps.System_ext = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system_ext")) + } case "vendor": fsProps.Gen_aconfig_flags_pb = proptools.BoolPtr(true) fsProps.Symlinks = []filesystem.SymlinkDefinition{ @@ -368,6 +372,10 @@ func partitionSpecificFsProps(fsProps *filesystem.FilesystemProperties, partitio Name: proptools.StringPtr("vendor/lib/modules"), }, } + fsProps.Android_filesystem_deps.System = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system")) + if ctx.DeviceConfig().SystemExtPath() == "system_ext" { + fsProps.Android_filesystem_deps.System_ext = proptools.StringPtr(generatedModuleNameForPartition(ctx.Config(), "system_ext")) + } case "odm": fsProps.Symlinks = []filesystem.SymlinkDefinition{ filesystem.SymlinkDefinition{ @@ -711,7 +719,7 @@ func generateFsProps(ctx android.EarlyModuleContext, partitionType string) (*fil fsProps.Is_auto_generated = proptools.BoolPtr(true) - partitionSpecificFsProps(fsProps, partitionVars, partitionType) + partitionSpecificFsProps(ctx, fsProps, partitionVars, partitionType) // system_image properties that are not set: // - filesystemProperties.Avb_hash_algorithm diff --git a/java/app.go b/java/app.go index 7f80160a3..34a548e5a 100644 --- a/java/app.go +++ b/java/app.go @@ -1382,6 +1382,10 @@ func AndroidAppFactory() android.Module { return module } +func AutogeneratedRroModuleName(ctx android.EarlyModuleContext, moduleName, partition string) string { + return fmt.Sprintf("%s__%s__auto_generated_rro_%s", moduleName, ctx.Config().DeviceProduct(), partition) +} + // A dictionary of values to be overridden in the manifest. type Manifest_values struct { // Overrides the value of package_name in the manifest |