summaryrefslogtreecommitdiff
path: root/filesystem/filesystem.go
diff options
context:
space:
mode:
author Spandan Das <spandandas@google.com> 2024-11-20 18:34:16 +0000
committer Spandan Das <spandandas@google.com> 2024-12-02 18:25:20 +0000
commit71be42d93951aaaf95ba520281a9837f32bd738c (patch)
treedb0e8e09776e00dfd1d18ef4c57ce6a688ed31cb /filesystem/filesystem.go
parentf0eabbf94ffa8acf87e88822ec85c162f33b973e (diff)
Automatically add system and system_ext autogen RRO to vendor/product
This CL creates a dependency edge from vendor/product to system and system_ext. A post deps mutator will walk the transitive closure and add the corresponding autogenerated RROs to deps. Bug: 374371755 Bug: 375277835 Test: m soong_generated_vendor_filesystem_test NOTICE is the last diff Change-Id: Iffe64174a0d639dc224505a08eccd0a1dedc9f39
Diffstat (limited to 'filesystem/filesystem.go')
-rw-r--r--filesystem/filesystem.go55
1 files changed, 55 insertions, 0 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
+ })
+}