Merge pull request #63 from colincross/deprecate
Deprecate EarlyMutator and DynamicDependencies
diff --git a/context.go b/context.go
index 982cf72..ee9beb6 100644
--- a/context.go
+++ b/context.go
@@ -224,12 +224,16 @@
// RegisterSingletonFactory methods must be called before it can do anything
// useful.
func NewContext() *Context {
- return &Context{
+ ctx := &Context{
moduleFactories: make(map[string]ModuleFactory),
moduleGroups: make(map[string]*moduleGroup),
moduleInfo: make(map[Module]*moduleInfo),
moduleNinjaNames: make(map[string]*moduleGroup),
}
+
+ ctx.RegisterBottomUpMutator("blueprint_deps", blueprintDepsMutator)
+
+ return ctx
}
// A ModuleFactory function creates a new Module object. See the
@@ -402,6 +406,10 @@
//
// The mutator type names given here must be unique to all bottom up or early
// mutators in the Context.
+//
+// Deprecated, use a BottomUpMutator instead. The only difference between
+// EarlyMutator and BottomUpMutator is that EarlyMutator runs before the
+// deprecated DynamicDependencies.
func (c *Context) RegisterEarlyMutator(name string, mutator EarlyMutator) {
for _, m := range c.variantMutatorNames {
if m == name {
@@ -1057,27 +1065,8 @@
// modules defined in the parsed Blueprints files are valid. This means that
// the modules depended upon are defined and that no circular dependencies
// exist.
-//
-// The config argument is made available to all of the DynamicDependerModule
-// objects via the Config method on the DynamicDependerModuleContext objects
-// passed to their DynamicDependencies method.
func (c *Context) ResolveDependencies(config interface{}) []error {
- errs := c.runEarlyMutators(config)
- if len(errs) > 0 {
- return errs
- }
-
- errs = c.resolveDependencies(config)
- if len(errs) > 0 {
- return errs
- }
-
- errs = c.updateDependencies()
- if len(errs) > 0 {
- return errs
- }
-
- errs = c.runMutators(config)
+ errs := c.runMutators(config)
if len(errs) > 0 {
return errs
}
@@ -1086,74 +1075,24 @@
return nil
}
-// moduleDeps adds dependencies to a module. If the module implements the
+// Default dependencies handling. If the module implements the (deprecated)
// DynamicDependerModule interface then this set consists of the union of those
// module names listed in its "deps" property, those returned by its
// DynamicDependencies method, and those added by calling AddDependencies or
// AddVariationDependencies on DynamicDependencyModuleContext. Otherwise it
// is simply those names listed in its "deps" property.
-func (c *Context) moduleDeps(module *moduleInfo,
- config interface{}) (errs []error) {
+func blueprintDepsMutator(ctx BottomUpMutatorContext) {
+ ctx.AddDependency(ctx.Module(), ctx.moduleInfo().properties.Deps...)
- depNamesSet := make(map[string]bool)
- depNames := []string{}
+ if dynamicDepender, ok := ctx.Module().(DynamicDependerModule); ok {
+ dynamicDeps := dynamicDepender.DynamicDependencies(ctx)
- for _, depName := range module.properties.Deps {
- if !depNamesSet[depName] {
- depNamesSet[depName] = true
- depNames = append(depNames, depName)
+ if ctx.Failed() {
+ return
}
+
+ ctx.AddDependency(ctx.Module(), dynamicDeps...)
}
-
- dynamicDepender, ok := module.logicModule.(DynamicDependerModule)
- if ok {
- ddmctx := &dynamicDependerModuleContext{
- baseModuleContext: baseModuleContext{
- context: c,
- config: config,
- module: module,
- },
- module: module,
- }
-
- dynamicDeps := dynamicDepender.DynamicDependencies(ddmctx)
-
- if len(ddmctx.errs) > 0 {
- return ddmctx.errs
- }
-
- for _, depName := range dynamicDeps {
- if !depNamesSet[depName] {
- depNamesSet[depName] = true
- depNames = append(depNames, depName)
- }
- }
- }
-
- for _, depName := range depNames {
- newErrs := c.addDependency(module, depName)
- if len(newErrs) > 0 {
- errs = append(errs, newErrs...)
- }
- }
- return errs
-}
-
-// resolveDependencies populates the directDeps list for every module. In doing so it checks for
-// missing dependencies and self-dependant modules.
-func (c *Context) resolveDependencies(config interface{}) (errs []error) {
- for _, group := range c.moduleGroups {
- for _, module := range group.modules {
- module.directDeps = make([]*moduleInfo, 0, len(module.properties.Deps))
-
- newErrs := c.moduleDeps(module, config)
- if len(newErrs) > 0 {
- errs = append(errs, newErrs...)
- }
- }
- }
-
- return
}
// findMatchingVariant searches the moduleGroup for a module with the same variant as module,
@@ -1545,10 +1484,20 @@
}
}
+ errs = c.updateDependencies()
+ if len(errs) > 0 {
+ return errs
+ }
+
return nil
}
func (c *Context) runMutators(config interface{}) (errs []error) {
+ errs = c.runEarlyMutators(config)
+ if len(errs) > 0 {
+ return errs
+ }
+
for _, mutator := range c.mutatorInfo {
if mutator.topDownMutator != nil {
errs = c.runTopDownMutator(config, mutator.name, mutator.topDownMutator)
diff --git a/context_test.go b/context_test.go
index 8877be9..acf0c1c 100644
--- a/context_test.go
+++ b/context_test.go
@@ -92,7 +92,7 @@
t.FailNow()
}
- errs = ctx.resolveDependencies(nil)
+ errs = ctx.ResolveDependencies(nil)
if len(errs) > 0 {
t.Errorf("unexpected dep errors:")
for _, err := range errs {
@@ -100,16 +100,6 @@
}
t.FailNow()
}
-
- errs = ctx.updateDependencies()
- if len(errs) > 0 {
- t.Errorf("unexpected dep cycle errors:")
- for _, err := range errs {
- t.Errorf(" %s", err)
- }
- t.FailNow()
- }
-
}
// |---B===D - represents a non-walkable edge
diff --git a/module_ctx.go b/module_ctx.go
index 94db01e..7af26d2 100644
--- a/module_ctx.go
+++ b/module_ctx.go
@@ -34,10 +34,11 @@
//
// The Module implementation can access the build configuration as well as any
// modules on which on which it depends (as defined by the "deps" property
-// specified in the Blueprints file or dynamically added by implementing the
-// DynamicDependerModule interface) using the ModuleContext passed to
-// GenerateBuildActions. This ModuleContext is also used to create Ninja build
-// actions and to report errors to the user.
+// specified in the Blueprints file, dynamically added by implementing the
+// (deprecated) DynamicDependerModule interface, or dynamically added by a
+// BottomUpMutator) using the ModuleContext passed to GenerateBuildActions.
+// This ModuleContext is also used to create Ninja build actions and to report
+// errors to the user.
//
// In addition to implementing the GenerateBuildActions method, a Module should
// implement methods that provide dependant modules and singletons information
@@ -93,6 +94,8 @@
// appear in its "deps" property. Any Module that implements this interface
// will have its DynamicDependencies method called by the Context that created
// it during generate phase.
+//
+// Deprecated, use a BottomUpMutator instead
type DynamicDependerModule interface {
Module
@@ -114,14 +117,11 @@
ModuleErrorf(fmt string, args ...interface{})
PropertyErrorf(property, fmt string, args ...interface{})
Failed() bool
+
+ moduleInfo() *moduleInfo
}
-type DynamicDependerModuleContext interface {
- BaseModuleContext
-
- AddVariationDependencies([]Variation, ...string)
- AddFarVariationDependencies([]Variation, ...string)
-}
+type DynamicDependerModuleContext BottomUpMutatorContext
type ModuleContext interface {
BaseModuleContext
@@ -157,6 +157,10 @@
errs []error
}
+func (d *baseModuleContext) moduleInfo() *moduleInfo {
+ return d.module
+}
+
func (d *baseModuleContext) ModuleName() string {
return d.module.properties.Name
}
@@ -316,49 +320,6 @@
}
//
-// DynamicDependerModuleContext
-//
-
-type dynamicDependerModuleContext struct {
- baseModuleContext
-
- module *moduleInfo
-}
-
-// AddVariationDependencies adds deps as dependencies of the current module, but uses the variations
-// argument to select which variant of the dependency to use. A variant of the dependency must
-// exist that matches the all of the non-local variations of the current module, plus the variations
-// argument.
-func (mctx *dynamicDependerModuleContext) AddVariationDependencies(variations []Variation,
- deps ...string) {
-
- for _, dep := range deps {
- errs := mctx.context.addVariationDependency(mctx.module, variations, dep, false)
- if len(errs) > 0 {
- mctx.errs = append(mctx.errs, errs...)
- }
- }
-}
-
-// AddFarVariationDependencies adds deps as dependencies of the current module, but uses the
-// variations argument to select which variant of the dependency to use. A variant of the
-// dependency must exist that matches the variations argument, but may also have other variations.
-// For any unspecified variation the first variant will be used.
-//
-// Unlike AddVariationDependencies, the variations of the current module are ignored - the
-// depdendency only needs to match the supplied variations.
-func (mctx *dynamicDependerModuleContext) AddFarVariationDependencies(variations []Variation,
- deps ...string) {
-
- for _, dep := range deps {
- errs := mctx.context.addVariationDependency(mctx.module, variations, dep, true)
- if len(errs) > 0 {
- mctx.errs = append(mctx.errs, errs...)
- }
- }
-}
-
-//
// MutatorContext
//
@@ -393,11 +354,13 @@
type BottomUpMutatorContext interface {
baseMutatorContext
- AddDependency(module Module, name string)
+ AddDependency(module Module, name ...string)
AddReverseDependency(module Module, name string)
CreateVariations(...string) []Module
CreateLocalVariations(...string) []Module
SetDependencyVariation(string)
+ AddVariationDependencies([]Variation, ...string)
+ AddFarVariationDependencies([]Variation, ...string)
}
// A Mutator function is called for each Module, and can use
@@ -473,10 +436,12 @@
// Add a dependency to the given module.
// Does not affect the ordering of the current mutator pass, but will be ordered
// correctly for all future mutator passes.
-func (mctx *mutatorContext) AddDependency(module Module, depName string) {
- errs := mctx.context.addDependency(mctx.context.moduleInfo[module], depName)
- if len(errs) > 0 {
- mctx.errs = append(mctx.errs, errs...)
+func (mctx *mutatorContext) AddDependency(module Module, deps ...string) {
+ for _, dep := range deps {
+ errs := mctx.context.addDependency(mctx.context.moduleInfo[module], dep)
+ if len(errs) > 0 {
+ mctx.errs = append(mctx.errs, errs...)
+ }
}
}
@@ -484,12 +449,45 @@
// Does not affect the ordering of the current mutator pass, but will be ordered
// correctly for all future mutator passes.
func (mctx *mutatorContext) AddReverseDependency(module Module, destName string) {
- errs := mctx.context.addReverseDependency(mctx.context.moduleInfo[module], destName)
+ errs := mctx.context.addReverseDependency(mctx.module, destName)
if len(errs) > 0 {
mctx.errs = append(mctx.errs, errs...)
}
}
+// AddVariationDependencies adds deps as dependencies of the current module, but uses the variations
+// argument to select which variant of the dependency to use. A variant of the dependency must
+// exist that matches the all of the non-local variations of the current module, plus the variations
+// argument.
+func (mctx *mutatorContext) AddVariationDependencies(variations []Variation,
+ deps ...string) {
+
+ for _, dep := range deps {
+ errs := mctx.context.addVariationDependency(mctx.module, variations, dep, false)
+ if len(errs) > 0 {
+ mctx.errs = append(mctx.errs, errs...)
+ }
+ }
+}
+
+// AddFarVariationDependencies adds deps as dependencies of the current module, but uses the
+// variations argument to select which variant of the dependency to use. A variant of the
+// dependency must exist that matches the variations argument, but may also have other variations.
+// For any unspecified variation the first variant will be used.
+//
+// Unlike AddVariationDependencies, the variations of the current module are ignored - the
+// depdendency only needs to match the supplied variations.
+func (mctx *mutatorContext) AddFarVariationDependencies(variations []Variation,
+ deps ...string) {
+
+ for _, dep := range deps {
+ errs := mctx.context.addVariationDependency(mctx.module, variations, dep, true)
+ if len(errs) > 0 {
+ mctx.errs = append(mctx.errs, errs...)
+ }
+ }
+}
+
func (mctx *mutatorContext) VisitDirectDeps(visit func(Module)) {
mctx.context.visitDirectDeps(mctx.module, visit)
}