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