aboutsummaryrefslogtreecommitdiff
path: root/android/singleton.go
diff options
context:
space:
mode:
authormosimchah <mosimchah@gmail.com>2025-12-02 09:27:38 -0500
committermosimchah <mosimchah@gmail.com>2025-12-02 09:27:38 -0500
commitc7bade461dc55726f62997d13a48582f7c4b4655 (patch)
treeea0588da76060a2038f54f67efd046ca77634b10 /android/singleton.go
parent0f5414d19317805e8bbbe7c4db5f0fd78769bad5 (diff)
parent89d78cff8b00d3b20a90074635c3fe5a2ee49474 (diff)
Merge branch 'lineage-23.1' of https://github.com/LineageOS/android_build_soong into HEADw16.1
* 'lineage-23.1' of https://github.com/LineageOS/android_build_soong: (528 commits) Revert "install_symlink: Make symlink target configurable" Reapply "Clear as much of cc.Module as possible after GenerateBuildActions" Revert "rust: config: Fix missing CPU variant LD flags in Rust" Rename build-flag in outdir Revert^4 "cipd: Default CIPD proxy server to on, add opt-out" Convert check-vintf-all to phony with actions Create a partial implementation of check-vintf-all for soong-only Configure RBE rust pool based on build variant Revert^3 "Add sdk version check to arr" Add jdk.internal.invoke to the allowlist Make droid always depend on symbols zip Import Device and Odm skus Don't install gob_gen in Soong Remove bazel reference from run_integration_tests.sh Fix bootstrap_test.sh Don't panic in aconfig libraries when AllowMissingDependencies is set Avoid returning nil paths from PathForModuleSrc Revert "Flag controled clang version" Rework module target dependencies on required deps Revert^2 "Add sdk version check to arr" ... Change-Id: I6e9a63fa14fda917a42e426e5dcebbad7f67e1de
Diffstat (limited to 'android/singleton.go')
-rw-r--r--android/singleton.go126
1 files changed, 85 insertions, 41 deletions
diff --git a/android/singleton.go b/android/singleton.go
index e5f26842a..786b2794f 100644
--- a/android/singleton.go
+++ b/android/singleton.go
@@ -15,7 +15,9 @@
package android
import (
+ "path/filepath"
"slices"
+ "strings"
"sync"
"github.com/google/blueprint"
@@ -28,19 +30,19 @@ type SingletonContext interface {
Config() Config
DeviceConfig() DeviceConfig
- ModuleName(module blueprint.Module) string
- ModuleDir(module blueprint.Module) string
- ModuleSubDir(module blueprint.Module) string
- ModuleType(module blueprint.Module) string
- BlueprintFile(module blueprint.Module) string
+ ModuleName(module ModuleOrProxy) string
+ ModuleDir(module ModuleOrProxy) string
+ ModuleSubDir(module ModuleOrProxy) string
+ ModuleType(module ModuleOrProxy) string
+ BlueprintFile(module ModuleOrProxy) string
// ModuleVariantsFromName returns the list of module variants named `name` in the same namespace as `referer` enforcing visibility rules.
// Allows generating build actions for `referer` based on the metadata for `name` deferred until the singleton context.
ModuleVariantsFromName(referer ModuleProxy, name string) []ModuleProxy
- otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool)
+ otherModuleProvider(module ModuleOrProxy, provider blueprint.AnyProviderKey) (any, bool)
- ModuleErrorf(module blueprint.Module, format string, args ...interface{})
+ ModuleErrorf(module ModuleOrProxy, format string, args ...interface{})
Errorf(format string, args ...interface{})
Failed() bool
@@ -69,25 +71,23 @@ type SingletonContext interface {
VisitAllModules(visit func(Module))
VisitAllModuleProxies(visit func(proxy ModuleProxy))
VisitAllModulesIf(pred func(Module) bool, visit func(Module))
+ VisitAllModulesOrProxies(visit func(ModuleOrProxy))
VisitDirectDeps(module Module, visit func(Module))
VisitDirectDepsIf(module Module, pred func(Module) bool, visit func(Module))
- // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
- VisitDepsDepthFirst(module Module, visit func(Module))
- // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module
- VisitDepsDepthFirstIf(module Module, pred func(Module) bool,
- visit func(Module))
+ VisitDirectDepsProxies(module ModuleProxy, visit func(ModuleProxy))
VisitAllModuleVariants(module Module, visit func(Module))
- VisitAllModuleVariantProxies(module Module, visit func(proxy ModuleProxy))
+ VisitAllModuleVariantProxies(module ModuleProxy, visit func(proxy ModuleProxy))
PrimaryModule(module Module) Module
PrimaryModuleProxy(module ModuleProxy) ModuleProxy
- IsFinalModule(module Module) bool
+ IsPrimaryModule(module ModuleOrProxy) bool
+ IsFinalModule(module ModuleOrProxy) bool
AddNinjaFileDeps(deps ...string)
@@ -98,7 +98,7 @@ type SingletonContext interface {
GlobWithDeps(pattern string, excludes []string) ([]string, error)
// OtherModulePropertyErrorf reports an error on the line number of the given property of the given module
- OtherModulePropertyErrorf(module Module, property string, format string, args ...interface{})
+ OtherModulePropertyErrorf(module ModuleOrProxy, property string, format string, args ...interface{})
// HasMutatorFinished returns true if the given mutator has finished running.
// It will panic if given an invalid mutator name.
@@ -113,6 +113,11 @@ type SingletonContext interface {
// goal is built.
DistForGoalWithFilename(goal string, path Path, filename string)
+ // DistForGoalWithFilenameTag creates a rule to copy a Path to the artifacts
+ // directory on the build server with the given filename appended with the
+ // `-FILE_NAME_TAG_PLACEHOLDER` suffix when the specified goal is built.
+ DistForGoalWithFilenameTag(goal string, path Path, filename string)
+
// DistForGoals creates a rule to copy one or more Paths to the artifacts
// directory on the build server when any of the specified goals are built.
DistForGoals(goals []string, paths ...Path)
@@ -121,6 +126,16 @@ type SingletonContext interface {
// directory on the build server with the given filename when any of the
// specified goals are built.
DistForGoalsWithFilename(goals []string, path Path, filename string)
+
+ // OtherModuleDependencyTag returns the dependency tag used to depend on a module, or nil if there is no dependency
+ // on the module. When called inside a Visit* method with current module being visited, and there are multiple
+ // dependencies on the module being visited, it returns the dependency tag used for the current dependency.
+ OtherModuleDependencyTag(module ModuleOrProxy) blueprint.DependencyTag
+
+ GetIncrementalAnalysis() bool
+
+ // OtherModuleNamespace returns the namespace of the module.
+ OtherModuleNamespace(module ModuleOrProxy) *Namespace
}
type singletonAdaptor struct {
@@ -203,7 +218,7 @@ func (s *singletonContextAdaptor) Variable(pctx PackageContext, name, value stri
func (s *singletonContextAdaptor) Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule {
if s.Config().UseRemoteBuild() {
if params.Pool == nil {
- // When USE_GOMA=true or USE_RBE=true are set and the rule is not supported by goma/RBE, restrict
+ // When USE_RBE=true is set and the rule is not supported by RBE, restrict
// jobs to the local parallelism value
params.Pool = localPool
} else if params.Pool == remotePool {
@@ -240,6 +255,10 @@ func (s *singletonContextAdaptor) Eval(pctx PackageContext, ninjaStr string) (st
return s.SingletonContext.Eval(pctx.PackageContext, ninjaStr)
}
+func (s *singletonContextAdaptor) ModuleErrorf(module ModuleOrProxy, fmt string, args ...any) {
+ s.SingletonContext.ModuleErrorf(module, fmt, args...)
+}
+
// visitAdaptor wraps a visit function that takes an android.Module parameter into
// a function that takes a blueprint.Module parameter and only calls the visit function if the
// blueprint.Module is an android.Module.
@@ -255,9 +274,7 @@ func visitAdaptor(visit func(Module)) func(blueprint.Module) {
// a function that takes a blueprint.ModuleProxy parameter.
func visitProxyAdaptor(visit func(proxy ModuleProxy)) func(proxy blueprint.ModuleProxy) {
return func(module blueprint.ModuleProxy) {
- visit(ModuleProxy{
- module: module,
- })
+ visit(ModuleProxy{module})
}
}
@@ -274,24 +291,24 @@ func predAdaptor(pred func(Module) bool) func(blueprint.Module) bool {
}
}
-func (s *singletonContextAdaptor) ModuleName(module blueprint.Module) string {
- return s.SingletonContext.ModuleName(getWrappedModule(module))
+func (s *singletonContextAdaptor) ModuleName(module ModuleOrProxy) string {
+ return s.SingletonContext.ModuleName(module)
}
-func (s *singletonContextAdaptor) ModuleDir(module blueprint.Module) string {
- return s.SingletonContext.ModuleDir(getWrappedModule(module))
+func (s *singletonContextAdaptor) ModuleDir(module ModuleOrProxy) string {
+ return s.SingletonContext.ModuleDir(module)
}
-func (s *singletonContextAdaptor) ModuleSubDir(module blueprint.Module) string {
- return s.SingletonContext.ModuleSubDir(getWrappedModule(module))
+func (s *singletonContextAdaptor) ModuleSubDir(module ModuleOrProxy) string {
+ return s.SingletonContext.ModuleSubDir(module)
}
-func (s *singletonContextAdaptor) ModuleType(module blueprint.Module) string {
- return s.SingletonContext.ModuleType(getWrappedModule(module))
+func (s *singletonContextAdaptor) ModuleType(module ModuleOrProxy) string {
+ return s.SingletonContext.ModuleType(module)
}
-func (s *singletonContextAdaptor) BlueprintFile(module blueprint.Module) string {
- return s.SingletonContext.BlueprintFile(getWrappedModule(module))
+func (s *singletonContextAdaptor) BlueprintFile(module ModuleOrProxy) string {
+ return s.SingletonContext.BlueprintFile(module)
}
func (s *singletonContextAdaptor) VisitAllModulesBlueprint(visit func(blueprint.Module)) {
@@ -306,6 +323,12 @@ func (s *singletonContextAdaptor) VisitAllModuleProxies(visit func(proxy ModuleP
s.SingletonContext.VisitAllModuleProxies(visitProxyAdaptor(visit))
}
+func (s *singletonContextAdaptor) VisitAllModulesOrProxies(visit func(ModuleOrProxy)) {
+ s.SingletonContext.VisitAllModulesOrProxies(func(module blueprint.ModuleOrProxy) {
+ visit(module)
+ })
+}
+
func (s *singletonContextAdaptor) VisitAllModulesIf(pred func(Module) bool, visit func(Module)) {
s.SingletonContext.VisitAllModulesIf(predAdaptor(pred), visitAdaptor(visit))
}
@@ -318,20 +341,20 @@ func (s *singletonContextAdaptor) VisitDirectDepsIf(module Module, pred func(Mod
s.SingletonContext.VisitDirectDepsIf(module, predAdaptor(pred), visitAdaptor(visit))
}
-func (s *singletonContextAdaptor) VisitDepsDepthFirst(module Module, visit func(Module)) {
- s.SingletonContext.VisitDepsDepthFirst(module, visitAdaptor(visit))
+func (s *singletonContextAdaptor) VisitDirectDepsProxies(module ModuleProxy, visit func(ModuleProxy)) {
+ s.SingletonContext.VisitDirectDepsProxies(module.ModuleProxy, visitProxyAdaptor(visit))
}
-func (s *singletonContextAdaptor) VisitDepsDepthFirstIf(module Module, pred func(Module) bool, visit func(Module)) {
- s.SingletonContext.VisitDepsDepthFirstIf(module, predAdaptor(pred), visitAdaptor(visit))
+func (s *singletonContextAdaptor) OtherModuleDependencyTag(module ModuleOrProxy) blueprint.DependencyTag {
+ return s.SingletonContext.OtherModuleDependencyTag(module)
}
func (s *singletonContextAdaptor) VisitAllModuleVariants(module Module, visit func(Module)) {
s.SingletonContext.VisitAllModuleVariants(module, visitAdaptor(visit))
}
-func (s *singletonContextAdaptor) VisitAllModuleVariantProxies(module Module, visit func(proxy ModuleProxy)) {
- s.SingletonContext.VisitAllModuleVariantProxies(getWrappedModule(module), visitProxyAdaptor(visit))
+func (s *singletonContextAdaptor) VisitAllModuleVariantProxies(module ModuleProxy, visit func(proxy ModuleProxy)) {
+ s.SingletonContext.VisitAllModuleVariantProxies(module.ModuleProxy, visitProxyAdaptor(visit))
}
func (s *singletonContextAdaptor) PrimaryModule(module Module) Module {
@@ -339,18 +362,22 @@ func (s *singletonContextAdaptor) PrimaryModule(module Module) Module {
}
func (s *singletonContextAdaptor) PrimaryModuleProxy(module ModuleProxy) ModuleProxy {
- return ModuleProxy{s.SingletonContext.PrimaryModuleProxy(module.module)}
+ return ModuleProxy{s.SingletonContext.PrimaryModuleProxy(module.ModuleProxy)}
}
-func (s *singletonContextAdaptor) IsFinalModule(module Module) bool {
- return s.SingletonContext.IsFinalModule(getWrappedModule(module))
+func (s *singletonContextAdaptor) IsPrimaryModule(module ModuleOrProxy) bool {
+ return s.SingletonContext.IsPrimaryModule(module)
+}
+
+func (s *singletonContextAdaptor) IsFinalModule(module ModuleOrProxy) bool {
+ return s.SingletonContext.IsFinalModule(module)
}
func (s *singletonContextAdaptor) ModuleVariantsFromName(referer ModuleProxy, name string) []ModuleProxy {
// get module reference for visibility enforcement
qualified := createVisibilityModuleProxyReference(s, s.ModuleName(referer), s.ModuleDir(referer), referer)
- modules := s.SingletonContext.ModuleVariantsFromName(referer.module, name)
+ modules := s.SingletonContext.ModuleVariantsFromName(referer.ModuleProxy, name)
result := make([]ModuleProxy, 0, len(modules))
for _, module := range modules {
// enforce visibility
@@ -371,11 +398,11 @@ func (s *singletonContextAdaptor) ModuleVariantsFromName(referer ModuleProxy, na
return result
}
-func (s *singletonContextAdaptor) otherModuleProvider(module blueprint.Module, provider blueprint.AnyProviderKey) (any, bool) {
+func (s *singletonContextAdaptor) otherModuleProvider(module ModuleOrProxy, provider blueprint.AnyProviderKey) (any, bool) {
return s.SingletonContext.ModuleProvider(module, provider)
}
-func (s *singletonContextAdaptor) OtherModulePropertyErrorf(module Module, property string, format string, args ...interface{}) {
+func (s *singletonContextAdaptor) OtherModulePropertyErrorf(module ModuleOrProxy, property string, format string, args ...interface{}) {
s.blueprintSingletonContext().OtherModulePropertyErrorf(module, property, format, args...)
}
@@ -390,6 +417,15 @@ func (s *singletonContextAdaptor) DistForGoalWithFilename(goal string, path Path
s.DistForGoalsWithFilename([]string{goal}, path, filename)
}
+func (s *singletonContextAdaptor) DistForGoalWithFilenameTag(goal string, path Path, filename string) {
+ insertBeforeExtension := func(file, insertion string) string {
+ ext := filepath.Ext(file)
+ return strings.TrimSuffix(file, ext) + insertion + ext
+ }
+
+ s.DistForGoalWithFilename(goal, path, insertBeforeExtension(filename, "-FILE_NAME_TAG_PLACEHOLDER"))
+}
+
func (s *singletonContextAdaptor) DistForGoals(goals []string, paths ...Path) {
var copies distCopies
for _, path := range paths {
@@ -410,3 +446,11 @@ func (s *singletonContextAdaptor) DistForGoalsWithFilename(goals []string, path
paths: distCopies{{from: path, dest: filename}},
})
}
+
+func (s *singletonContextAdaptor) GetIncrementalAnalysis() bool {
+ return s.SingletonContext.GetIncrementalAnalysis()
+}
+
+func (s *singletonContextAdaptor) OtherModuleNamespace(module ModuleOrProxy) *Namespace {
+ return s.SingletonContext.OtherModuleNamespace(module).(*Namespace)
+}