diff --git a/android/androidmk.go b/android/androidmk.go index e9df75283..12eb6e5e1 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -861,6 +861,7 @@ func translateAndroidModule(ctx SingletonContext, w io.Writer, moduleInfoJSONs * } data := provider.AndroidMk() + if data.Include == "" { data.Include = "$(BUILD_PREBUILT)" } diff --git a/android/compliance_metadata.go b/android/compliance_metadata.go index 0080b9afc..5cdd3020f 100644 --- a/android/compliance_metadata.go +++ b/android/compliance_metadata.go @@ -160,7 +160,7 @@ var ( // buildComplianceMetadataProvider starts with the ModuleContext.ComplianceMetadataInfo() and fills in more common metadata // for different module types without accessing their private fields but through android.Module interface // and public/private fields of package android. The final metadata is stored to a module's ComplianceMetadataProvider. -func buildComplianceMetadataProvider(ctx ModuleContext, m *ModuleBase) { +func buildComplianceMetadataProvider(ctx *moduleContext, m *ModuleBase) { complianceMetadataInfo := ctx.ComplianceMetadataInfo() complianceMetadataInfo.SetStringValue(ComplianceMetadataProp.NAME, m.Name()) complianceMetadataInfo.SetStringValue(ComplianceMetadataProp.PACKAGE, ctx.ModuleDir()) @@ -186,7 +186,7 @@ func buildComplianceMetadataProvider(ctx ModuleContext, m *ModuleBase) { } var installed InstallPaths - installed = append(installed, m.module.FilesToInstall()...) + installed = append(installed, ctx.installFiles...) installed = append(installed, m.katiInstalls.InstallPaths()...) installed = append(installed, m.katiSymlinks.InstallPaths()...) installed = append(installed, m.katiInitRcInstalls.InstallPaths()...) diff --git a/android/license_metadata.go b/android/license_metadata.go index 8056189fc..c12a01c4c 100644 --- a/android/license_metadata.go +++ b/android/license_metadata.go @@ -33,7 +33,7 @@ var ( }, "args") ) -func buildLicenseMetadata(ctx ModuleContext, licenseMetadataFile WritablePath) { +func buildLicenseMetadata(ctx *moduleContext, licenseMetadataFile WritablePath) { base := ctx.Module().base() if !base.Enabled(ctx) { @@ -52,8 +52,8 @@ func buildLicenseMetadata(ctx ModuleContext, licenseMetadataFile WritablePath) { // Only pass the last installed file to isContainerFromFileExtensions so a *.zip file in test data // doesn't mark the whole module as a container. var installFiles InstallPaths - if len(base.installFiles) > 0 { - installFiles = InstallPaths{base.installFiles[len(base.installFiles)-1]} + if len(ctx.installFiles) > 0 { + installFiles = InstallPaths{ctx.installFiles[len(ctx.installFiles)-1]} } isContainer := isContainerFromFileExtensions(installFiles, outputFiles) @@ -92,7 +92,7 @@ func buildLicenseMetadata(ctx ModuleContext, licenseMetadataFile WritablePath) { allDepMetadataArgs = append(allDepMetadataArgs, info.LicenseMetadataPath.String()+depAnnotations) - if depInstallFiles := dep.base().installFiles; len(depInstallFiles) > 0 { + if depInstallFiles := ModuleFilesToInstall(ctx, dep); len(depInstallFiles) > 0 { allDepOutputFiles = append(allDepOutputFiles, depInstallFiles.Paths()...) } else if depOutputFiles, err := outputFilesForModule(ctx, dep, ""); err == nil { depOutputFiles = PathsIfNonNil(depOutputFiles...) @@ -162,7 +162,7 @@ func buildLicenseMetadata(ctx ModuleContext, licenseMetadataFile WritablePath) { // Installed files args = append(args, - JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(base.installFiles.Strings()), "-i ")) + JoinWithPrefix(proptools.NinjaAndShellEscapeListIncludingSpaces(ctx.installFiles.Strings()), "-i ")) if isContainer { args = append(args, "--is_container") diff --git a/android/module.go b/android/module.go index 63df6f717..d548b83c5 100644 --- a/android/module.go +++ b/android/module.go @@ -112,7 +112,6 @@ type Module interface { HostRequiredModuleNames() []string TargetRequiredModuleNames() []string - FilesToInstall() InstallPaths PackagingSpecs() []PackagingSpec // TransitivePackagingSpecs returns the PackagingSpecs for this module and any transitive @@ -760,6 +759,14 @@ func InitCommonOSAndroidMultiTargetsArchModule(m Module, hod HostOrDeviceSupport m.base().commonProperties.CreateCommonOSVariant = true } +func ModuleFilesToInstall(ctx OtherModuleProviderContext, m blueprint.Module) InstallPaths { + var filesToInstall InstallPaths + if info, ok := OtherModuleProvider(ctx, m, InstallFilesProvider); ok { + filesToInstall = info.InstallFiles + } + return filesToInstall +} + // A ModuleBase object contains the properties that are common to all Android // modules. It should be included as an anonymous field in every module // struct definition. InitAndroidModule should then be called from the module's @@ -832,7 +839,6 @@ type ModuleBase struct { primaryLicensesProperty applicableLicensesProperty noAddressSanitizer bool - installFiles InstallPaths installFilesDepSet *DepSet[InstallPath] checkbuildFiles Paths packagingSpecs []PackagingSpec @@ -1476,10 +1482,6 @@ func isInstallDepNeeded(dep Module, tag blueprint.DependencyTag) bool { return IsInstallDepNeededTag(tag) } -func (m *ModuleBase) FilesToInstall() InstallPaths { - return m.installFiles -} - func (m *ModuleBase) PackagingSpecs() []PackagingSpec { return m.packagingSpecs } @@ -1615,12 +1617,16 @@ func (m *ModuleBase) SetLicenseInstallMap(installMap []string) { m.licenseInstallMap = append(m.licenseInstallMap, installMap...) } -func (m *ModuleBase) generateModuleTarget(ctx ModuleContext) { +func (m *ModuleBase) generateModuleTarget(ctx *moduleContext) { var allInstalledFiles InstallPaths var allCheckbuildFiles Paths ctx.VisitAllModuleVariants(func(module Module) { a := module.base() - allInstalledFiles = append(allInstalledFiles, a.installFiles...) + if a == m { + allInstalledFiles = append(allInstalledFiles, ctx.installFiles...) + } else { + allInstalledFiles = append(allInstalledFiles, ModuleFilesToInstall(ctx, module)...) + } // A module's -checkbuild phony targets should // not be created if the module is not exported to make. // Those could depend on the build target and fail to compile @@ -1763,6 +1769,12 @@ func (m *ModuleBase) archModuleContextFactory(ctx archModuleContextFactoryContex } +type InstallFilesInfo struct { + InstallFiles InstallPaths +} + +var InstallFilesProvider = blueprint.NewProvider[InstallFilesInfo]() + func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) { ctx := &moduleContext{ module: m.module, @@ -1944,12 +1956,15 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) return } - m.installFiles = append(m.installFiles, ctx.installFiles...) m.checkbuildFiles = append(m.checkbuildFiles, ctx.checkbuildFiles...) m.packagingSpecs = append(m.packagingSpecs, ctx.packagingSpecs...) m.katiInstalls = append(m.katiInstalls, ctx.katiInstalls...) m.katiSymlinks = append(m.katiSymlinks, ctx.katiSymlinks...) m.testData = append(m.testData, ctx.testData...) + + SetProvider(ctx, InstallFilesProvider, InstallFilesInfo{ + InstallFiles: ctx.installFiles, + }) } else if ctx.Config().AllowMissingDependencies() { // If the module is not enabled it will not create any build rules, nothing will call // ctx.GetMissingDependencies(), and blueprint will consider the missing dependencies to be unhandled @@ -1965,7 +1980,7 @@ func (m *ModuleBase) GenerateBuildActions(blueprintCtx blueprint.ModuleContext) } } - m.installFilesDepSet = NewDepSet[InstallPath](TOPOLOGICAL, m.installFiles, dependencyInstallFiles) + m.installFilesDepSet = NewDepSet[InstallPath](TOPOLOGICAL, ctx.installFiles, dependencyInstallFiles) m.packagingSpecsDepSet = NewDepSet[PackagingSpec](TOPOLOGICAL, m.packagingSpecs, dependencyPackagingSpecs) buildLicenseMetadata(ctx, m.licenseMetadataFile) diff --git a/android/test_suites.go b/android/test_suites.go index ff75f26bb..c0dc17ebd 100644 --- a/android/test_suites.go +++ b/android/test_suites.go @@ -47,7 +47,7 @@ func (t *testSuiteFiles) GenerateBuildActions(ctx SingletonContext) { files[testSuite] = make(map[string]InstallPaths) } name := ctx.ModuleName(m) - files[testSuite][name] = append(files[testSuite][name], tsm.FilesToInstall()...) + files[testSuite][name] = append(files[testSuite][name], ModuleFilesToInstall(ctx, tsm)...) } } }) diff --git a/android_sdk/sdk_repo_host.go b/android_sdk/sdk_repo_host.go index 373e88306..a2486fdf5 100644 --- a/android_sdk/sdk_repo_host.go +++ b/android_sdk/sdk_repo_host.go @@ -46,6 +46,9 @@ type sdkRepoHost struct { outputBaseName string outputFile android.OptionalPath + + // TODO(b/357908583): Temp field, remove this once we support Android Mk providers + installFile android.InstallPath } type remapProperties struct { @@ -234,14 +237,18 @@ func (s *sdkRepoHost) GenerateAndroidBuildActions(ctx android.ModuleContext) { s.outputBaseName = name s.outputFile = android.OptionalPathForPath(outputZipFile) - ctx.InstallFile(android.PathForModuleInstall(ctx, "sdk-repo"), name+".zip", outputZipFile) + installPath := android.PathForModuleInstall(ctx, "sdk-repo") + name = name + ".zip" + ctx.InstallFile(installPath, name, outputZipFile) + // TODO(b/357908583): Temp field, remove this once we support Android Mk providers + s.installFile = installPath.Join(ctx, name) } func (s *sdkRepoHost) AndroidMk() android.AndroidMkData { return android.AndroidMkData{ Custom: func(w io.Writer, name, prefix, moduleDir string, data android.AndroidMkData) { fmt.Fprintln(w, ".PHONY:", name, "sdk_repo", "sdk-repo-"+name) - fmt.Fprintln(w, "sdk_repo", "sdk-repo-"+name+":", strings.Join(s.FilesToInstall().Strings(), " ")) + fmt.Fprintln(w, "sdk_repo", "sdk-repo-"+name+":", s.installFile.String()) fmt.Fprintf(w, "$(call dist-for-goals,sdk_repo sdk-repo-%s,%s:%s-FILE_NAME_TAG_PLACEHOLDER.zip)\n\n", s.BaseModuleName(), s.outputFile.String(), s.outputBaseName) }, diff --git a/cc/cmake_snapshot.go b/cc/cmake_snapshot.go index 8f3ad9639..9159156b9 100644 --- a/cc/cmake_snapshot.go +++ b/cc/cmake_snapshot.go @@ -476,7 +476,7 @@ func (m *CmakeSnapshot) GenerateAndroidBuildActions(ctx android.ModuleContext) { var prebuiltsList android.Paths ctx.VisitDirectDepsWithTag(cmakeSnapshotPrebuiltTag, func(dep android.Module) { - for _, file := range dep.FilesToInstall() { + for _, file := range android.ModuleFilesToInstall(ctx, dep) { prebuiltsList = append(prebuiltsList, file) } }) diff --git a/java/app.go b/java/app.go index 19dc8d5d1..a8eaaa425 100644 --- a/java/app.go +++ b/java/app.go @@ -1109,7 +1109,7 @@ func collectJniDeps(ctx android.ModuleContext, coverageFile: dep.CoverageOutputFile(), unstrippedFile: dep.UnstrippedOutputFile(), partition: dep.Partition(), - installPaths: dep.FilesToInstall(), + installPaths: android.ModuleFilesToInstall(ctx, dep), }) } else if ctx.Config().AllowMissingDependencies() { ctx.AddMissingDependencies([]string{otherName}) diff --git a/java/ravenwood.go b/java/ravenwood.go index a52f4053f..d65be520c 100644 --- a/java/ravenwood.go +++ b/java/ravenwood.go @@ -152,7 +152,7 @@ func (r *ravenwoodTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { var runtimeJniModuleNames map[string]bool if utils := ctx.GetDirectDepsWithTag(ravenwoodUtilsTag)[0]; utils != nil { - for _, installFile := range utils.FilesToInstall() { + for _, installFile := range android.ModuleFilesToInstall(ctx, utils) { installDeps = append(installDeps, installFile) } jniDeps, ok := android.OtherModuleProvider(ctx, utils, ravenwoodLibgroupJniDepProvider) @@ -162,7 +162,7 @@ func (r *ravenwoodTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { } if runtime := ctx.GetDirectDepsWithTag(ravenwoodRuntimeTag)[0]; runtime != nil { - for _, installFile := range runtime.FilesToInstall() { + for _, installFile := range android.ModuleFilesToInstall(ctx, runtime) { installDeps = append(installDeps, installFile) } jniDeps, ok := android.OtherModuleProvider(ctx, runtime, ravenwoodLibgroupJniDepProvider) @@ -191,7 +191,7 @@ func (r *ravenwoodTest) GenerateAndroidBuildActions(ctx android.ModuleContext) { resApkInstallPath := installPath.Join(ctx, "ravenwood-res-apks") if resApk := ctx.GetDirectDepsWithTag(ravenwoodTestResourceApkTag); len(resApk) > 0 { - for _, installFile := range resApk[0].FilesToInstall() { + for _, installFile := range android.ModuleFilesToInstall(ctx, resApk[0]) { installResApk := ctx.InstallFile(resApkInstallPath, "ravenwood-res.apk", installFile) installDeps = append(installDeps, installResApk) }