blob: 0029d119f5a8a22321fdf3270c63bf659c716ccb [file] [log] [blame]
Jamie Gennis1bc967e2014-05-27 16:34:41 -07001package blueprint
2
3import (
4 "fmt"
5 "path/filepath"
6)
7
8type Module interface {
9 GenerateBuildActions(ModuleContext)
10}
11
12type ModuleContext interface {
13 ModuleName() string
Jamie Gennisd4c53d82014-06-22 17:02:55 -070014 OtherModuleName(m Module) string
Jamie Gennis1bc967e2014-05-27 16:34:41 -070015 ModuleDir() string
Jamie Gennis6eb4d242014-06-11 18:31:16 -070016 Config() interface{}
Jamie Gennis1bc967e2014-05-27 16:34:41 -070017
18 ModuleErrorf(fmt string, args ...interface{})
19 PropertyErrorf(property, fmt string, args ...interface{})
Jamie Gennisd4c53d82014-06-22 17:02:55 -070020 OtherModuleErrorf(m Module, fmt string, args ...interface{})
Jamie Gennis1bc967e2014-05-27 16:34:41 -070021
22 Variable(name, value string)
Jamie Genniscbc6f862014-06-05 20:00:22 -070023 Rule(name string, params RuleParams, argNames ...string) Rule
Jamie Gennis1bc967e2014-05-27 16:34:41 -070024 Build(params BuildParams)
25
26 VisitDepsDepthFirst(visit func(Module))
27 VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module))
Mathias Agopian5b8477d2014-06-25 17:21:54 -070028
29 AddNinjaFileDeps(deps ...string)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070030}
31
32var _ ModuleContext = (*moduleContext)(nil)
33
34type moduleContext struct {
35 context *Context
Jamie Gennis6eb4d242014-06-11 18:31:16 -070036 config interface{}
Jamie Gennis1bc967e2014-05-27 16:34:41 -070037 module Module
38 scope *localScope
39 info *moduleInfo
40
Mathias Agopian5b8477d2014-06-25 17:21:54 -070041 ninjaFileDeps []string
42 errs []error
Jamie Gennis1bc967e2014-05-27 16:34:41 -070043
44 actionDefs localBuildActions
45}
46
47func (m *moduleContext) ModuleName() string {
48 return m.info.properties.Name
49}
50
Jamie Gennisd4c53d82014-06-22 17:02:55 -070051func (m *moduleContext) OtherModuleName(module Module) string {
52 info := m.context.moduleInfo[module]
53 return info.properties.Name
54}
55
Jamie Gennis1bc967e2014-05-27 16:34:41 -070056func (m *moduleContext) ModuleDir() string {
Jamie Gennisec701282014-06-12 20:06:31 -070057 return filepath.Dir(m.info.relBlueprintsFile)
Jamie Gennis1bc967e2014-05-27 16:34:41 -070058}
59
Jamie Gennis6eb4d242014-06-11 18:31:16 -070060func (m *moduleContext) Config() interface{} {
Jamie Gennis1bc967e2014-05-27 16:34:41 -070061 return m.config
62}
63
64func (m *moduleContext) ModuleErrorf(format string, args ...interface{}) {
65 m.errs = append(m.errs, &Error{
66 Err: fmt.Errorf(format, args...),
67 Pos: m.info.pos,
68 })
69}
70
71func (m *moduleContext) PropertyErrorf(property, format string,
72 args ...interface{}) {
73
74 pos, ok := m.info.propertyPos[property]
75 if !ok {
76 panic(fmt.Errorf("property %q was not set for this module", property))
77 }
78
79 m.errs = append(m.errs, &Error{
80 Err: fmt.Errorf(format, args...),
81 Pos: pos,
82 })
83}
84
Jamie Gennisd4c53d82014-06-22 17:02:55 -070085func (m *moduleContext) OtherModuleErrorf(module Module, format string,
86 args ...interface{}) {
87
88 info := m.context.moduleInfo[module]
89 m.errs = append(m.errs, &Error{
90 Err: fmt.Errorf(format, args...),
91 Pos: info.pos,
92 })
93}
94
Jamie Gennis1bc967e2014-05-27 16:34:41 -070095func (m *moduleContext) Variable(name, value string) {
96 v, err := m.scope.AddLocalVariable(name, value)
97 if err != nil {
98 panic(err)
99 }
100
101 m.actionDefs.variables = append(m.actionDefs.variables, v)
102}
103
Jamie Genniscbc6f862014-06-05 20:00:22 -0700104func (m *moduleContext) Rule(name string, params RuleParams,
105 argNames ...string) Rule {
106
Jamie Genniscbc6f862014-06-05 20:00:22 -0700107 r, err := m.scope.AddLocalRule(name, &params, argNames...)
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700108 if err != nil {
109 panic(err)
110 }
111
112 m.actionDefs.rules = append(m.actionDefs.rules, r)
113
114 return r
115}
116
117func (m *moduleContext) Build(params BuildParams) {
Jamie Gennis1bc967e2014-05-27 16:34:41 -0700118 def, err := parseBuildParams(m.scope, &params)
119 if err != nil {
120 panic(err)
121 }
122
123 m.actionDefs.buildDefs = append(m.actionDefs.buildDefs, def)
124}
125
126func (m *moduleContext) VisitDepsDepthFirst(visit func(Module)) {
127 m.context.visitDepsDepthFirst(m.module, visit)
128}
129
130func (m *moduleContext) VisitDepsDepthFirstIf(pred func(Module) bool,
131 visit func(Module)) {
132
133 m.context.visitDepsDepthFirstIf(m.module, pred, visit)
134}
Mathias Agopian5b8477d2014-06-25 17:21:54 -0700135
136func (m *moduleContext) AddNinjaFileDeps(deps ...string) {
137 m.ninjaFileDeps = append(m.ninjaFileDeps, deps...)
138}