From 778127a04192ffcf6df443f253e8a69868e3c529 Mon Sep 17 00:00:00 2001 From: Alex Light Date: Wed, 27 Feb 2019 14:19:50 -0800 Subject: [PATCH] Add support for including py_binary and *_go_binary in apexs These additional binary types are useful for some apexs. Add the ability to include them. Due to the nature of the resulting artifacts only py binaries with embedded launchers and host go binaries are supported. Test: m com.android.support.apexer Bug: 119332365 Bug: 119332362 Change-Id: I27c253d3647cf7bbe15896610d7a74a5f93e8bec --- Android.bp | 1 + android/module.go | 5 +++++ apex/apex.go | 35 ++++++++++++++++++++++++++++++++--- 3 files changed, 38 insertions(+), 3 deletions(-) diff --git a/Android.bp b/Android.bp index e9597f4a3..4d7304901 100644 --- a/Android.bp +++ b/Android.bp @@ -375,6 +375,7 @@ bootstrap_go_package { "soong-android", "soong-cc", "soong-java", + "soong-python", ], srcs: [ "apex/apex.go", diff --git a/android/module.go b/android/module.go index f2f1af1d3..2fa7d316a 100644 --- a/android/module.go +++ b/android/module.go @@ -154,6 +154,7 @@ type ModuleContext interface { // Deprecated: use WalkDeps instead to support multiple dependency tags on the same module VisitDepsDepthFirstIf(pred func(Module) bool, visit func(Module)) WalkDeps(visit func(Module, Module) bool) + WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) Variable(pctx PackageContext, name, value string) Rule(pctx PackageContext, name string, params blueprint.RuleParams, argNames ...string) blueprint.Rule @@ -1067,6 +1068,10 @@ func (a *androidModuleContext) VisitDepsDepthFirstIf(pred func(Module) bool, vis }) } +func (a *androidModuleContext) WalkDepsBlueprint(visit func(blueprint.Module, blueprint.Module) bool) { + a.ModuleContext.WalkDeps(visit) +} + func (a *androidModuleContext) WalkDeps(visit func(Module, Module) bool) { a.ModuleContext.WalkDeps(func(child, parent blueprint.Module) bool { childAndroidModule := a.validateAndroidModule(child) diff --git a/apex/apex.go b/apex/apex.go index 9ab518752..f72eef3a9 100644 --- a/apex/apex.go +++ b/apex/apex.go @@ -25,8 +25,10 @@ import ( "android/soong/android" "android/soong/cc" "android/soong/java" + "android/soong/python" "github.com/google/blueprint" + "github.com/google/blueprint/bootstrap" "github.com/google/blueprint/proptools" ) @@ -289,6 +291,8 @@ const ( nativeSharedLib nativeExecutable shBinary + pyBinary + goBinary javaSharedLib ) @@ -348,7 +352,7 @@ func (class apexFileClass) NameInMake() string { return "ETC" case nativeSharedLib: return "SHARED_LIBRARIES" - case nativeExecutable, shBinary: + case nativeExecutable, shBinary, pyBinary, goBinary: return "EXECUTABLES" case javaSharedLib: return "JAVA_LIBRARIES" @@ -624,6 +628,22 @@ func getCopyManifestForExecutable(cc *cc.Module) (fileToCopy android.Path, dirIn return } +func getCopyManifestForPyBinary(py *python.Module) (fileToCopy android.Path, dirInApex string) { + dirInApex = "bin" + fileToCopy = py.HostToolPath().Path() + return +} +func getCopyManifestForGoBinary(ctx android.ModuleContext, gb bootstrap.GoBinaryTool) (fileToCopy android.Path, dirInApex string) { + dirInApex = "bin" + s, err := filepath.Rel(android.PathForOutput(ctx).String(), gb.InstallPath()) + if err != nil { + ctx.ModuleErrorf("Unable to use compiled binary at %s", gb.InstallPath()) + return + } + fileToCopy = android.PathForOutput(ctx, s) + return +} + func getCopyManifestForShBinary(sh *android.ShBinary) (fileToCopy android.Path, dirInApex string) { dirInApex = filepath.Join("bin", sh.SubDir()) fileToCopy = sh.OutputFile() @@ -658,7 +678,7 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { handleSpecialLibs := !android.Bool(a.properties.Ignore_system_library_special_case) - ctx.WalkDeps(func(child, parent android.Module) bool { + ctx.WalkDepsBlueprint(func(child, parent blueprint.Module) bool { if _, ok := parent.(*apexBundle); ok { // direct dependencies depTag := ctx.OtherModuleDependencyTag(child) @@ -685,8 +705,17 @@ func (a *apexBundle) GenerateAndroidBuildActions(ctx android.ModuleContext) { } else if sh, ok := child.(*android.ShBinary); ok { fileToCopy, dirInApex := getCopyManifestForShBinary(sh) filesInfo = append(filesInfo, apexFile{fileToCopy, depName, dirInApex, shBinary, sh, nil}) + } else if py, ok := child.(*python.Module); ok && py.HostToolPath().Valid() { + fileToCopy, dirInApex := getCopyManifestForPyBinary(py) + filesInfo = append(filesInfo, apexFile{fileToCopy, depName, dirInApex, pyBinary, py, nil}) + } else if gb, ok := child.(bootstrap.GoBinaryTool); ok && a.Host() { + fileToCopy, dirInApex := getCopyManifestForGoBinary(ctx, gb) + // NB: Since go binaries are static we don't need the module for anything here, which is + // good since the go tool is a blueprint.Module not an android.Module like we would + // normally use. + filesInfo = append(filesInfo, apexFile{fileToCopy, depName, dirInApex, goBinary, nil, nil}) } else { - ctx.PropertyErrorf("binaries", "%q is neithher cc_binary nor sh_binary", depName) + ctx.PropertyErrorf("binaries", "%q is neither cc_binary, (embedded) py_binary, (host) blueprint_go_binary, (host) bootstrap_go_binary, nor sh_binary", depName) } case javaLibTag: if java, ok := child.(*java.Library); ok {