Generate info about the selected apex variant in platform builds

out/soong/prebuilt_info.json will contain information about whether
source or prebuilt of an apex was used. If prebuilt is used, it will
print the path to its prebuilt_info file. This file will be
used to pick a matching set of MTS test prebuilts.

Each apex will have an entry in this file with the following properties
- Name, mandatory
- Is_prebuilt, mandatory
- Prebuilt_info_file_path, optional

Implementation details
- Introduce a new `prebuilt_info` prop to `apex_set` and `prebuilt_apex`
- All apex module types will set a prebuiltInfoProvider in
  GenerateAndroidBuildActions, including the source apex module types
- Create a `apex_prebuiltinfo_singleton` that visits all apex modules.
  It uses `IsHideFromMake` to filter out the unselected variants of a
  specific apex. This new singleton will create prebuilt_info.json
- Dist prebuilt_info.json for droidcore

Test: m nothing --no-skip-soong-tests
Test: m out/soong/prebuilt_info.json
Test: ls -l out/soong/prebuilt_info.json --human-readable
-rw------- 1 spandandas primarygroup 25K Mar 11 23:46 out/soong/prebuilt_info.json

Test: #modified trunk_staging.locally to select prebuilts of some
mainline modules. Spot-checked that `is_prebuilt` and
`prebuilt_info_file_path` get populated appropriately

Bug: 327480225

Change-Id: I65c73010142b034ad1d2b3d05ef493be034e8d74
This commit is contained in:
Spandan Das
2024-03-11 21:37:25 +00:00
parent b952c84841
commit a747d2ec48
3 changed files with 92 additions and 0 deletions

View File

@@ -17,6 +17,8 @@
package apex
import (
"encoding/json"
"github.com/google/blueprint"
"android/soong/android"
@@ -129,3 +131,43 @@ func (s *apexDepsInfoSingleton) MakeVars(ctx android.MakeVarsContext) {
// Export check result to Make. The path is added to droidcore.
ctx.Strict("APEX_ALLOWED_DEPS_CHECK", s.allowedApexDepsInfoCheckResult.String())
}
func init() {
registerApexPrebuiltInfoComponents(android.InitRegistrationContext)
}
func registerApexPrebuiltInfoComponents(ctx android.RegistrationContext) {
ctx.RegisterParallelSingletonType("apex_prebuiltinfo_singleton", apexPrebuiltInfoFactory)
}
func apexPrebuiltInfoFactory() android.Singleton {
return &apexPrebuiltInfo{}
}
type apexPrebuiltInfo struct {
out android.WritablePath
}
func (a *apexPrebuiltInfo) GenerateBuildActions(ctx android.SingletonContext) {
prebuiltInfos := []prebuiltInfo{}
ctx.VisitAllModules(func(m android.Module) {
prebuiltInfo, exists := android.SingletonModuleProvider(ctx, m, prebuiltInfoProvider)
// Use prebuiltInfoProvider to filter out non apex soong modules.
// Use HideFromMake to filter out the unselected variants of a specific apex.
if exists && !m.IsHideFromMake() {
prebuiltInfos = append(prebuiltInfos, prebuiltInfo)
}
})
j, err := json.Marshal(prebuiltInfos)
if err != nil {
ctx.Errorf("Could not convert prebuilt info of apexes to json due to error: %v", err)
}
a.out = android.PathForOutput(ctx, "prebuilt_info.json")
android.WriteFileRule(ctx, a.out, string(j))
}
func (a *apexPrebuiltInfo) MakeVars(ctx android.MakeVarsContext) {
ctx.DistForGoal("droidcore", a.out)
}