Soong filesystem generates aconfig files for subpartitions
When system had system_ext or other subpartitions, aconfig files for
the subpartitions were missing. Generate those aconfig files for the
subpartitions.
With this fix, we don't need to import aconfig files from system_ext
to generate system aconfig files.
Bug: 385213580
Test: lunch gsi_x86_64-trunk_staging-userdebug && m
Change-Id: Ie3db5c73c50af97f3ad0bea5e0c84273c9fce886
diff --git a/filesystem/aconfig_files.go b/filesystem/aconfig_files.go
index b4173d7..20a1953 100644
--- a/filesystem/aconfig_files.go
+++ b/filesystem/aconfig_files.go
@@ -17,6 +17,7 @@
import (
"android/soong/android"
"strconv"
+ "strings"
"github.com/google/blueprint"
"github.com/google/blueprint/proptools"
@@ -31,20 +32,13 @@
Command: `$aconfig create-storage --container $container --file $fileType --out $out --cache $in --version $version`,
CommandDeps: []string{"$aconfig"},
}, "container", "fileType", "version")
+
+ subPartitionsInPartition = map[string][]string{
+ "system": {"system_ext", "product", "vendor"},
+ "vendor": {"odm"},
+ }
)
-type installedAconfigFlagsInfo struct {
- aconfigFiles android.Paths
-}
-
-var installedAconfigFlagsProvider = blueprint.NewProvider[installedAconfigFlagsInfo]()
-
-type importAconfigDepDag struct {
- blueprint.BaseDependencyTag
-}
-
-var importAconfigDependencyTag = interPartitionDepTag{}
-
func (f *filesystem) buildAconfigFlagsFiles(
ctx android.ModuleContext,
builder *android.RuleBuilder,
@@ -52,88 +46,97 @@
dir android.OutputPath,
fullInstallPaths *[]FullInstallPathInfo,
) {
- var caches []android.Path
- for _, ps := range specs {
- caches = append(caches, ps.GetAconfigPaths()...)
- }
-
- ctx.VisitDirectDepsWithTag(importAconfigDependencyTag, func(m android.Module) {
- info, ok := android.OtherModuleProvider(ctx, m, installedAconfigFlagsProvider)
- if !ok {
- ctx.ModuleErrorf("expected dependency %s to have an installedAconfigFlagsProvider", m.Name())
- return
- }
- caches = append(caches, info.aconfigFiles...)
- })
- caches = android.SortedUniquePaths(caches)
-
- android.SetProvider(ctx, installedAconfigFlagsProvider, installedAconfigFlagsInfo{
- aconfigFiles: caches,
- })
-
if !proptools.Bool(f.properties.Gen_aconfig_flags_pb) {
return
}
- container := f.PartitionType()
+ partition := f.PartitionType()
+ subPartitionsFound := map[string]bool{}
+ fullInstallPath := android.PathForModuleInPartitionInstall(ctx, partition)
- aconfigFlagsPb := android.PathForModuleOut(ctx, "aconfig", "aconfig_flags.pb")
- aconfigFlagsPbBuilder := android.NewRuleBuilder(pctx, ctx)
- cmd := aconfigFlagsPbBuilder.Command().
- BuiltTool("aconfig").
- Text(" dump-cache --dedup --format protobuf --out").
- Output(aconfigFlagsPb).
- Textf("--filter container:%s+state:ENABLED", container).
- Textf("--filter container:%s+permission:READ_WRITE", container)
- for _, cache := range caches {
- cmd.FlagWithInput("--cache ", cache)
- }
- aconfigFlagsPbBuilder.Build("aconfig_flags_pb", "build aconfig_flags.pb")
-
- installAconfigFlagsPath := dir.Join(ctx, "etc", "aconfig_flags.pb")
- builder.Command().Text("mkdir -p ").Text(dir.Join(ctx, "etc").String())
- builder.Command().Text("cp").Input(aconfigFlagsPb).Text(installAconfigFlagsPath.String())
- *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{
- FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), "etc/aconfig_flags.pb"),
- SourcePath: aconfigFlagsPb,
- })
- f.appendToEntry(ctx, installAconfigFlagsPath)
-
- // To enable fingerprint, we need to have v2 storage files. The default version is 1.
- storageFilesVersion := 1
- if ctx.Config().ReleaseFingerprintAconfigPackages() {
- storageFilesVersion = 2
+ for _, subPartition := range subPartitionsInPartition[partition] {
+ subPartitionsFound[subPartition] = false
}
- installAconfigStorageDir := dir.Join(ctx, "etc", "aconfig")
- builder.Command().Text("mkdir -p").Text(installAconfigStorageDir.String())
+ var caches []android.Path
+ for _, ps := range specs {
+ caches = append(caches, ps.GetAconfigPaths()...)
+ for subPartition, found := range subPartitionsFound {
+ if !found && strings.HasPrefix(ps.RelPathInPackage(), subPartition+"/") {
+ subPartitionsFound[subPartition] = true
+ break
+ }
+ }
+ }
+ caches = android.SortedUniquePaths(caches)
- generatePartitionAconfigStorageFile := func(fileType, fileName string) {
- outPath := android.PathForModuleOut(ctx, "aconfig", fileName)
- installPath := installAconfigStorageDir.Join(ctx, fileName)
- ctx.Build(pctx, android.BuildParams{
- Rule: aconfigCreateStorage,
- Input: aconfigFlagsPb,
- Output: outPath,
- Args: map[string]string{
- "container": container,
- "fileType": fileType,
- "version": strconv.Itoa(storageFilesVersion),
- },
- })
- builder.Command().
- Text("cp").Input(outPath).Text(installPath.String())
+ buildAconfigFlagsFiles := func(container string, dir android.OutputPath, fullInstallPath android.InstallPath) {
+ aconfigFlagsPb := android.PathForModuleOut(ctx, "aconfig", container, "aconfig_flags.pb")
+ aconfigFlagsPbBuilder := android.NewRuleBuilder(pctx, ctx)
+ cmd := aconfigFlagsPbBuilder.Command().
+ BuiltTool("aconfig").
+ Text(" dump-cache --dedup --format protobuf --out").
+ Output(aconfigFlagsPb).
+ Textf("--filter container:%s+state:ENABLED", container).
+ Textf("--filter container:%s+permission:READ_WRITE", container)
+ for _, cache := range caches {
+ cmd.FlagWithInput("--cache ", cache)
+ }
+ aconfigFlagsPbBuilder.Build(container+"_aconfig_flags_pb", "build aconfig_flags.pb")
+
+ installEtcDir := dir.Join(ctx, "etc")
+ installAconfigFlagsPath := installEtcDir.Join(ctx, "aconfig_flags.pb")
+ builder.Command().Text("mkdir -p ").Text(installEtcDir.String())
+ builder.Command().Text("cp").Input(aconfigFlagsPb).Text(installAconfigFlagsPath.String())
*fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{
- SourcePath: outPath,
- FullInstallPath: android.PathForModuleInPartitionInstall(ctx, f.PartitionType(), "etc/aconfig", fileName),
+ FullInstallPath: fullInstallPath.Join(ctx, "etc/aconfig_flags.pb"),
+ SourcePath: aconfigFlagsPb,
})
- f.appendToEntry(ctx, installPath)
+ f.appendToEntry(ctx, installAconfigFlagsPath)
+
+ // To enable fingerprint, we need to have v2 storage files. The default version is 1.
+ storageFilesVersion := 1
+ if ctx.Config().ReleaseFingerprintAconfigPackages() {
+ storageFilesVersion = 2
+ }
+
+ installAconfigStorageDir := installEtcDir.Join(ctx, "aconfig")
+ builder.Command().Text("mkdir -p").Text(installAconfigStorageDir.String())
+
+ generatePartitionAconfigStorageFile := func(fileType, fileName string) {
+ outPath := android.PathForModuleOut(ctx, "aconfig", container, fileName)
+ installPath := installAconfigStorageDir.Join(ctx, fileName)
+ ctx.Build(pctx, android.BuildParams{
+ Rule: aconfigCreateStorage,
+ Input: aconfigFlagsPb,
+ Output: outPath,
+ Args: map[string]string{
+ "container": container,
+ "fileType": fileType,
+ "version": strconv.Itoa(storageFilesVersion),
+ },
+ })
+ builder.Command().
+ Text("cp").Input(outPath).Text(installPath.String())
+ *fullInstallPaths = append(*fullInstallPaths, FullInstallPathInfo{
+ SourcePath: outPath,
+ FullInstallPath: fullInstallPath.Join(ctx, "etc/aconfig", fileName),
+ })
+ f.appendToEntry(ctx, installPath)
+ }
+
+ if ctx.Config().ReleaseCreateAconfigStorageFile() {
+ generatePartitionAconfigStorageFile("package_map", "package.map")
+ generatePartitionAconfigStorageFile("flag_map", "flag.map")
+ generatePartitionAconfigStorageFile("flag_val", "flag.val")
+ generatePartitionAconfigStorageFile("flag_info", "flag.info")
+ }
}
- if ctx.Config().ReleaseCreateAconfigStorageFile() {
- generatePartitionAconfigStorageFile("package_map", "package.map")
- generatePartitionAconfigStorageFile("flag_map", "flag.map")
- generatePartitionAconfigStorageFile("flag_val", "flag.val")
- generatePartitionAconfigStorageFile("flag_info", "flag.info")
+ buildAconfigFlagsFiles(partition, dir, fullInstallPath)
+ for _, subPartition := range android.SortedKeys(subPartitionsFound) {
+ if subPartitionsFound[subPartition] {
+ buildAconfigFlagsFiles(subPartition, dir.Join(ctx, subPartition), fullInstallPath.Join(ctx, subPartition))
+ }
}
}