1// Copyright 2015 Google Inc. All rights reserved. 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15package android 16 17import ( 18 "android/soong/bazel" 19 "fmt" 20 "reflect" 21 "strings" 22 23 "github.com/google/blueprint" 24 "github.com/google/blueprint/proptools" 25) 26 27// Phases: 28// run Pre-arch mutators 29// run archMutator 30// run Pre-deps mutators 31// run depsMutator 32// run PostDeps mutators 33// run FinalDeps mutators (CreateVariations disallowed in this phase) 34// continue on to GenerateAndroidBuildActions 35 36// RegisterMutatorsForBazelConversion is a alternate registration pipeline for bp2build. Exported for testing. 37func RegisterMutatorsForBazelConversion(ctx *Context, preArchMutators, depsMutators, bp2buildMutators []RegisterMutatorFunc) { 38 mctx := ®isterMutatorsContext{ 39 bazelConversionMode: true, 40 } 41 42 bp2buildPreArchMutators = append([]RegisterMutatorFunc{ 43 RegisterNamespaceMutator, 44 RegisterDefaultsPreArchMutators, 45 // TODO(b/165114590): this is required to resolve deps that are only prebuilts, but we should 46 // evaluate the impact on conversion. 47 RegisterPrebuiltsPreArchMutators, 48 }, 49 preArchMutators...) 50 51 for _, f := range bp2buildPreArchMutators { 52 f(mctx) 53 } 54 55 bp2buildDepsMutators = append([]RegisterMutatorFunc{ 56 registerDepsMutatorBp2Build, 57 registerPathDepsMutator, 58 registerBp2buildArchPathDepsMutator, 59 }, depsMutators...) 60 61 for _, f := range bp2buildDepsMutators { 62 f(mctx) 63 } 64 65 // Register bp2build mutators 66 for _, f := range bp2buildMutators { 67 f(mctx) 68 } 69 70 mctx.mutators.registerAll(ctx) 71} 72 73// collateGloballyRegisteredMutators constructs the list of mutators that have been registered 74// with the InitRegistrationContext and will be used at runtime. 75func collateGloballyRegisteredMutators() sortableComponents { 76 return collateRegisteredMutators(preArch, preDeps, postDeps, finalDeps) 77} 78 79// collateRegisteredMutators constructs a single list of mutators from the separate lists. 80func collateRegisteredMutators(preArch, preDeps, postDeps, finalDeps []RegisterMutatorFunc) sortableComponents { 81 mctx := ®isterMutatorsContext{} 82 83 register := func(funcs []RegisterMutatorFunc) { 84 for _, f := range funcs { 85 f(mctx) 86 } 87 } 88 89 register(preArch) 90 91 register(preDeps) 92 93 register([]RegisterMutatorFunc{registerDepsMutator}) 94 95 register(postDeps) 96 97 mctx.finalPhase = true 98 register(finalDeps) 99 100 return mctx.mutators 101} 102 103type registerMutatorsContext struct { 104 mutators sortableComponents 105 finalPhase bool 106 bazelConversionMode bool 107} 108 109type RegisterMutatorsContext interface { 110 TopDown(name string, m TopDownMutator) MutatorHandle 111 BottomUp(name string, m BottomUpMutator) MutatorHandle 112 BottomUpBlueprint(name string, m blueprint.BottomUpMutator) MutatorHandle 113} 114 115type RegisterMutatorFunc func(RegisterMutatorsContext) 116 117var preArch = []RegisterMutatorFunc{ 118 RegisterNamespaceMutator, 119 120 // Check the visibility rules are valid. 121 // 122 // This must run after the package renamer mutators so that any issues found during 123 // validation of the package's default_visibility property are reported using the 124 // correct package name and not the synthetic name. 125 // 126 // This must also be run before defaults mutators as the rules for validation are 127 // different before checking the rules than they are afterwards. e.g. 128 // visibility: ["//visibility:private", "//visibility:public"] 129 // would be invalid if specified in a module definition but is valid if it results 130 // from something like this: 131 // 132 // defaults { 133 // name: "defaults", 134 // // Be inaccessible outside a package by default. 135 // visibility: ["//visibility:private"] 136 // } 137 // 138 // defaultable_module { 139 // name: "defaultable_module", 140 // defaults: ["defaults"], 141 // // Override the default. 142 // visibility: ["//visibility:public"] 143 // } 144 // 145 RegisterVisibilityRuleChecker, 146 147 // Record the default_applicable_licenses for each package. 148 // 149 // This must run before the defaults so that defaults modules can pick up the package default. 150 RegisterLicensesPackageMapper, 151 152 // Apply properties from defaults modules to the referencing modules. 153 // 154 // Any mutators that are added before this will not see any modules created by 155 // a DefaultableHook. 156 RegisterDefaultsPreArchMutators, 157 158 // Add dependencies on any components so that any component references can be 159 // resolved within the deps mutator. 160 // 161 // Must be run after defaults so it can be used to create dependencies on the 162 // component modules that are creating in a DefaultableHook. 163 // 164 // Must be run before RegisterPrebuiltsPreArchMutators, i.e. before prebuilts are 165 // renamed. That is so that if a module creates components using a prebuilt module 166 // type that any dependencies (which must use prebuilt_ prefixes) are resolved to 167 // the prebuilt module and not the source module. 168 RegisterComponentsMutator, 169 170 // Create an association between prebuilt modules and their corresponding source 171 // modules (if any). 172 // 173 // Must be run after defaults mutators to ensure that any modules created by 174 // a DefaultableHook can be either a prebuilt or a source module with a matching 175 // prebuilt. 176 RegisterPrebuiltsPreArchMutators, 177 178 // Gather the licenses properties for all modules for use during expansion and enforcement. 179 // 180 // This must come after the defaults mutators to ensure that any licenses supplied 181 // in a defaults module has been successfully applied before the rules are gathered. 182 RegisterLicensesPropertyGatherer, 183 184 // Gather the visibility rules for all modules for us during visibility enforcement. 185 // 186 // This must come after the defaults mutators to ensure that any visibility supplied 187 // in a defaults module has been successfully applied before the rules are gathered. 188 RegisterVisibilityRuleGatherer, 189} 190 191func registerArchMutator(ctx RegisterMutatorsContext) { 192 ctx.BottomUpBlueprint("os", osMutator).Parallel() 193 ctx.BottomUp("image", imageMutator).Parallel() 194 ctx.BottomUpBlueprint("arch", archMutator).Parallel() 195} 196 197var preDeps = []RegisterMutatorFunc{ 198 registerArchMutator, 199} 200 201var postDeps = []RegisterMutatorFunc{ 202 registerPathDepsMutator, 203 RegisterPrebuiltsPostDepsMutators, 204 RegisterVisibilityRuleEnforcer, 205 RegisterLicensesDependencyChecker, 206 registerNeverallowMutator, 207 RegisterOverridePostDepsMutators, 208} 209 210var finalDeps = []RegisterMutatorFunc{} 211 212func PreArchMutators(f RegisterMutatorFunc) { 213 preArch = append(preArch, f) 214} 215 216func PreDepsMutators(f RegisterMutatorFunc) { 217 preDeps = append(preDeps, f) 218} 219 220func PostDepsMutators(f RegisterMutatorFunc) { 221 postDeps = append(postDeps, f) 222} 223 224func FinalDepsMutators(f RegisterMutatorFunc) { 225 finalDeps = append(finalDeps, f) 226} 227 228var bp2buildPreArchMutators = []RegisterMutatorFunc{} 229var bp2buildDepsMutators = []RegisterMutatorFunc{} 230var bp2buildMutators = map[string]RegisterMutatorFunc{} 231 232// RegisterBp2BuildMutator registers specially crafted mutators for 233// converting Blueprint/Android modules into special modules that can 234// be code-generated into Bazel BUILD targets. 235// 236// TODO(b/178068862): bring this into TestContext. 237func RegisterBp2BuildMutator(moduleType string, m func(TopDownMutatorContext)) { 238 f := func(ctx RegisterMutatorsContext) { 239 ctx.TopDown(moduleType, m) 240 } 241 bp2buildMutators[moduleType] = f 242} 243 244// PreArchBp2BuildMutators adds mutators to be register for converting Android Blueprint modules 245// into Bazel BUILD targets that should run prior to deps and conversion. 246func PreArchBp2BuildMutators(f RegisterMutatorFunc) { 247 bp2buildPreArchMutators = append(bp2buildPreArchMutators, f) 248} 249 250// DepsBp2BuildMutators adds mutators to be register for converting Android Blueprint modules into 251// Bazel BUILD targets that should run prior to conversion to resolve dependencies. 252func DepsBp2BuildMutators(f RegisterMutatorFunc) { 253 bp2buildDepsMutators = append(bp2buildDepsMutators, f) 254} 255 256type BaseMutatorContext interface { 257 BaseModuleContext 258 259 // MutatorName returns the name that this mutator was registered with. 260 MutatorName() string 261 262 // Rename all variants of a module. The new name is not visible to calls to ModuleName, 263 // AddDependency or OtherModuleName until after this mutator pass is complete. 264 Rename(name string) 265} 266 267type TopDownMutator func(TopDownMutatorContext) 268 269type TopDownMutatorContext interface { 270 BaseMutatorContext 271 272 // CreateModule creates a new module by calling the factory method for the specified moduleType, and applies 273 // the specified property structs to it as if the properties were set in a blueprint file. 274 CreateModule(ModuleFactory, ...interface{}) Module 275 276 // CreateBazelTargetModule creates a BazelTargetModule by calling the 277 // factory method, just like in CreateModule, but also requires 278 // BazelTargetModuleProperties containing additional metadata for the 279 // bp2build codegenerator. 280 CreateBazelTargetModule(ModuleFactory, string, bazel.BazelTargetModuleProperties, interface{}) BazelTargetModule 281} 282 283type topDownMutatorContext struct { 284 bp blueprint.TopDownMutatorContext 285 baseModuleContext 286} 287 288type BottomUpMutator func(BottomUpMutatorContext) 289 290type BottomUpMutatorContext interface { 291 BaseMutatorContext 292 293 // AddDependency adds a dependency to the given module. It returns a slice of modules for each 294 // dependency (some entries may be nil). 295 // 296 // If the mutator is parallel (see MutatorHandle.Parallel), this method will pause until the 297 // new dependencies have had the current mutator called on them. If the mutator is not 298 // parallel this method does not affect the ordering of the current mutator pass, but will 299 // be ordered correctly for all future mutator passes. 300 AddDependency(module blueprint.Module, tag blueprint.DependencyTag, name ...string) []blueprint.Module 301 302 // AddReverseDependency adds a dependency from the destination to the given module. 303 // Does not affect the ordering of the current mutator pass, but will be ordered 304 // correctly for all future mutator passes. All reverse dependencies for a destination module are 305 // collected until the end of the mutator pass, sorted by name, and then appended to the destination 306 // module's dependency list. 307 AddReverseDependency(module blueprint.Module, tag blueprint.DependencyTag, name string) 308 309 // CreateVariations splits a module into multiple variants, one for each name in the variationNames 310 // parameter. It returns a list of new modules in the same order as the variationNames 311 // list. 312 // 313 // If any of the dependencies of the module being operated on were already split 314 // by calling CreateVariations with the same name, the dependency will automatically 315 // be updated to point the matching variant. 316 // 317 // If a module is split, and then a module depending on the first module is not split 318 // when the Mutator is later called on it, the dependency of the depending module will 319 // automatically be updated to point to the first variant. 320 CreateVariations(...string) []Module 321 322 // CreateLocationVariations splits a module into multiple variants, one for each name in the variantNames 323 // parameter. It returns a list of new modules in the same order as the variantNames 324 // list. 325 // 326 // Local variations do not affect automatic dependency resolution - dependencies added 327 // to the split module via deps or DynamicDependerModule must exactly match a variant 328 // that contains all the non-local variations. 329 CreateLocalVariations(...string) []Module 330 331 // SetDependencyVariation sets all dangling dependencies on the current module to point to the variation 332 // with given name. This function ignores the default variation set by SetDefaultDependencyVariation. 333 SetDependencyVariation(string) 334 335 // SetDefaultDependencyVariation sets the default variation when a dangling reference is detected 336 // during the subsequent calls on Create*Variations* functions. To reset, set it to nil. 337 SetDefaultDependencyVariation(*string) 338 339 // AddVariationDependencies adds deps as dependencies of the current module, but uses the variations 340 // argument to select which variant of the dependency to use. It returns a slice of modules for 341 // each dependency (some entries may be nil). A variant of the dependency must exist that matches 342 // the all of the non-local variations of the current module, plus the variations argument. 343 // 344 // If the mutator is parallel (see MutatorHandle.Parallel), this method will pause until the 345 // new dependencies have had the current mutator called on them. If the mutator is not 346 // parallel this method does not affect the ordering of the current mutator pass, but will 347 // be ordered correctly for all future mutator passes. 348 AddVariationDependencies([]blueprint.Variation, blueprint.DependencyTag, ...string) []blueprint.Module 349 350 // AddFarVariationDependencies adds deps as dependencies of the current module, but uses the 351 // variations argument to select which variant of the dependency to use. It returns a slice of 352 // modules for each dependency (some entries may be nil). A variant of the dependency must 353 // exist that matches the variations argument, but may also have other variations. 354 // For any unspecified variation the first variant will be used. 355 // 356 // Unlike AddVariationDependencies, the variations of the current module are ignored - the 357 // dependency only needs to match the supplied variations. 358 // 359 // If the mutator is parallel (see MutatorHandle.Parallel), this method will pause until the 360 // new dependencies have had the current mutator called on them. If the mutator is not 361 // parallel this method does not affect the ordering of the current mutator pass, but will 362 // be ordered correctly for all future mutator passes. 363 AddFarVariationDependencies([]blueprint.Variation, blueprint.DependencyTag, ...string) []blueprint.Module 364 365 // AddInterVariantDependency adds a dependency between two variants of the same module. Variants are always 366 // ordered in the same orderas they were listed in CreateVariations, and AddInterVariantDependency does not change 367 // that ordering, but it associates a DependencyTag with the dependency and makes it visible to VisitDirectDeps, 368 // WalkDeps, etc. 369 AddInterVariantDependency(tag blueprint.DependencyTag, from, to blueprint.Module) 370 371 // ReplaceDependencies replaces all dependencies on the identical variant of the module with the 372 // specified name with the current variant of this module. Replacements don't take effect until 373 // after the mutator pass is finished. 374 ReplaceDependencies(string) 375 376 // ReplaceDependencies replaces all dependencies on the identical variant of the module with the 377 // specified name with the current variant of this module as long as the supplied predicate returns 378 // true. 379 // 380 // Replacements don't take effect until after the mutator pass is finished. 381 ReplaceDependenciesIf(string, blueprint.ReplaceDependencyPredicate) 382 383 // AliasVariation takes a variationName that was passed to CreateVariations for this module, 384 // and creates an alias from the current variant (before the mutator has run) to the new 385 // variant. The alias will be valid until the next time a mutator calls CreateVariations or 386 // CreateLocalVariations on this module without also calling AliasVariation. The alias can 387 // be used to add dependencies on the newly created variant using the variant map from 388 // before CreateVariations was run. 389 AliasVariation(variationName string) 390 391 // CreateAliasVariation takes a toVariationName that was passed to CreateVariations for this 392 // module, and creates an alias from a new fromVariationName variant the toVariationName 393 // variant. The alias will be valid until the next time a mutator calls CreateVariations or 394 // CreateLocalVariations on this module without also calling AliasVariation. The alias can 395 // be used to add dependencies on the toVariationName variant using the fromVariationName 396 // variant. 397 CreateAliasVariation(fromVariationName, toVariationName string) 398 399 // SetVariationProvider sets the value for a provider for the given newly created variant of 400 // the current module, i.e. one of the Modules returned by CreateVariations.. It panics if 401 // not called during the appropriate mutator or GenerateBuildActions pass for the provider, 402 // if the value is not of the appropriate type, or if the module is not a newly created 403 // variant of the current module. The value should not be modified after being passed to 404 // SetVariationProvider. 405 SetVariationProvider(module blueprint.Module, provider blueprint.ProviderKey, value interface{}) 406 407 // BazelConversionMode returns whether this mutator is being run as part of Bazel Conversion. 408 BazelConversionMode() bool 409} 410 411type bottomUpMutatorContext struct { 412 bp blueprint.BottomUpMutatorContext 413 baseModuleContext 414 finalPhase bool 415 bazelConversionMode bool 416} 417 418func bottomUpMutatorContextFactory(ctx blueprint.BottomUpMutatorContext, a Module, 419 finalPhase, bazelConversionMode bool) BottomUpMutatorContext { 420 421 return &bottomUpMutatorContext{ 422 bp: ctx, 423 baseModuleContext: a.base().baseModuleContextFactory(ctx), 424 finalPhase: finalPhase, 425 bazelConversionMode: bazelConversionMode, 426 } 427} 428 429func (x *registerMutatorsContext) BottomUp(name string, m BottomUpMutator) MutatorHandle { 430 finalPhase := x.finalPhase 431 bazelConversionMode := x.bazelConversionMode 432 f := func(ctx blueprint.BottomUpMutatorContext) { 433 if a, ok := ctx.Module().(Module); ok { 434 m(bottomUpMutatorContextFactory(ctx, a, finalPhase, bazelConversionMode)) 435 } 436 } 437 mutator := &mutator{name: x.mutatorName(name), bottomUpMutator: f} 438 x.mutators = append(x.mutators, mutator) 439 return mutator 440} 441 442func (x *registerMutatorsContext) BottomUpBlueprint(name string, m blueprint.BottomUpMutator) MutatorHandle { 443 mutator := &mutator{name: name, bottomUpMutator: m} 444 x.mutators = append(x.mutators, mutator) 445 return mutator 446} 447 448func (x *registerMutatorsContext) mutatorName(name string) string { 449 if x.bazelConversionMode { 450 return name + "_bp2build" 451 } 452 return name 453} 454 455func (x *registerMutatorsContext) TopDown(name string, m TopDownMutator) MutatorHandle { 456 f := func(ctx blueprint.TopDownMutatorContext) { 457 if a, ok := ctx.Module().(Module); ok { 458 actx := &topDownMutatorContext{ 459 bp: ctx, 460 baseModuleContext: a.base().baseModuleContextFactory(ctx), 461 } 462 m(actx) 463 } 464 } 465 mutator := &mutator{name: x.mutatorName(name), topDownMutator: f} 466 x.mutators = append(x.mutators, mutator) 467 return mutator 468} 469 470func (mutator *mutator) componentName() string { 471 return mutator.name 472} 473 474func (mutator *mutator) register(ctx *Context) { 475 blueprintCtx := ctx.Context 476 var handle blueprint.MutatorHandle 477 if mutator.bottomUpMutator != nil { 478 handle = blueprintCtx.RegisterBottomUpMutator(mutator.name, mutator.bottomUpMutator) 479 } else if mutator.topDownMutator != nil { 480 handle = blueprintCtx.RegisterTopDownMutator(mutator.name, mutator.topDownMutator) 481 } 482 if mutator.parallel { 483 handle.Parallel() 484 } 485} 486 487type MutatorHandle interface { 488 Parallel() MutatorHandle 489} 490 491func (mutator *mutator) Parallel() MutatorHandle { 492 mutator.parallel = true 493 return mutator 494} 495 496func RegisterComponentsMutator(ctx RegisterMutatorsContext) { 497 ctx.BottomUp("component-deps", componentDepsMutator).Parallel() 498} 499 500// A special mutator that runs just prior to the deps mutator to allow the dependencies 501// on component modules to be added so that they can depend directly on a prebuilt 502// module. 503func componentDepsMutator(ctx BottomUpMutatorContext) { 504 if m := ctx.Module(); m.Enabled() { 505 m.ComponentDepsMutator(ctx) 506 } 507} 508 509func depsMutator(ctx BottomUpMutatorContext) { 510 if m := ctx.Module(); m.Enabled() { 511 m.DepsMutator(ctx) 512 } 513} 514 515func registerDepsMutator(ctx RegisterMutatorsContext) { 516 ctx.BottomUp("deps", depsMutator).Parallel() 517} 518 519func registerDepsMutatorBp2Build(ctx RegisterMutatorsContext) { 520 // TODO(b/179313531): Consider a separate mutator that only runs depsMutator for modules that are 521 // being converted to build targets. 522 ctx.BottomUp("deps", depsMutator).Parallel() 523} 524 525func (t *topDownMutatorContext) CreateBazelTargetModule( 526 factory ModuleFactory, 527 name string, 528 bazelProps bazel.BazelTargetModuleProperties, 529 attrs interface{}) BazelTargetModule { 530 if strings.HasPrefix(name, bazel.BazelTargetModuleNamePrefix) { 531 panic(fmt.Errorf( 532 "The %s name prefix is added automatically, do not set it manually: %s", 533 bazel.BazelTargetModuleNamePrefix, 534 name)) 535 } 536 name = bazel.BazelTargetModuleNamePrefix + name 537 nameProp := struct { 538 Name *string 539 }{ 540 Name: &name, 541 } 542 543 b := t.createModuleWithoutInheritance(factory, &nameProp, attrs).(BazelTargetModule) 544 b.SetBazelTargetModuleProperties(bazelProps) 545 return b 546} 547 548func (t *topDownMutatorContext) AppendProperties(props ...interface{}) { 549 for _, p := range props { 550 err := proptools.AppendMatchingProperties(t.Module().base().customizableProperties, 551 p, nil) 552 if err != nil { 553 if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok { 554 t.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error()) 555 } else { 556 panic(err) 557 } 558 } 559 } 560} 561 562func (t *topDownMutatorContext) PrependProperties(props ...interface{}) { 563 for _, p := range props { 564 err := proptools.PrependMatchingProperties(t.Module().base().customizableProperties, 565 p, nil) 566 if err != nil { 567 if propertyErr, ok := err.(*proptools.ExtendPropertyError); ok { 568 t.PropertyErrorf(propertyErr.Property, "%s", propertyErr.Err.Error()) 569 } else { 570 panic(err) 571 } 572 } 573 } 574} 575 576// android.topDownMutatorContext either has to embed blueprint.TopDownMutatorContext, in which case every method that 577// has an overridden version in android.BaseModuleContext has to be manually forwarded to BaseModuleContext to avoid 578// ambiguous method errors, or it has to store a blueprint.TopDownMutatorContext non-embedded, in which case every 579// non-overridden method has to be forwarded. There are fewer non-overridden methods, so use the latter. The following 580// methods forward to the identical blueprint versions for topDownMutatorContext and bottomUpMutatorContext. 581 582func (t *topDownMutatorContext) MutatorName() string { 583 return t.bp.MutatorName() 584} 585 586func (t *topDownMutatorContext) Rename(name string) { 587 t.bp.Rename(name) 588 t.Module().base().commonProperties.DebugName = name 589} 590 591func (t *topDownMutatorContext) CreateModule(factory ModuleFactory, props ...interface{}) Module { 592 inherited := []interface{}{&t.Module().base().commonProperties} 593 module := t.bp.CreateModule(ModuleFactoryAdaptor(factory), append(inherited, props...)...).(Module) 594 595 if t.Module().base().variableProperties != nil && module.base().variableProperties != nil { 596 src := t.Module().base().variableProperties 597 dst := []interface{}{ 598 module.base().variableProperties, 599 // Put an empty copy of the src properties into dst so that properties in src that are not in dst 600 // don't cause a "failed to find property to extend" error. 601 proptools.CloneEmptyProperties(reflect.ValueOf(src)).Interface(), 602 } 603 err := proptools.AppendMatchingProperties(dst, src, nil) 604 if err != nil { 605 panic(err) 606 } 607 } 608 609 return module 610} 611 612func (t *topDownMutatorContext) createModuleWithoutInheritance(factory ModuleFactory, props ...interface{}) Module { 613 module := t.bp.CreateModule(ModuleFactoryAdaptor(factory), props...).(Module) 614 return module 615} 616 617func (b *bottomUpMutatorContext) MutatorName() string { 618 return b.bp.MutatorName() 619} 620 621func (b *bottomUpMutatorContext) Rename(name string) { 622 b.bp.Rename(name) 623 b.Module().base().commonProperties.DebugName = name 624} 625 626func (b *bottomUpMutatorContext) AddDependency(module blueprint.Module, tag blueprint.DependencyTag, name ...string) []blueprint.Module { 627 return b.bp.AddDependency(module, tag, name...) 628} 629 630func (b *bottomUpMutatorContext) AddReverseDependency(module blueprint.Module, tag blueprint.DependencyTag, name string) { 631 b.bp.AddReverseDependency(module, tag, name) 632} 633 634func (b *bottomUpMutatorContext) CreateVariations(variations ...string) []Module { 635 if b.finalPhase { 636 panic("CreateVariations not allowed in FinalDepsMutators") 637 } 638 639 modules := b.bp.CreateVariations(variations...) 640 641 aModules := make([]Module, len(modules)) 642 for i := range variations { 643 aModules[i] = modules[i].(Module) 644 base := aModules[i].base() 645 base.commonProperties.DebugMutators = append(base.commonProperties.DebugMutators, b.MutatorName()) 646 base.commonProperties.DebugVariations = append(base.commonProperties.DebugVariations, variations[i]) 647 } 648 649 return aModules 650} 651 652func (b *bottomUpMutatorContext) CreateLocalVariations(variations ...string) []Module { 653 if b.finalPhase { 654 panic("CreateLocalVariations not allowed in FinalDepsMutators") 655 } 656 657 modules := b.bp.CreateLocalVariations(variations...) 658 659 aModules := make([]Module, len(modules)) 660 for i := range variations { 661 aModules[i] = modules[i].(Module) 662 base := aModules[i].base() 663 base.commonProperties.DebugMutators = append(base.commonProperties.DebugMutators, b.MutatorName()) 664 base.commonProperties.DebugVariations = append(base.commonProperties.DebugVariations, variations[i]) 665 } 666 667 return aModules 668} 669 670func (b *bottomUpMutatorContext) SetDependencyVariation(variation string) { 671 b.bp.SetDependencyVariation(variation) 672} 673 674func (b *bottomUpMutatorContext) SetDefaultDependencyVariation(variation *string) { 675 b.bp.SetDefaultDependencyVariation(variation) 676} 677 678func (b *bottomUpMutatorContext) AddVariationDependencies(variations []blueprint.Variation, tag blueprint.DependencyTag, 679 names ...string) []blueprint.Module { 680 if b.bazelConversionMode { 681 _, noSelfDeps := RemoveFromList(b.ModuleName(), names) 682 if len(noSelfDeps) == 0 { 683 return []blueprint.Module(nil) 684 } 685 // In Bazel conversion mode, mutators should not have created any variants. So, when adding a 686 // dependency, the variations would not exist and the dependency could not be added, by 687 // specifying no variations, we will allow adding the dependency to succeed. 688 return b.bp.AddFarVariationDependencies(nil, tag, noSelfDeps...) 689 } 690 691 return b.bp.AddVariationDependencies(variations, tag, names...) 692} 693 694func (b *bottomUpMutatorContext) AddFarVariationDependencies(variations []blueprint.Variation, 695 tag blueprint.DependencyTag, names ...string) []blueprint.Module { 696 if b.bazelConversionMode { 697 // In Bazel conversion mode, mutators should not have created any variants. So, when adding a 698 // dependency, the variations would not exist and the dependency could not be added, by 699 // specifying no variations, we will allow adding the dependency to succeed. 700 return b.bp.AddFarVariationDependencies(nil, tag, names...) 701 } 702 703 return b.bp.AddFarVariationDependencies(variations, tag, names...) 704} 705 706func (b *bottomUpMutatorContext) AddInterVariantDependency(tag blueprint.DependencyTag, from, to blueprint.Module) { 707 b.bp.AddInterVariantDependency(tag, from, to) 708} 709 710func (b *bottomUpMutatorContext) ReplaceDependencies(name string) { 711 b.bp.ReplaceDependencies(name) 712} 713 714func (b *bottomUpMutatorContext) ReplaceDependenciesIf(name string, predicate blueprint.ReplaceDependencyPredicate) { 715 b.bp.ReplaceDependenciesIf(name, predicate) 716} 717 718func (b *bottomUpMutatorContext) AliasVariation(variationName string) { 719 b.bp.AliasVariation(variationName) 720} 721 722func (b *bottomUpMutatorContext) CreateAliasVariation(fromVariationName, toVariationName string) { 723 b.bp.CreateAliasVariation(fromVariationName, toVariationName) 724} 725 726func (b *bottomUpMutatorContext) SetVariationProvider(module blueprint.Module, provider blueprint.ProviderKey, value interface{}) { 727 b.bp.SetVariationProvider(module, provider, value) 728} 729 730func (b *bottomUpMutatorContext) BazelConversionMode() bool { 731 return b.bazelConversionMode 732} 733