diff --git a/context.go b/context.go index 324d1eccff4f709e0f97802867067918df0462d6..23d92629f1bf58a0820864f411db2caff096c3fa 100644 --- a/context.go +++ b/context.go @@ -1147,7 +1147,7 @@ func (c *Context) cloneLogicModule(origModule *moduleInfo) (Module, []interface{ } func (c *Context) createVariations(origModule *moduleInfo, mutatorName string, - variationNames []string) ([]*moduleInfo, []error) { + defaultVariationName *string, variationNames []string) ([]*moduleInfo, []error) { if len(variationNames) == 0 { panic(fmt.Errorf("mutator %q passed zero-length variation list for module %q", @@ -1192,7 +1192,7 @@ func (c *Context) createVariations(origModule *moduleInfo, mutatorName string, newModules = append(newModules, newModule) - newErrs := c.convertDepsToVariation(newModule, mutatorName, variationName) + newErrs := c.convertDepsToVariation(newModule, mutatorName, variationName, defaultVariationName) if len(newErrs) > 0 { errs = append(errs, newErrs...) } @@ -1209,7 +1209,7 @@ func (c *Context) createVariations(origModule *moduleInfo, mutatorName string, } func (c *Context) convertDepsToVariation(module *moduleInfo, - mutatorName, variationName string) (errs []error) { + mutatorName, variationName string, defaultVariationName *string) (errs []error) { for i, dep := range module.directDeps { if dep.module.logicModule == nil { @@ -1220,6 +1220,15 @@ func (c *Context) convertDepsToVariation(module *moduleInfo, break } } + if newDep == nil && defaultVariationName != nil { + // give it a second chance; match with defaultVariationName + for _, m := range dep.module.splitModules { + if m.variant[mutatorName] == *defaultVariationName { + newDep = m + break + } + } + } if newDep == nil { errs = append(errs, &BlueprintError{ Err: fmt.Errorf("failed to find variation %q for module %q needed by %q", diff --git a/module_ctx.go b/module_ctx.go index d127c0e96e551c2a5606df067fc652bd3b0c4781..bdb14ad146883c2c90bf745e45a3fbd9b47f4d2d 100644 --- a/module_ctx.go +++ b/module_ctx.go @@ -555,12 +555,13 @@ func (m *moduleContext) GetMissingDependencies() []string { type mutatorContext struct { baseModuleContext - name string - reverseDeps []reverseDep - rename []rename - replace []replace - newVariations []*moduleInfo // new variants of existing modules - newModules []*moduleInfo // brand new modules + name string + reverseDeps []reverseDep + rename []rename + replace []replace + newVariations []*moduleInfo // new variants of existing modules + newModules []*moduleInfo // brand new modules + defaultVariation *string } type baseMutatorContext interface { @@ -607,7 +608,15 @@ type BottomUpMutatorContext interface { AddReverseDependency(module Module, tag DependencyTag, name string) CreateVariations(...string) []Module CreateLocalVariations(...string) []Module + + // SetDependencyVariation sets all dangling dependencies on the current module to point to the variation + // with given name. This function ignores the default variation set by SetDefaultDependencyVariation. SetDependencyVariation(string) + + // SetDefaultDependencyVariation sets the default variation when a dangling reference is detected + // during the subsequent calls on Create*Variations* functions. To reset, set it to nil. + SetDefaultDependencyVariation(*string) + AddVariationDependencies([]Variation, DependencyTag, ...string) AddFarVariationDependencies([]Variation, DependencyTag, ...string) AddInterVariantDependency(tag DependencyTag, from, to Module) @@ -671,7 +680,7 @@ func (mctx *mutatorContext) CreateLocalVariations(variationNames ...string) []Mo func (mctx *mutatorContext) createVariations(variationNames []string, local bool) []Module { ret := []Module{} - modules, errs := mctx.context.createVariations(mctx.module, mctx.name, variationNames) + modules, errs := mctx.context.createVariations(mctx.module, mctx.name, mctx.defaultVariation, variationNames) if len(errs) > 0 { mctx.errs = append(mctx.errs, errs...) } @@ -698,7 +707,11 @@ func (mctx *mutatorContext) createVariations(variationNames []string, local bool // Set all dangling dependencies on the current module to point to the variation // with given name. func (mctx *mutatorContext) SetDependencyVariation(variationName string) { - mctx.context.convertDepsToVariation(mctx.module, mctx.name, variationName) + mctx.context.convertDepsToVariation(mctx.module, mctx.name, variationName, nil) +} + +func (mctx *mutatorContext) SetDefaultDependencyVariation(variationName *string) { + mctx.defaultVariation = variationName } func (mctx *mutatorContext) Module() Module {