diff options
author | Paul Duffin <paulduffin@google.com> | 2021-06-15 19:10:11 +0100 |
---|---|---|
committer | Paul Duffin <paulduffin@google.com> | 2021-06-18 12:10:32 +0100 |
commit | c30aea20a0e20458cfe9afded3bca40a0e7a6142 (patch) | |
tree | e48514ff708225216063c816b34a25ee32a6507f /apex | |
parent | 5ec165d755cd82f6e051d18c0e98f097c7bc3ade (diff) |
Make apex variants of prebuilt apex exported modules available in make
Previously, the apex variants of modules exported from prebuilt_apex
and apex_set modules were not exported to make. Neither by the modules
themselves or by the prebuilt apex module. The master-art build relied
on the platform variants of the conscrypt and core-icu4j libraries
being exported to make so that they could be used by vogar.
Unfortunately, a change to export the prebuilt_bootclasspath_fragment
modules that contain the conscrypt and core-icu4j prebuilt libraries
from the corresponding prebuilt_apex prevented the platform variants
of those libraries from being exported at all which broke the
master-art builds as it only has prebuilts of those modules. It did not
break the aosp/master build as that has source modules.
The difference between the two builds is that the apex module type
makes its contents available in make but the prebuilt_apex/apex_set
module types do not.
This change causes the prebuilt_apex/apex_set module types to behave
more like the apex module type by making its exported libraries
available in make.
Bug: 179354495
Test: m droid
- in aosp/master
art/tools/buildbot-build.sh --target --installclean
- in master-art and aosp/master
Merged-In: I57537d17d4920d37d896ed491c6aaa15302cb25d
Change-Id: I57537d17d4920d37d896ed491c6aaa15302cb25d
(cherry picked from commit a35f8db1271a924b6c0c1d0ee8fd46a36aa1bcd9)
Diffstat (limited to 'apex')
-rw-r--r-- | apex/prebuilt.go | 83 |
1 files changed, 82 insertions, 1 deletions
diff --git a/apex/prebuilt.go b/apex/prebuilt.go index bf8c07304..05b7dc180 100644 --- a/apex/prebuilt.go +++ b/apex/prebuilt.go @@ -16,6 +16,7 @@ package apex import ( "fmt" + "io" "path/filepath" "strconv" "strings" @@ -56,6 +57,10 @@ type prebuiltCommon struct { installFilename string outputApex android.WritablePath + // A list of apexFile objects created in prebuiltCommon.initApexFilesForAndroidMk which are used + // to create make modules in prebuiltCommon.AndroidMkEntries. + apexFilesForAndroidMk []apexFile + // list of commands to create symlinks for backward compatibility. // these commands will be attached as LOCAL_POST_INSTALL_CMD compatSymlinks []string @@ -154,8 +159,37 @@ func (p *prebuiltCommon) installable() bool { return proptools.BoolDefault(p.prebuiltCommonProperties.Installable, true) } +// initApexFilesForAndroidMk initializes the prebuiltCommon.apexFilesForAndroidMk field from the +// modules that this depends upon. +func (p *prebuiltCommon) initApexFilesForAndroidMk(ctx android.ModuleContext) { + // Walk the dependencies of this module looking for the java modules that it exports. + ctx.WalkDeps(func(child, parent android.Module) bool { + tag := ctx.OtherModuleDependencyTag(child) + + name := android.RemoveOptionalPrebuiltPrefix(ctx.OtherModuleName(child)) + if java.IsBootclasspathFragmentContentDepTag(tag) || tag == exportedJavaLibTag { + // If the exported java module provides a dex jar path then add it to the list of apexFiles. + path := child.(interface{ DexJarBuildPath() android.Path }).DexJarBuildPath() + if path != nil { + p.apexFilesForAndroidMk = append(p.apexFilesForAndroidMk, apexFile{ + module: child, + moduleDir: ctx.OtherModuleDir(child), + androidMkModuleName: name, + builtFile: path, + class: javaSharedLib, + }) + } + } else if tag == exportedBootclasspathFragmentTag { + // Visit the children of the bootclasspath_fragment. + return true + } + + return false + }) +} + func (p *prebuiltCommon) AndroidMkEntries() []android.AndroidMkEntries { - return []android.AndroidMkEntries{ + entriesList := []android.AndroidMkEntries{ { Class: "ETC", OutputFile: android.OptionalPathForPath(p.outputApex), @@ -176,6 +210,47 @@ func (p *prebuiltCommon) AndroidMkEntries() []android.AndroidMkEntries { }, }, } + + // Iterate over the apexFilesForAndroidMk list and create an AndroidMkEntries struct for each + // file. This provides similar behavior to that provided in apexBundle.AndroidMk() as it makes the + // apex specific variants of the exported java modules available for use from within make. + apexName := p.BaseModuleName() + for _, fi := range p.apexFilesForAndroidMk { + moduleName := fi.androidMkModuleName + "." + apexName + entries := android.AndroidMkEntries{ + Class: fi.class.nameInMake(), + OverrideName: moduleName, + OutputFile: android.OptionalPathForPath(fi.builtFile), + Include: "$(BUILD_SYSTEM)/soong_java_prebuilt.mk", + ExtraEntries: []android.AndroidMkExtraEntriesFunc{ + func(ctx android.AndroidMkExtraEntriesContext, entries *android.AndroidMkEntries) { + entries.SetString("LOCAL_MODULE_PATH", p.installDir.ToMakePath().String()) + + // soong_java_prebuilt.mk sets LOCAL_MODULE_SUFFIX := .jar Therefore + // we need to remove the suffix from LOCAL_MODULE_STEM, otherwise + // we will have foo.jar.jar + entries.SetString("LOCAL_MODULE_STEM", strings.TrimSuffix(fi.stem(), ".jar")) + entries.SetString("LOCAL_SOONG_CLASSES_JAR", fi.builtFile.String()) + entries.SetString("LOCAL_SOONG_HEADER_JAR", fi.builtFile.String()) + entries.SetString("LOCAL_SOONG_DEX_JAR", fi.builtFile.String()) + entries.SetString("LOCAL_DEX_PREOPT", "false") + }, + }, + ExtraFooters: []android.AndroidMkExtraFootersFunc{ + func(w io.Writer, name, prefix, moduleDir string) { + // m <module_name> will build <module_name>.<apex_name> as well. + if fi.androidMkModuleName != moduleName { + fmt.Fprintf(w, ".PHONY: %s\n", fi.androidMkModuleName) + fmt.Fprintf(w, "%s: %s\n", fi.androidMkModuleName, moduleName) + } + }, + }, + } + + entriesList = append(entriesList, entries) + } + + return entriesList } // prebuiltApexModuleCreator defines the methods that need to be implemented by prebuilt_apex and @@ -634,6 +709,9 @@ func (p *Prebuilt) GenerateAndroidBuildActions(ctx android.ModuleContext) { return } + // Save the files that need to be made available to Make. + p.initApexFilesForAndroidMk(ctx) + if p.installable() { ctx.InstallFile(p.installDir, p.installFilename, p.inputApex) } @@ -833,6 +911,9 @@ func (a *ApexSet) GenerateAndroidBuildActions(ctx android.ModuleContext) { return } + // Save the files that need to be made available to Make. + a.initApexFilesForAndroidMk(ctx) + a.installDir = android.PathForModuleInstall(ctx, "apex") if a.installable() { ctx.InstallFile(a.installDir, a.installFilename, a.outputApex) |