diff options
author | 2024-12-20 16:32:37 -0800 | |
---|---|---|
committer | 2025-02-07 16:00:56 -0800 | |
commit | d8d8b85c5666b3ded986f1b5c64df31dea5076ee (patch) | |
tree | f088754b04d70b6a28f3c727b58c370c989cfadc | |
parent | 22558312b9c07ddda22fcd00d6a84aa0f73f4d10 (diff) |
Move prebuilt mutators earlier
Move the prebuilt mutators from postdeps to predeps mutators. This
ensures that the decisions on whether the source or prebuilt will
be used can be made earlier, which simplifies the apex and dexpreopt
code, allowing it to directly depend on the correct module.
This requires some mutators that previously ran before the prebuilt
mutator and now run after the prebuilt mutator be aware of prebuilts.
In particular, the cc.linkageTransitionMutator and
rust.libraryTransitionMutator now have to manually disable prebuilts
when they don't produce a static or shared variant that the source
module produces, and some mutators have to ignore PrebuiltDepTag
dependencies when propagating transitions.
The apexTransitionMutator also needs to temporarily use an interface
on the dependency tag to correctly resolve some dependencies that
exist before the apex variation is created onto the correct variation.
This will shortly be replaced with depending on the apex itself instead,
and then walking the dependencies of the apex to find the necessary
module.
Bug: 372543712
Test: go test ./...
Change-Id: If125ea981be87673bae3bd0a7e3b2c16c337e8f7
-rw-r--r-- | android/apex_contributions.go | 35 | ||||
-rw-r--r-- | android/mutator.go | 1 | ||||
-rw-r--r-- | android/prebuilt.go | 12 | ||||
-rw-r--r-- | android/visibility.go | 2 | ||||
-rw-r--r-- | apex/apex.go | 10 | ||||
-rw-r--r-- | apex/apex_test.go | 2 | ||||
-rw-r--r-- | apex/platform_bootclasspath_test.go | 7 | ||||
-rw-r--r-- | cc/library.go | 8 | ||||
-rw-r--r-- | java/bootclasspath.go | 116 | ||||
-rw-r--r-- | java/bootclasspath_fragment.go | 24 | ||||
-rw-r--r-- | java/dexpreopt_bootjars.go | 105 | ||||
-rw-r--r-- | java/platform_bootclasspath.go | 62 | ||||
-rw-r--r-- | java/testing.go | 1 | ||||
-rw-r--r-- | rust/library.go | 12 | ||||
-rw-r--r-- | rust/prebuilt.go | 2 | ||||
-rw-r--r-- | sdk/bootclasspath_fragment_sdk_test.go | 1 | ||||
-rw-r--r-- | sdk/cc_sdk_test.go | 2 |
17 files changed, 192 insertions, 210 deletions
diff --git a/android/apex_contributions.go b/android/apex_contributions.go index ce3427840..fe7a8352e 100644 --- a/android/apex_contributions.go +++ b/android/apex_contributions.go @@ -104,19 +104,8 @@ var ( AcDepTag = apexContributionsDepTag{} ) -// Creates a dep to each selected apex_contributions -func (a *allApexContributions) DepsMutator(ctx BottomUpMutatorContext) { - // Skip apex_contributions if BuildApexContributionContents is true - // This product config var allows some products in the same family to use mainline modules from source - // (e.g. shiba and shiba_fullmte) - // Eventually these product variants will have their own release config maps. - if !proptools.Bool(ctx.Config().BuildIgnoreApexContributionContents()) { - ctx.AddDependency(ctx.Module(), AcDepTag, ctx.Config().AllApexContributions()...) - } -} - // Set PrebuiltSelectionInfoProvider in post deps phase -func (a *allApexContributions) SetPrebuiltSelectionInfoProvider(ctx BaseModuleContext) { +func (a *allApexContributions) SetPrebuiltSelectionInfoProvider(ctx BottomUpMutatorContext) { addContentsToProvider := func(p *PrebuiltSelectionInfoMap, m *apexContributions) { for _, content := range m.Contents() { // Verify that the module listed in contents exists in the tree @@ -135,13 +124,23 @@ func (a *allApexContributions) SetPrebuiltSelectionInfoProvider(ctx BaseModuleCo } p := PrebuiltSelectionInfoMap{} - ctx.VisitDirectDepsWithTag(AcDepTag, func(child Module) { - if m, ok := child.(*apexContributions); ok { - addContentsToProvider(&p, m) - } else { - ctx.ModuleErrorf("%s is not an apex_contributions module\n", child.Name()) + // Skip apex_contributions if BuildApexContributionContents is true + // This product config var allows some products in the same family to use mainline modules from source + // (e.g. shiba and shiba_fullmte) + // Eventually these product variants will have their own release config maps. + if !proptools.Bool(ctx.Config().BuildIgnoreApexContributionContents()) { + deps := ctx.AddDependency(ctx.Module(), AcDepTag, ctx.Config().AllApexContributions()...) + for _, child := range deps { + if child == nil { + continue + } + if m, ok := child.(*apexContributions); ok { + addContentsToProvider(&p, m) + } else { + ctx.ModuleErrorf("%s is not an apex_contributions module\n", child.Name()) + } } - }) + } SetProvider(ctx, PrebuiltSelectionInfoProvider, p) } diff --git a/android/mutator.go b/android/mutator.go index 1b0700a56..76487fbad 100644 --- a/android/mutator.go +++ b/android/mutator.go @@ -159,6 +159,7 @@ func registerArchMutator(ctx RegisterMutatorsContext) { var preDeps = []RegisterMutatorFunc{ registerArchMutator, + RegisterPrebuiltsPreDepsMutators, } var postDeps = []RegisterMutatorFunc{ diff --git a/android/prebuilt.go b/android/prebuilt.go index bf2717865..defec1186 100644 --- a/android/prebuilt.go +++ b/android/prebuilt.go @@ -28,6 +28,7 @@ import ( func RegisterPrebuiltMutators(ctx RegistrationContext) { ctx.PreArchMutators(RegisterPrebuiltsPreArchMutators) + ctx.PreDepsMutators(RegisterPrebuiltsPreDepsMutators) ctx.PostDepsMutators(RegisterPrebuiltsPostDepsMutators) } @@ -195,6 +196,10 @@ func (p *Prebuilt) UsePrebuilt() bool { return p.properties.UsePrebuilt } +func (p *Prebuilt) SetUsePrebuilt(use bool) { + p.properties.UsePrebuilt = use +} + // Called to provide the srcs value for the prebuilt module. // // This can be called with a context for any module not just the prebuilt one itself. It can also be @@ -422,9 +427,12 @@ func RegisterPrebuiltsPreArchMutators(ctx RegisterMutatorsContext) { ctx.BottomUp("prebuilt_rename", PrebuiltRenameMutator).UsesRename() } -func RegisterPrebuiltsPostDepsMutators(ctx RegisterMutatorsContext) { +func RegisterPrebuiltsPreDepsMutators(ctx RegisterMutatorsContext) { ctx.BottomUp("prebuilt_source", PrebuiltSourceDepsMutator).UsesReverseDependencies() ctx.BottomUp("prebuilt_select", PrebuiltSelectModuleMutator) +} + +func RegisterPrebuiltsPostDepsMutators(ctx RegisterMutatorsContext) { ctx.BottomUp("prebuilt_postdeps", PrebuiltPostDepsMutator).UsesReplaceDependencies() } @@ -468,7 +476,7 @@ func PrebuiltSourceDepsMutator(ctx BottomUpMutatorContext) { bmn, _ := m.(baseModuleName) name := bmn.BaseModuleName() if ctx.OtherModuleReverseDependencyVariantExists(name) { - ctx.AddReverseDependency(ctx.Module(), PrebuiltDepTag, name) + ctx.AddReverseVariationDependency(nil, PrebuiltDepTag, name) p.properties.SourceExists = true } } diff --git a/android/visibility.go b/android/visibility.go index cee465e8c..4837c7d4b 100644 --- a/android/visibility.go +++ b/android/visibility.go @@ -529,7 +529,7 @@ func visibilityRuleEnforcer(ctx BottomUpMutatorContext) { rule := effectiveVisibilityRules(ctx.Config(), depQualified) if !rule.matches(qualified) { - ctx.ModuleErrorf("depends on %s which is not visible to this module\nYou may need to add %q to its visibility", depQualified, "//"+ctx.ModuleDir()) + ctx.ModuleErrorf("depends on %s which is not visible to this module\nYou may need to add %q to its visibility, %#v", depQualified, "//"+ctx.ModuleDir(), ctx.OtherModuleDependencyTag(dep)) } }) } diff --git a/apex/apex.go b/apex/apex.go index fa796e534..bbcc4cc58 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -1193,6 +1193,13 @@ func markPlatformAvailability(mctx android.BottomUpMutatorContext) { } } +type apexTransitionTag interface { + // ApexTransition is a temporary interface used to tag dependencies with the apex variation they should use + // when the dependency is added before the apex transition mutator has run. These will be replaced with + // dependencies on the apex instead, which will then be used to find the necessary module inside the apex. + ApexTransition() string +} + type apexTransitionMutator struct{} func (a *apexTransitionMutator) Split(ctx android.BaseModuleContext) []string { @@ -1207,6 +1214,9 @@ func (a *apexTransitionMutator) Split(ctx android.BaseModuleContext) []string { } func (a *apexTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if tag, ok := ctx.DepTag().(apexTransitionTag); ok { + return tag.ApexTransition() + } return sourceVariation } diff --git a/apex/apex_test.go b/apex/apex_test.go index 987cb6905..887767527 100644 --- a/apex/apex_test.go +++ b/apex/apex_test.go @@ -5633,7 +5633,7 @@ func TestBootDexJarsFromSourcesAndPrebuilts(t *testing.T) { // prebuilt_apex module always depends on the prebuilt, and so it doesn't // find the dex boot jar in it. We either need to disable the source libfoo // or make the prebuilt libfoo preferred. - testDexpreoptWithApexes(t, bp, "module libfoo does not provide a dex boot jar", preparer, fragment) + testDexpreoptWithApexes(t, bp, `module "platform-bootclasspath" variant ".*": module "libfoo" from platform is not allowed in the apex boot jars list`, preparer, fragment) // dexbootjar check is skipped if AllowMissingDependencies is true preparerAllowMissingDeps := android.GroupFixturePreparers( preparer, diff --git a/apex/platform_bootclasspath_test.go b/apex/platform_bootclasspath_test.go index 8b5fce91c..6ebd78fa2 100644 --- a/apex/platform_bootclasspath_test.go +++ b/apex/platform_bootclasspath_test.go @@ -561,16 +561,13 @@ func TestPlatformBootclasspath_AlwaysUsePrebuiltSdks(t *testing.T) { // Not a prebuilt as no prebuilt existed when it was added. "platform:legacy.core.platform.api.stubs.exportable", - // The platform_bootclasspath intentionally adds dependencies on both source and prebuilt - // modules when available as it does not know which one will be preferred. - "myapex:foo", + // The prebuilt. "myapex:prebuilt_foo", // Only a source module exists. "myapex:bar", // The fragments. - "myapex:mybootclasspath-fragment", "myapex:prebuilt_mybootclasspath-fragment", // Impl lib of sdk_library for transitive srcjar generation @@ -665,7 +662,7 @@ func TestBootJarNotInApex(t *testing.T) { prepareForTestWithMyapex, java.FixtureConfigureApexBootJars("myapex:foo"), ).ExtendWithErrorHandler(android.FixtureExpectsAtLeastOneErrorMatchingPattern( - `dependency "foo" of "myplatform-bootclasspath" missing variant`)). + `module "myplatform-bootclasspath" variant ".*": module "foo" from platform is not allowed in the apex boot jars list`)). RunTestWithBp(t, ` apex { name: "myapex", diff --git a/cc/library.go b/cc/library.go index 789190cd1..dce3b9229 100644 --- a/cc/library.go +++ b/cc/library.go @@ -2229,6 +2229,9 @@ func (linkageTransitionMutator) Split(ctx android.BaseModuleContext) []string { } func (linkageTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if ctx.DepTag() == android.PrebuiltDepTag { + return sourceVariation + } return "" } @@ -2285,11 +2288,13 @@ func (linkageTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, varia library.setStatic() if !library.buildStatic() { library.disablePrebuilt() + ctx.Module().(*Module).Prebuilt().SetUsePrebuilt(false) } } else if variation == "shared" { library.setShared() if !library.buildShared() { library.disablePrebuilt() + ctx.Module().(*Module).Prebuilt().SetUsePrebuilt(false) } } } else if library, ok := ctx.Module().(LinkableInterface); ok && library.CcLibraryInterface() { @@ -2402,6 +2407,9 @@ func (versionTransitionMutator) Split(ctx android.BaseModuleContext) []string { } func (versionTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if ctx.DepTag() == android.PrebuiltDepTag { + return sourceVariation + } return "" } diff --git a/java/bootclasspath.go b/java/bootclasspath.go index 3413cf350..856f43919 100644 --- a/java/bootclasspath.go +++ b/java/bootclasspath.go @@ -23,36 +23,9 @@ import ( // Contains code that is common to both platform_bootclasspath and bootclasspath_fragment. -func init() { - registerBootclasspathBuildComponents(android.InitRegistrationContext) -} - -func registerBootclasspathBuildComponents(ctx android.RegistrationContext) { - ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) { - ctx.BottomUp("bootclasspath_deps", bootclasspathDepsMutator) - }) -} - -// BootclasspathDepsMutator is the interface that a module must implement if it wants to add -// dependencies onto APEX specific variants of bootclasspath fragments or bootclasspath contents. -type BootclasspathDepsMutator interface { - // BootclasspathDepsMutator implementations should add dependencies using - // addDependencyOntoApexModulePair and addDependencyOntoApexVariants. - BootclasspathDepsMutator(ctx android.BottomUpMutatorContext) -} - -// bootclasspathDepsMutator is called during the final deps phase after all APEX variants have -// been created so can add dependencies onto specific APEX variants of modules. -func bootclasspathDepsMutator(ctx android.BottomUpMutatorContext) { - m := ctx.Module() - if p, ok := m.(BootclasspathDepsMutator); ok { - p.BootclasspathDepsMutator(ctx) - } -} - // addDependencyOntoApexVariants adds dependencies onto the appropriate apex specific variants of // the module as specified in the ApexVariantReference list. -func addDependencyOntoApexVariants(ctx android.BottomUpMutatorContext, propertyName string, refs []ApexVariantReference, tag blueprint.DependencyTag) { +func addDependencyOntoApexVariants(ctx android.BottomUpMutatorContext, propertyName string, refs []ApexVariantReference, tagType bootclasspathDependencyTagType) { for i, ref := range refs { apex := proptools.StringDefault(ref.Apex, "platform") @@ -62,7 +35,7 @@ func addDependencyOntoApexVariants(ctx android.BottomUpMutatorContext, propertyN } name := proptools.String(ref.Module) - addDependencyOntoApexModulePair(ctx, apex, name, tag) + addDependencyOntoApexModulePair(ctx, apex, name, tagType) } } @@ -75,64 +48,26 @@ func addDependencyOntoApexVariants(ctx android.BottomUpMutatorContext, propertyN // module when both source and prebuilt modules are available. // // Use gatherApexModulePairDepsWithTag to retrieve the dependencies. -func addDependencyOntoApexModulePair(ctx android.BottomUpMutatorContext, apex string, name string, tag blueprint.DependencyTag) { - var variations []blueprint.Variation +func addDependencyOntoApexModulePair(ctx android.BottomUpMutatorContext, apex string, name string, tagType bootclasspathDependencyTagType) { + tag := bootclasspathDependencyTag{ + typ: tagType, + } if !android.IsConfiguredJarForPlatform(apex) { - // Pick the correct apex variant. - variations = []blueprint.Variation{ - {Mutator: "apex", Variation: apex}, - } + tag.apex = apex } target := ctx.Module().Target() - variations = append(variations, target.Variations()...) - addedDep := false - if ctx.OtherModuleDependencyVariantExists(variations, name) { - ctx.AddFarVariationDependencies(variations, tag, name) - addedDep = true - } - - // Add a dependency on the prebuilt module if it exists. - prebuiltName := android.PrebuiltNameFromSource(name) - if ctx.OtherModuleDependencyVariantExists(variations, prebuiltName) { - ctx.AddVariationDependencies(variations, tag, prebuiltName) - addedDep = true - } - - // If no appropriate variant existing for this, so no dependency could be added, then it is an - // error, unless missing dependencies are allowed. The simplest way to handle that is to add a - // dependency that will not be satisfied and the default behavior will handle it. - if !addedDep { - // Add dependency on the unprefixed (i.e. source or renamed prebuilt) module which we know does - // not exist. The resulting error message will contain useful information about the available - // variants. - reportMissingVariationDependency(ctx, variations, name) - - // Add dependency on the missing prefixed prebuilt variant too if a module with that name exists - // so that information about its available variants will be reported too. - if ctx.OtherModuleExists(prebuiltName) { - reportMissingVariationDependency(ctx, variations, prebuiltName) - } - } -} - -// reportMissingVariationDependency intentionally adds a dependency on a missing variation in order -// to generate an appropriate error message with information about the available variations. -func reportMissingVariationDependency(ctx android.BottomUpMutatorContext, variations []blueprint.Variation, name string) { - ctx.AddFarVariationDependencies(variations, nil, name) + ctx.AddFarVariationDependencies(target.Variations(), tag, name) } // gatherApexModulePairDepsWithTag returns the list of dependencies with the supplied tag that was // added by addDependencyOntoApexModulePair. -func gatherApexModulePairDepsWithTag(ctx android.BaseModuleContext, tag blueprint.DependencyTag) []android.Module { +func gatherApexModulePairDepsWithTag(ctx android.BaseModuleContext, tagType bootclasspathDependencyTagType) []android.Module { var modules []android.Module - isActiveModulePred := func(module android.Module) bool { - return isActiveModule(ctx, module) - } - ctx.VisitDirectDepsIf(isActiveModulePred, func(module android.Module) { + ctx.VisitDirectDeps(func(module android.Module) { t := ctx.OtherModuleDependencyTag(module) - if t == tag { + if bcpTag, ok := t.(bootclasspathDependencyTag); ok && bcpTag.typ == tagType { modules = append(modules, module) } }) @@ -165,7 +100,7 @@ type BootclasspathFragmentsDepsProperties struct { // addDependenciesOntoFragments adds dependencies to the fragments specified in this properties // structure. func (p *BootclasspathFragmentsDepsProperties) addDependenciesOntoFragments(ctx android.BottomUpMutatorContext) { - addDependencyOntoApexVariants(ctx, "fragments", p.Fragments, bootclasspathFragmentDepTag) + addDependencyOntoApexVariants(ctx, "fragments", p.Fragments, fragment) } // bootclasspathDependencyTag defines dependencies from/to bootclasspath_fragment, @@ -174,23 +109,36 @@ func (p *BootclasspathFragmentsDepsProperties) addDependenciesOntoFragments(ctx type bootclasspathDependencyTag struct { blueprint.BaseDependencyTag - name string + typ bootclasspathDependencyTagType + + apex string } +type bootclasspathDependencyTagType int + +const ( + // The tag used for dependencies onto bootclasspath_fragments. + fragment bootclasspathDependencyTagType = iota + // The tag used for dependencies onto platform_bootclasspath. + platform + dexpreoptBootJar + artBootJar + platformBootJar + apexBootJar +) + func (t bootclasspathDependencyTag) ExcludeFromVisibilityEnforcement() { } +func (t bootclasspathDependencyTag) ApexTransition() string { + return t.apex +} + // Dependencies that use the bootclasspathDependencyTag instances are only added after all the // visibility checking has been done so this has no functional effect. However, it does make it // clear that visibility is not being enforced on these tags. var _ android.ExcludeFromVisibilityEnforcementTag = bootclasspathDependencyTag{} -// The tag used for dependencies onto bootclasspath_fragments. -var bootclasspathFragmentDepTag = bootclasspathDependencyTag{name: "fragment"} - -// The tag used for dependencies onto platform_bootclasspath. -var platformBootclasspathDepTag = bootclasspathDependencyTag{name: "platform"} - // BootclasspathNestedAPIProperties defines properties related to the API provided by parts of the // bootclasspath that are nested within the main BootclasspathAPIProperties. type BootclasspathNestedAPIProperties struct { diff --git a/java/bootclasspath_fragment.go b/java/bootclasspath_fragment.go index f6d6cad4a..d5296e2c7 100644 --- a/java/bootclasspath_fragment.go +++ b/java/bootclasspath_fragment.go @@ -412,9 +412,8 @@ func (b *BootclasspathFragmentModule) OutgoingDepIsInSameApex(tag blueprint.Depe } // Dependency to the bootclasspath fragment of another apex // e.g. concsrypt-bootclasspath-fragment --> art-bootclasspath-fragment - if tag == bootclasspathFragmentDepTag { + if bcpTag, ok := tag.(bootclasspathDependencyTag); ok && bcpTag.typ == fragment { return false - } panic(fmt.Errorf("boot_image module %q should not have a dependency tag %s", b, android.PrettyPrintTag(tag))) } @@ -458,22 +457,18 @@ func (b *BootclasspathFragmentModule) DepsMutator(ctx android.BottomUpMutatorCon } } - if !dexpreopt.IsDex2oatNeeded(ctx) { - return + if dexpreopt.IsDex2oatNeeded(ctx) { + // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The + // path is retrieved from the dependency by GetGlobalSoongConfig(ctx). + dexpreopt.RegisterToolDeps(ctx) } - // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The - // path is retrieved from the dependency by GetGlobalSoongConfig(ctx). - dexpreopt.RegisterToolDeps(ctx) - // Add a dependency to `all_apex_contributions` to determine if prebuilts are active. // If prebuilts are active, `contents` validation on the source bootclasspath fragment should be disabled. if _, isPrebuiltModule := ctx.Module().(*PrebuiltBootclasspathFragmentModule); !isPrebuiltModule { ctx.AddDependency(b, android.AcDepTag, "all_apex_contributions") } -} -func (b *BootclasspathFragmentModule) BootclasspathDepsMutator(ctx android.BottomUpMutatorContext) { // Add dependencies on all the fragments. b.properties.BootclasspathFragmentsDepsProperties.addDependenciesOntoFragments(ctx) } @@ -498,7 +493,7 @@ func (b *BootclasspathFragmentModule) GenerateAndroidBuildActions(ctx android.Mo } }) - fragments := gatherApexModulePairDepsWithTag(ctx, bootclasspathFragmentDepTag) + fragments := gatherApexModulePairDepsWithTag(ctx, fragment) // Perform hidden API processing. hiddenAPIOutput := b.generateHiddenAPIBuildActions(ctx, contents, fragments) @@ -1142,6 +1137,13 @@ func prebuiltBootclasspathFragmentFactory() android.Module { android.InitPrebuiltModule(m, &[]string{"placeholder"}) android.InitApexModule(m) android.InitAndroidArchModule(m, android.HostAndDeviceSupported, android.MultilibCommon) + android.InitDefaultableModule(m) + + m.SetDefaultableHook(func(mctx android.DefaultableHookContext) { + if mctx.Config().AlwaysUsePrebuiltSdks() { + m.prebuilt.ForcePrefer() + } + }) return m } diff --git a/java/dexpreopt_bootjars.go b/java/dexpreopt_bootjars.go index 093cc876b..83b1f4df6 100644 --- a/java/dexpreopt_bootjars.go +++ b/java/dexpreopt_bootjars.go @@ -225,7 +225,6 @@ var artApexNames = []string{ } var ( - dexpreoptBootJarDepTag = bootclasspathDependencyTag{name: "dexpreopt-boot-jar"} dexBootJarsFragmentsKey = android.NewOnceKey("dexBootJarsFragments") apexContributionsMetadataDepTag = dependencyTag{name: "all_apex_contributions"} ) @@ -467,9 +466,6 @@ func dexpreoptBootJarsFactory() android.SingletonModule { func RegisterDexpreoptBootJarsComponents(ctx android.RegistrationContext) { ctx.RegisterParallelSingletonModuleType("dex_bootjars", dexpreoptBootJarsFactory) ctx.RegisterModuleType("art_boot_images", artBootImagesFactory) - ctx.FinalDepsMutators(func(ctx android.RegisterMutatorsContext) { - ctx.BottomUp("dex_bootjars_deps", DexpreoptBootJarsMutator) - }) } func SkipDexpreoptBootJars(ctx android.PathContext) bool { @@ -505,12 +501,6 @@ type dexpreoptBootJars struct { func (dbj *dexpreoptBootJars) DepsMutator(ctx android.BottomUpMutatorContext) { // Create a dependency on all_apex_contributions to determine the selected mainline module ctx.AddDependency(ctx.Module(), apexContributionsMetadataDepTag, "all_apex_contributions") -} - -func DexpreoptBootJarsMutator(ctx android.BottomUpMutatorContext) { - if _, ok := ctx.Module().(*dexpreoptBootJars); !ok { - return - } if dexpreopt.IsDex2oatNeeded(ctx) { // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The @@ -524,7 +514,7 @@ func DexpreoptBootJarsMutator(ctx android.BottomUpMutatorContext) { continue } // For accessing the boot jars. - addDependenciesOntoBootImageModules(ctx, config.modules, dexpreoptBootJarDepTag) + addDependenciesOntoBootImageModules(ctx, config.modules, dexpreoptBootJar) // Create a dependency on the apex selected using RELEASE_APEX_CONTRIBUTIONS_* // TODO: b/308174306 - Remove the direct depedendency edge to the java_library (source/prebuilt) once all mainline modules // have been flagged using RELEASE_APEX_CONTRIBUTIONS_* @@ -537,11 +527,11 @@ func DexpreoptBootJarsMutator(ctx android.BottomUpMutatorContext) { if ctx.OtherModuleExists("platform-bootclasspath") { // For accessing all bootclasspath fragments. - addDependencyOntoApexModulePair(ctx, "platform", "platform-bootclasspath", platformBootclasspathDepTag) + addDependencyOntoApexModulePair(ctx, "platform", "platform-bootclasspath", platform) } else if ctx.OtherModuleExists("art-bootclasspath-fragment") { // For accessing the ART bootclasspath fragment on a thin manifest (e.g., master-art) where // platform-bootclasspath doesn't exist. - addDependencyOntoApexModulePair(ctx, "com.android.art", "art-bootclasspath-fragment", bootclasspathFragmentDepTag) + addDependencyOntoApexModulePair(ctx, "com.android.art", "art-bootclasspath-fragment", fragment) } } @@ -559,16 +549,14 @@ func addDependenciesOntoSelectedBootImageApexes(ctx android.BottomUpMutatorConte // We need to add a dep on only the apex listed in `contents` of the selected apex_contributions module // This is not available in a structured format in `apex_contributions`, so this hack adds a dep on all `contents` // (some modules like art.module.public.api do not have an apex variation since it is a pure stub module that does not get installed) - apexVariationOfSelected := append(ctx.Target().Variations(), blueprint.Variation{Mutator: "apex", Variation: apex}) - if ctx.OtherModuleDependencyVariantExists(apexVariationOfSelected, selected) { - ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, selected) - } else if ctx.OtherModuleDependencyVariantExists(apexVariationOfSelected, android.RemoveOptionalPrebuiltPrefix(selected)) { - // The prebuilt might have been renamed by prebuilt_rename mutator if the source module does not exist. - // Remove the prebuilt_ prefix. - ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, android.RemoveOptionalPrebuiltPrefix(selected)) - } else { - // Couldn't find a dependency, do it again to report an error. - ctx.AddFarVariationDependencies(apexVariationOfSelected, dexpreoptBootJarDepTag, selected) + tag := bootclasspathDependencyTag{ + typ: dexpreoptBootJar, + } + if !android.IsConfiguredJarForPlatform(apex) { + tag.apex = apex + } + if ctx.OtherModuleDependencyVariantExists(ctx.Target().Variations(), android.RemoveOptionalPrebuiltPrefix(selected)) { + ctx.AddFarVariationDependencies(ctx.Target().Variations(), tag, android.RemoveOptionalPrebuiltPrefix(selected)) } } } @@ -582,15 +570,17 @@ func gatherBootclasspathFragments(ctx android.ModuleContext) map[string]android. return false } tag := ctx.OtherModuleDependencyTag(child) - if tag == platformBootclasspathDepTag { - return true - } - if tag == bootclasspathFragmentDepTag { - apexInfo, _ := android.OtherModuleProvider(ctx, child, android.ApexInfoProvider) - for _, apex := range apexInfo.InApexVariants { - fragments[apex] = child + if bcpTag, ok := tag.(bootclasspathDependencyTag); ok { + if bcpTag.typ == platform { + return true + } + if bcpTag.typ == fragment { + apexInfo, _ := android.OtherModuleProvider(ctx, child, android.ApexInfoProvider) + for _, apex := range apexInfo.InApexVariants { + fragments[apex] = child + } + return false } - return false } return false }) @@ -717,7 +707,7 @@ func getModulesForImage(ctx android.ModuleContext, imageConfig *bootImageConfig) modules := make([]apexJarModulePair, 0, imageConfig.modules.Len()) for i := 0; i < imageConfig.modules.Len(); i++ { found := false - for _, module := range gatherApexModulePairDepsWithTag(ctx, dexpreoptBootJarDepTag) { + for _, module := range gatherApexModulePairDepsWithTag(ctx, dexpreoptBootJar) { name := android.RemoveOptionalPrebuiltPrefix(module.Name()) if name == imageConfig.modules.Jar(i) { modules = append(modules, apexJarModulePair{ @@ -804,7 +794,11 @@ func getDexJarForApex(ctx android.ModuleContext, pair apexJarModulePair, apexNam bootclasspathFragmentInfo, _ := android.OtherModuleProvider(ctx, fragment, BootclasspathFragmentApexContentInfoProvider) jar, err := bootclasspathFragmentInfo.DexBootJarPathForContentModule(pair.jarModule) if err != nil { - ctx.ModuleErrorf("%s", err) + if ctx.Config().AllowMissingDependencies() { + ctx.AddMissingDependencies([]string{pair.jarModule.String()}) + } else { + ctx.ModuleErrorf("%s", err) + } } return jar } @@ -963,9 +957,12 @@ func getProfilePathForApex(ctx android.ModuleContext, apexName string, apexNameT func getApexNameToApexExportsInfoMap(ctx android.ModuleContext) apexNameToApexExportsInfoMap { apexNameToApexExportsInfoMap := apexNameToApexExportsInfoMap{} - ctx.VisitDirectDepsWithTag(dexpreoptBootJarDepTag, func(am android.Module) { - if info, exists := android.OtherModuleProvider(ctx, am, android.ApexExportsInfoProvider); exists { - apexNameToApexExportsInfoMap[info.ApexName] = info + ctx.VisitDirectDeps(func(am android.Module) { + tag := ctx.OtherModuleDependencyTag(am) + if bcpTag, ok := tag.(bootclasspathDependencyTag); ok && bcpTag.typ == dexpreoptBootJar { + if info, exists := android.OtherModuleProvider(ctx, am, android.ApexExportsInfoProvider); exists { + apexNameToApexExportsInfoMap[info.ApexName] = info + } } }) return apexNameToApexExportsInfoMap @@ -1448,24 +1445,30 @@ func artBootImagesFactory() android.Module { func (dbj *artBootImages) DepsMutator(ctx android.BottomUpMutatorContext) { // Create a dependency on `dex_bootjars` to access the intermediate locations of host art boot image. - ctx.AddVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(), dexpreoptBootJarDepTag, "dex_bootjars") + tag := bootclasspathDependencyTag{ + typ: dexpreoptBootJar, + } + ctx.AddVariationDependencies(ctx.Config().AndroidCommonTarget.Variations(), tag, "dex_bootjars") } func (d *artBootImages) GenerateAndroidBuildActions(ctx android.ModuleContext) { - ctx.VisitDirectDepsWithTag(dexpreoptBootJarDepTag, func(m android.Module) { - hostInstallsInfo, ok := android.OtherModuleProvider(ctx, m, artBootImageHostInfoProvider) - if !ok { - ctx.ModuleErrorf("Could not find information about the host variant of ART boot image") - } - installs := d.installFile(ctx, hostInstallsInfo.installs) - if len(installs) > 0 { - d.outputFile = android.OptionalPathForPath(installs[0]) - // Create a phony target that can ART run-tests can depend on. - ctx.Phony(d.Name(), installs...) - } else { - // this might be true e.g. when building with `WITH_DEXPREOPT=false` - // create an empty file so that the `art_boot_images` is known to the packaging system. - d.outputFile = android.OptionalPathForPath(android.PathForModuleOut(ctx, "undefined_art_boot_images")) + ctx.VisitDirectDeps(func(m android.Module) { + tag := ctx.OtherModuleDependencyTag(m) + if bcpTag, ok := tag.(bootclasspathDependencyTag); ok && bcpTag.typ == dexpreoptBootJar { + hostInstallsInfo, ok := android.OtherModuleProvider(ctx, m, artBootImageHostInfoProvider) + if !ok { + ctx.ModuleErrorf("Could not find information about the host variant of ART boot image") + } + installs := d.installFile(ctx, hostInstallsInfo.installs) + if len(installs) > 0 { + d.outputFile = android.OptionalPathForPath(installs[0]) + // Create a phony target that can ART run-tests can depend on. + ctx.Phony(d.Name(), installs...) + } else { + // this might be true e.g. when building with `WITH_DEXPREOPT=false` + // create an empty file so that the `art_boot_images` is known to the packaging system. + d.outputFile = android.OptionalPathForPath(android.PathForModuleOut(ctx, "undefined_art_boot_images")) + } } }) } diff --git a/java/platform_bootclasspath.go b/java/platform_bootclasspath.go index 86062d489..3b05b16e3 100644 --- a/java/platform_bootclasspath.go +++ b/java/platform_bootclasspath.go @@ -31,12 +31,6 @@ func registerPlatformBootclasspathBuildComponents(ctx android.RegistrationContex // The tags used for the dependencies between the platform bootclasspath and any configured boot // jars. -var ( - platformBootclasspathArtBootJarDepTag = bootclasspathDependencyTag{name: "art-boot-jar"} - platformBootclasspathBootJarDepTag = bootclasspathDependencyTag{name: "platform-boot-jar"} - platformBootclasspathApexBootJarDepTag = bootclasspathDependencyTag{name: "apex-boot-jar"} -) - type platformBootclasspathImplLibDepTagType struct { blueprint.BaseDependencyTag } @@ -100,26 +94,12 @@ func (b *platformBootclasspathModule) DepsMutator(ctx android.BottomUpMutatorCon b.hiddenAPIDepsMutator(ctx) - if !dexpreopt.IsDex2oatNeeded(ctx) { - return + if dexpreopt.IsDex2oatNeeded(ctx) { + // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The + // path is retrieved from the dependency by GetGlobalSoongConfig(ctx). + dexpreopt.RegisterToolDeps(ctx) } - // Add a dependency onto the dex2oat tool which is needed for creating the boot image. The - // path is retrieved from the dependency by GetGlobalSoongConfig(ctx). - dexpreopt.RegisterToolDeps(ctx) -} - -func (b *platformBootclasspathModule) hiddenAPIDepsMutator(ctx android.BottomUpMutatorContext) { - if ctx.Config().DisableHiddenApiChecks() { - return - } - - // Add dependencies onto the stub lib modules. - apiLevelToStubLibModules := hiddenAPIComputeMonolithicStubLibModules(ctx.Config()) - hiddenAPIAddStubLibDependencies(ctx, apiLevelToStubLibModules) -} - -func (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.BottomUpMutatorContext) { // Add dependencies on all the ART jars. global := dexpreopt.GetGlobalConfig(ctx) addDependenciesOntoSelectedBootImageApexes(ctx, "com.android.art") @@ -127,13 +107,13 @@ func (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.Botto var bootImageModuleNames []string // TODO: b/308174306 - Remove the mechanism of depending on the java_sdk_library(_import) directly - addDependenciesOntoBootImageModules(ctx, global.ArtApexJars, platformBootclasspathArtBootJarDepTag) + addDependenciesOntoBootImageModules(ctx, global.ArtApexJars, artBootJar) bootImageModuleNames = append(bootImageModuleNames, global.ArtApexJars.CopyOfJars()...) // Add dependencies on all the non-updatable jars, which are on the platform or in non-updatable // APEXes. platformJars := b.platformJars(ctx) - addDependenciesOntoBootImageModules(ctx, platformJars, platformBootclasspathBootJarDepTag) + addDependenciesOntoBootImageModules(ctx, platformJars, platformBootJar) bootImageModuleNames = append(bootImageModuleNames, platformJars.CopyOfJars()...) // Add dependencies on all the updatable jars, except the ART jars. @@ -144,7 +124,7 @@ func (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.Botto } addDependenciesOntoSelectedBootImageApexes(ctx, android.FirstUniqueStrings(apexes)...) // TODO: b/308174306 - Remove the mechanism of depending on the java_sdk_library(_import) directly - addDependenciesOntoBootImageModules(ctx, apexJars, platformBootclasspathApexBootJarDepTag) + addDependenciesOntoBootImageModules(ctx, apexJars, apexBootJar) bootImageModuleNames = append(bootImageModuleNames, apexJars.CopyOfJars()...) // Add dependencies on all the fragments. @@ -158,20 +138,30 @@ func (b *platformBootclasspathModule) BootclasspathDepsMutator(ctx android.Botto } } -func addDependenciesOntoBootImageModules(ctx android.BottomUpMutatorContext, modules android.ConfiguredJarList, tag bootclasspathDependencyTag) { +func (b *platformBootclasspathModule) hiddenAPIDepsMutator(ctx android.BottomUpMutatorContext) { + if ctx.Config().DisableHiddenApiChecks() { + return + } + + // Add dependencies onto the stub lib modules. + apiLevelToStubLibModules := hiddenAPIComputeMonolithicStubLibModules(ctx.Config()) + hiddenAPIAddStubLibDependencies(ctx, apiLevelToStubLibModules) +} + +func addDependenciesOntoBootImageModules(ctx android.BottomUpMutatorContext, modules android.ConfiguredJarList, tagType bootclasspathDependencyTagType) { for i := 0; i < modules.Len(); i++ { apex := modules.Apex(i) name := modules.Jar(i) - addDependencyOntoApexModulePair(ctx, apex, name, tag) + addDependencyOntoApexModulePair(ctx, apex, name, tagType) } } func (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.ModuleContext) { // Gather all the dependencies from the art, platform, and apex boot jars. - artModules := gatherApexModulePairDepsWithTag(ctx, platformBootclasspathArtBootJarDepTag) - platformModules := gatherApexModulePairDepsWithTag(ctx, platformBootclasspathBootJarDepTag) - apexModules := gatherApexModulePairDepsWithTag(ctx, platformBootclasspathApexBootJarDepTag) + artModules := gatherApexModulePairDepsWithTag(ctx, artBootJar) + platformModules := gatherApexModulePairDepsWithTag(ctx, platformBootJar) + apexModules := gatherApexModulePairDepsWithTag(ctx, apexBootJar) // Concatenate them all, in order as they would appear on the bootclasspath. var allModules []android.Module @@ -199,7 +189,7 @@ func (b *platformBootclasspathModule) GenerateAndroidBuildActions(ctx android.Mo TransformResourcesToJar(ctx, srcjar, jarArgs, transitiveSrcFiles) // Gather all the fragments dependencies. - b.fragments = gatherApexModulePairDepsWithTag(ctx, bootclasspathFragmentDepTag) + b.fragments = gatherApexModulePairDepsWithTag(ctx, fragment) // Check the configuration of the boot modules. // ART modules are checked by the art-bootclasspath-fragment. @@ -283,7 +273,11 @@ func (b *platformBootclasspathModule) checkApexModules(ctx android.ModuleContext // modules is complete. if !ctx.Config().AlwaysUsePrebuiltSdks() { // error: this jar is part of the platform - ctx.ModuleErrorf("module %q from platform is not allowed in the apex boot jars list", name) + if ctx.Config().AllowMissingDependencies() { + ctx.AddMissingDependencies([]string{"module_" + name + "_from_platform_is_not_allowed_in_the_apex_boot_jars_list"}) + } else { + ctx.ModuleErrorf("module %q from platform is not allowed in the apex boot jars list", name) + } } } else { // TODO(b/177892522): Treat this as an error. diff --git a/java/testing.go b/java/testing.go index 0ea4e6408..378e2dd4f 100644 --- a/java/testing.go +++ b/java/testing.go @@ -378,7 +378,6 @@ func registerRequiredBuildComponentsForTest(ctx android.RegistrationContext) { RegisterAppBuildComponents(ctx) RegisterAppImportBuildComponents(ctx) RegisterAppSetBuildComponents(ctx) - registerBootclasspathBuildComponents(ctx) registerBootclasspathFragmentBuildComponents(ctx) RegisterDexpreoptBootJarsComponents(ctx) RegisterDocsBuildComponents(ctx) diff --git a/rust/library.go b/rust/library.go index 94f5730ea..0ebd7d3b1 100644 --- a/rust/library.go +++ b/rust/library.go @@ -945,6 +945,9 @@ func (libraryTransitionMutator) Split(ctx android.BaseModuleContext) []string { } func (libraryTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if ctx.DepTag() == android.PrebuiltDepTag { + return sourceVariation + } return "" } @@ -1012,6 +1015,12 @@ func (libraryTransitionMutator) Mutate(ctx android.BottomUpMutatorContext, varia }, sourceDepTag, ctx.ModuleName()) } + + if prebuilt, ok := m.compiler.(*prebuiltLibraryDecorator); ok { + if Bool(prebuilt.Properties.Force_use_prebuilt) && len(prebuilt.prebuiltSrcs()) > 0 { + m.Prebuilt().SetUsePrebuilt(true) + } + } } type libstdTransitionMutator struct{} @@ -1029,6 +1038,9 @@ func (libstdTransitionMutator) Split(ctx android.BaseModuleContext) []string { } func (libstdTransitionMutator) OutgoingTransition(ctx android.OutgoingTransitionContext, sourceVariation string) string { + if ctx.DepTag() == android.PrebuiltDepTag { + return sourceVariation + } return "" } diff --git a/rust/prebuilt.go b/rust/prebuilt.go index e35e510da..41f94238c 100644 --- a/rust/prebuilt.go +++ b/rust/prebuilt.go @@ -30,6 +30,8 @@ type PrebuiltProperties struct { Srcs []string `android:"path,arch_variant"` // directories containing associated rlib dependencies Link_dirs []string `android:"path,arch_variant"` + + Force_use_prebuilt *bool `android:"arch_variant"` } type prebuiltLibraryDecorator struct { diff --git a/sdk/bootclasspath_fragment_sdk_test.go b/sdk/bootclasspath_fragment_sdk_test.go index ad315bfd0..05915beef 100644 --- a/sdk/bootclasspath_fragment_sdk_test.go +++ b/sdk/bootclasspath_fragment_sdk_test.go @@ -744,6 +744,7 @@ func TestBasicSdkWithBootclasspathFragment(t *testing.T) { android.GroupFixturePreparers( prepareForSdkTestWithApex, prepareForSdkTestWithJava, + java.PrepareForTestWithJavaDefaultModules, android.FixtureMergeMockFs(android.MockFS{ "java/mybootlib.jar": nil, "hiddenapi/annotation-flags.csv": nil, diff --git a/sdk/cc_sdk_test.go b/sdk/cc_sdk_test.go index 5bac67da6..bf4ac139c 100644 --- a/sdk/cc_sdk_test.go +++ b/sdk/cc_sdk_test.go @@ -1405,8 +1405,6 @@ myinclude/Test.h -> include/myinclude/Test.h .intermediates/mynativelib/android_arm_armv7-a-neon_static/mynativelib.a -> arm/lib/mynativelib.a .intermediates/mynativelib/android_arm_armv7-a-neon_shared/mynativelib.so -> arm/lib/mynativelib.so `), - // TODO(b/183315522): Remove this and fix the issue. - snapshotTestErrorHandler(checkSnapshotPreferredWithSource, android.FixtureExpectsAtLeastOneErrorMatchingPattern(`\Qunrecognized property "arch.arm.shared.export_include_dirs"\E`)), ) } |