|  | // Copyright 2015 Google Inc. All rights reserved. | 
|  | // | 
|  | // Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | // you may not use this file except in compliance with the License. | 
|  | // You may obtain a copy of the License at | 
|  | // | 
|  | //     http://www.apache.org/licenses/LICENSE-2.0 | 
|  | // | 
|  | // Unless required by applicable law or agreed to in writing, software | 
|  | // distributed under the License is distributed on an "AS IS" BASIS, | 
|  | // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | // See the License for the specific language governing permissions and | 
|  | // limitations under the License. | 
|  |  | 
|  | package android | 
|  |  | 
|  | import ( | 
|  | "os" | 
|  | "text/scanner" | 
|  |  | 
|  | "github.com/google/blueprint" | 
|  | ) | 
|  |  | 
|  | // EarlyModuleContext provides methods that can be called early, as soon as the properties have | 
|  | // been parsed into the module and before any mutators have run. | 
|  | type EarlyModuleContext interface { | 
|  | // Module returns the current module as a Module.  It should rarely be necessary, as the module already has a | 
|  | // reference to itself. | 
|  | Module() Module | 
|  |  | 
|  | // ModuleName returns the name of the module.  This is generally the value that was returned by Module.Name() when | 
|  | // the module was created, but may have been modified by calls to BaseMutatorContext.Rename. | 
|  | ModuleName() string | 
|  |  | 
|  | // ModuleDir returns the path to the directory that contains the definition of the module. | 
|  | ModuleDir() string | 
|  |  | 
|  | // ModuleType returns the name of the module type that was used to create the module, as specified in | 
|  | // RegisterModuleType. | 
|  | ModuleType() string | 
|  |  | 
|  | // BlueprintFile returns the name of the blueprint file that contains the definition of this | 
|  | // module. | 
|  | BlueprintsFile() string | 
|  |  | 
|  | // ContainsProperty returns true if the specified property name was set in the module definition. | 
|  | ContainsProperty(name string) bool | 
|  |  | 
|  | // Errorf reports an error at the specified position of the module definition file. | 
|  | Errorf(pos scanner.Position, fmt string, args ...interface{}) | 
|  |  | 
|  | // ModuleErrorf reports an error at the line number of the module type in the module definition. | 
|  | ModuleErrorf(fmt string, args ...interface{}) | 
|  |  | 
|  | // PropertyErrorf reports an error at the line number of a property in the module definition. | 
|  | PropertyErrorf(property, fmt string, args ...interface{}) | 
|  |  | 
|  | // OtherModulePropertyErrorf reports an error at the line number of a property in the given module definition. | 
|  | OtherModulePropertyErrorf(module Module, property, fmt string, args ...interface{}) | 
|  |  | 
|  | // Failed returns true if any errors have been reported.  In most cases the module can continue with generating | 
|  | // build rules after an error, allowing it to report additional errors in a single run, but in cases where the error | 
|  | // has prevented the module from creating necessary data it can return early when Failed returns true. | 
|  | Failed() bool | 
|  |  | 
|  | // AddNinjaFileDeps adds dependencies on the specified files to the rule that creates the ninja manifest.  The | 
|  | // primary builder will be rerun whenever the specified files are modified. | 
|  | AddNinjaFileDeps(deps ...string) | 
|  |  | 
|  | DeviceSpecific() bool | 
|  | SocSpecific() bool | 
|  | ProductSpecific() bool | 
|  | SystemExtSpecific() bool | 
|  | Platform() bool | 
|  |  | 
|  | Config() Config | 
|  | DeviceConfig() DeviceConfig | 
|  |  | 
|  | // Deprecated: use Config() | 
|  | AConfig() Config | 
|  |  | 
|  | // GlobWithDeps returns a list of files that match the specified pattern but do not match any | 
|  | // of the patterns in excludes.  It also adds efficient dependencies to rerun the primary | 
|  | // builder whenever a file matching the pattern as added or removed, without rerunning if a | 
|  | // file that does not match the pattern is added to a searched directory. | 
|  | GlobWithDeps(pattern string, excludes []string) ([]string, error) | 
|  |  | 
|  | Glob(globPattern string, excludes []string) Paths | 
|  | GlobFiles(globPattern string, excludes []string) Paths | 
|  | IsSymlink(path Path) bool | 
|  | Readlink(path Path) string | 
|  |  | 
|  | // Namespace returns the Namespace object provided by the NameInterface set by Context.SetNameInterface, or the | 
|  | // default SimpleNameInterface if Context.SetNameInterface was not called. | 
|  | Namespace() *Namespace | 
|  | } | 
|  |  | 
|  | // Deprecated: use EarlyModuleContext instead | 
|  | type BaseContext interface { | 
|  | EarlyModuleContext | 
|  | } | 
|  |  | 
|  | type earlyModuleContext struct { | 
|  | blueprint.EarlyModuleContext | 
|  |  | 
|  | kind   moduleKind | 
|  | config Config | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) Glob(globPattern string, excludes []string) Paths { | 
|  | return Glob(e, globPattern, excludes) | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) GlobFiles(globPattern string, excludes []string) Paths { | 
|  | return GlobFiles(e, globPattern, excludes) | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) IsSymlink(path Path) bool { | 
|  | fileInfo, err := e.config.fs.Lstat(path.String()) | 
|  | if err != nil { | 
|  | e.ModuleErrorf("os.Lstat(%q) failed: %s", path.String(), err) | 
|  | } | 
|  | return fileInfo.Mode()&os.ModeSymlink == os.ModeSymlink | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) Readlink(path Path) string { | 
|  | dest, err := e.config.fs.Readlink(path.String()) | 
|  | if err != nil { | 
|  | e.ModuleErrorf("os.Readlink(%q) failed: %s", path.String(), err) | 
|  | } | 
|  | return dest | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) Module() Module { | 
|  | module, _ := e.EarlyModuleContext.Module().(Module) | 
|  | return module | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) Config() Config { | 
|  | return e.EarlyModuleContext.Config().(Config) | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) AConfig() Config { | 
|  | return e.config | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) DeviceConfig() DeviceConfig { | 
|  | return DeviceConfig{e.config.deviceConfig} | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) Platform() bool { | 
|  | return e.kind == platformModule | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) DeviceSpecific() bool { | 
|  | return e.kind == deviceSpecificModule | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) SocSpecific() bool { | 
|  | return e.kind == socSpecificModule | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) ProductSpecific() bool { | 
|  | return e.kind == productSpecificModule | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) SystemExtSpecific() bool { | 
|  | return e.kind == systemExtSpecificModule | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) Namespace() *Namespace { | 
|  | return e.EarlyModuleContext.Namespace().(*Namespace) | 
|  | } | 
|  |  | 
|  | func (e *earlyModuleContext) OtherModulePropertyErrorf(module Module, property string, fmt string, args ...interface{}) { | 
|  | e.EarlyModuleContext.OtherModulePropertyErrorf(module, property, fmt, args...) | 
|  | } |