xref: /aosp_15_r20/build/soong/android/early_module_context.go (revision 333d2b3687b3a337dbcca9d65000bca186795e39)
1// Copyright 2015 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7//     http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package android
16
17import (
18	"os"
19	"text/scanner"
20
21	"github.com/google/blueprint"
22)
23
24// ModuleErrorContext provides only methods to report errors about the current module.
25type ModuleErrorContext interface {
26	// ModuleErrorf reports an error at the line number of the module type in the module definition.
27	ModuleErrorf(fmt string, args ...interface{})
28
29	// PropertyErrorf reports an error at the line number of a property in the module definition.
30	PropertyErrorf(property, fmt string, args ...interface{})
31}
32
33// EarlyModuleContext provides methods that can be called early, as soon as the properties have
34// been parsed into the module and before any mutators have run.
35type EarlyModuleContext interface {
36	ModuleErrorContext
37
38	// Module returns the current module as a Module.  It should rarely be necessary, as the module already has a
39	// reference to itself.
40	Module() Module
41
42	// ModuleName returns the name of the module.  This is generally the value that was returned by Module.Name() when
43	// the module was created, but may have been modified by calls to BottomUpMutatorContext.Rename.
44	ModuleName() string
45
46	// ModuleDir returns the path to the directory that contains the definition of the module.
47	ModuleDir() string
48
49	// ModuleType returns the name of the module type that was used to create the module, as specified in
50	// RegisterModuleType.
51	ModuleType() string
52
53	// BlueprintFile returns the name of the blueprint file that contains the definition of this
54	// module.
55	BlueprintsFile() string
56
57	// ContainsProperty returns true if the specified property name was set in the module definition.
58	ContainsProperty(name string) bool
59
60	// Errorf reports an error at the specified position of the module definition file.
61	Errorf(pos scanner.Position, fmt string, args ...interface{})
62
63	// OtherModulePropertyErrorf reports an error at the line number of a property in the given module definition.
64	OtherModulePropertyErrorf(module Module, property, fmt string, args ...interface{})
65
66	// Failed returns true if any errors have been reported.  In most cases the module can continue with generating
67	// build rules after an error, allowing it to report additional errors in a single run, but in cases where the error
68	// has prevented the module from creating necessary data it can return early when Failed returns true.
69	Failed() bool
70
71	// AddNinjaFileDeps adds dependencies on the specified files to the rule that creates the ninja manifest.  The
72	// primary builder will be rerun whenever the specified files are modified.
73	AddNinjaFileDeps(deps ...string)
74
75	DeviceSpecific() bool
76	SocSpecific() bool
77	ProductSpecific() bool
78	SystemExtSpecific() bool
79	Platform() bool
80
81	Config() Config
82	DeviceConfig() DeviceConfig
83
84	// Deprecated: use Config()
85	AConfig() Config
86
87	// GlobWithDeps returns a list of files that match the specified pattern but do not match any
88	// of the patterns in excludes.  It also adds efficient dependencies to rerun the primary
89	// builder whenever a file matching the pattern as added or removed, without rerunning if a
90	// file that does not match the pattern is added to a searched directory.
91	GlobWithDeps(pattern string, excludes []string) ([]string, error)
92
93	Glob(globPattern string, excludes []string) Paths
94	GlobFiles(globPattern string, excludes []string) Paths
95	IsSymlink(path Path) bool
96	Readlink(path Path) string
97
98	// Namespace returns the Namespace object provided by the NameInterface set by Context.SetNameInterface, or the
99	// default SimpleNameInterface if Context.SetNameInterface was not called.
100	Namespace() *Namespace
101
102	// HasMutatorFinished returns true if the given mutator has finished running.
103	// It will panic if given an invalid mutator name.
104	HasMutatorFinished(mutatorName string) bool
105}
106
107// Deprecated: use EarlyModuleContext instead
108type BaseContext interface {
109	EarlyModuleContext
110}
111
112type earlyModuleContext struct {
113	blueprint.EarlyModuleContext
114
115	kind   moduleKind
116	config Config
117}
118
119func (e *earlyModuleContext) Glob(globPattern string, excludes []string) Paths {
120	return Glob(e, globPattern, excludes)
121}
122
123func (e *earlyModuleContext) GlobFiles(globPattern string, excludes []string) Paths {
124	return GlobFiles(e, globPattern, excludes)
125}
126
127func (e *earlyModuleContext) IsSymlink(path Path) bool {
128	fileInfo, err := e.config.fs.Lstat(path.String())
129	if err != nil {
130		e.ModuleErrorf("os.Lstat(%q) failed: %s", path.String(), err)
131	}
132	return fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink
133}
134
135func (e *earlyModuleContext) Readlink(path Path) string {
136	dest, err := e.config.fs.Readlink(path.String())
137	if err != nil {
138		e.ModuleErrorf("os.Readlink(%q) failed: %s", path.String(), err)
139	}
140	return dest
141}
142
143func (e *earlyModuleContext) Module() Module {
144	module, _ := e.EarlyModuleContext.Module().(Module)
145	return module
146}
147
148func (e *earlyModuleContext) Config() Config {
149	return e.EarlyModuleContext.Config().(Config)
150}
151
152func (e *earlyModuleContext) AConfig() Config {
153	return e.config
154}
155
156func (e *earlyModuleContext) DeviceConfig() DeviceConfig {
157	return DeviceConfig{e.config.deviceConfig}
158}
159
160func (e *earlyModuleContext) Platform() bool {
161	return e.kind == platformModule
162}
163
164func (e *earlyModuleContext) DeviceSpecific() bool {
165	return e.kind == deviceSpecificModule
166}
167
168func (e *earlyModuleContext) SocSpecific() bool {
169	return e.kind == socSpecificModule
170}
171
172func (e *earlyModuleContext) ProductSpecific() bool {
173	return e.kind == productSpecificModule
174}
175
176func (e *earlyModuleContext) SystemExtSpecific() bool {
177	return e.kind == systemExtSpecificModule
178}
179
180func (e *earlyModuleContext) Namespace() *Namespace {
181	return e.EarlyModuleContext.Namespace().(*Namespace)
182}
183
184func (e *earlyModuleContext) OtherModulePropertyErrorf(module Module, property string, fmt string, args ...interface{}) {
185	e.EarlyModuleContext.OtherModulePropertyErrorf(module, property, fmt, args...)
186}
187
188func (e *earlyModuleContext) HasMutatorFinished(mutatorName string) bool {
189	return e.EarlyModuleContext.HasMutatorFinished(mutatorName)
190}
191