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