Implement `host_required` and `target_required` properties.

They are counterparts of LOCAL_HOST_REQUIRED_MODULES and
LOCAL_TARGET_REQUIRED_MODULES respectively.

Fixes: 128693436
Test: treehugger, convert cts/hostsidetests/devicepolicy/Android.bp
Change-Id: Id66ffca6edffe18993ac51e8930f1d0e78178249
This commit is contained in:
Sasha Smundak 2019-04-01 18:37:36 -07:00
parent f3f1467051
commit b6d230515e
8 changed files with 80 additions and 27 deletions

View File

@ -38,13 +38,15 @@ type AndroidMkDataProvider interface {
}
type AndroidMkData struct {
Class string
SubName string
DistFile OptionalPath
OutputFile OptionalPath
Disabled bool
Include string
Required []string
Class string
SubName string
DistFile OptionalPath
OutputFile OptionalPath
Disabled bool
Include string
Required []string
Host_required []string
Target_required []string
Custom func(w io.Writer, name, prefix, moduleDir string, data AndroidMkData)
@ -200,6 +202,8 @@ func translateAndroidModule(ctx SingletonContext, w io.Writer, mod blueprint.Mod
}
data.Required = append(data.Required, amod.commonProperties.Required...)
data.Host_required = append(data.Host_required, amod.commonProperties.Host_required...)
data.Target_required = append(data.Target_required, amod.commonProperties.Target_required...)
// Make does not understand LinuxBionic
if amod.Os() == LinuxBionic {
@ -267,10 +271,7 @@ func translateAndroidModule(ctx SingletonContext, w io.Writer, mod blueprint.Mod
fmt.Fprintln(&data.preamble, "LOCAL_MODULE :=", name+data.SubName)
fmt.Fprintln(&data.preamble, "LOCAL_MODULE_CLASS :=", data.Class)
fmt.Fprintln(&data.preamble, "LOCAL_PREBUILT_MODULE_FILE :=", data.OutputFile.String())
if len(data.Required) > 0 {
fmt.Fprintln(&data.preamble, "LOCAL_REQUIRED_MODULES := "+strings.Join(data.Required, " "))
}
WriteRequiredModulesSettings(&data.preamble, data)
archStr := amod.Arch().ArchType.String()
host := false
@ -360,3 +361,15 @@ func WriteAndroidMkData(w io.Writer, data AndroidMkData) {
fmt.Fprintln(w, "include "+data.Include)
}
func WriteRequiredModulesSettings(w io.Writer, data AndroidMkData) {
if len(data.Required) > 0 {
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", strings.Join(data.Required, " "))
}
if len(data.Host_required) > 0 {
fmt.Fprintln(w, "LOCAL_HOST_REQUIRED_MODULES :=", strings.Join(data.Host_required, " "))
}
if len(data.Target_required) > 0 {
fmt.Fprintln(w, "LOCAL_TARGET_REQUIRED_MODULES :=", strings.Join(data.Target_required, " "))
}
}

View File

@ -133,6 +133,8 @@ type ModuleContext interface {
InstallInRecovery() bool
RequiredModuleNames() []string
HostRequiredModuleNames() []string
TargetRequiredModuleNames() []string
// android.ModuleContext methods
// These are duplicated instead of embedded so that can eventually be wrapped to take an
@ -269,6 +271,12 @@ type commonProperties struct {
// names of other modules to install if this module is installed
Required []string `android:"arch_variant"`
// names of other modules to install on host if this module is installed
Host_required []string `android:"arch_variant"`
// names of other modules to install on target if this module is installed
Target_required []string `android:"arch_variant"`
// relative path to a file to include in the list of notices for the device
Notice *string `android:"path"`
@ -1459,6 +1467,14 @@ func (ctx *androidModuleContext) RequiredModuleNames() []string {
return ctx.module.base().commonProperties.Required
}
func (ctx *androidModuleContext) HostRequiredModuleNames() []string {
return ctx.module.base().commonProperties.Host_required
}
func (ctx *androidModuleContext) TargetRequiredModuleNames() []string {
return ctx.module.base().commonProperties.Target_required
}
func (ctx *androidModuleContext) Glob(globPattern string, excludes []string) Paths {
ret, err := ctx.GlobWithDeps(globPattern, excludes)
if err != nil {

View File

@ -17,7 +17,6 @@ package android
import (
"fmt"
"io"
"strings"
)
// TODO(jungw): Now that it handles more than the ones in etc/, consider renaming this file.
@ -157,7 +156,7 @@ func (p *PrebuiltEtc) AndroidMk() AndroidMkData {
fmt.Fprintln(w, "LOCAL_MODULE_PATH :=", "$(OUT_DIR)/"+p.installDirPath.RelPathString())
fmt.Fprintln(w, "LOCAL_INSTALLED_MODULE_STEM :=", p.outputFilePath.Base())
fmt.Fprintln(w, "LOCAL_UNINSTALLABLE_MODULE :=", !p.Installable())
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=", strings.Join(data.Required, " "))
WriteRequiredModulesSettings(w, data)
if p.additionalDependencies != nil {
fmt.Fprint(w, "LOCAL_ADDITIONAL_DEPENDENCIES :=")
for _, path := range *p.additionalDependencies {

View File

@ -150,13 +150,17 @@ func TestPrebuiltEtcAndroidMk(t *testing.T) {
data := AndroidMkData{}
data.Required = append(data.Required, "modA", "moduleB")
data.Host_required = append(data.Host_required, "hostModA", "hostModB")
data.Target_required = append(data.Target_required, "targetModA")
expected := map[string]string{
"LOCAL_MODULE": "foo",
"LOCAL_MODULE_CLASS": "ETC",
"LOCAL_MODULE_OWNER": "abc",
"LOCAL_INSTALLED_MODULE_STEM": "foo.conf",
"LOCAL_REQUIRED_MODULES": "modA moduleB",
"LOCAL_MODULE": "foo",
"LOCAL_MODULE_CLASS": "ETC",
"LOCAL_MODULE_OWNER": "abc",
"LOCAL_INSTALLED_MODULE_STEM": "foo.conf",
"LOCAL_REQUIRED_MODULES": "modA moduleB",
"LOCAL_HOST_REQUIRED_MODULES": "hostModA hostModB",
"LOCAL_TARGET_REQUIRED_MODULES": "targetModA",
}
mod := ctx.ModuleForTests("foo", "android_arm64_armv8-a_core").Module().(*PrebuiltEtc)

View File

@ -85,10 +85,12 @@ type variableProperties struct {
// are used for dogfooding and performance testing, and should be as similar to user builds
// as possible.
Debuggable struct {
Cflags []string
Cppflags []string
Init_rc []string
Required []string
Cflags []string
Cppflags []string
Init_rc []string
Required []string
Host_required []string
Target_required []string
}
// eng is true for -eng builds, and can be used to turn on additionaly heavyweight debugging

View File

@ -126,6 +126,8 @@ func init() {
"LOCAL_CONLYFLAGS": "conlyflags",
"LOCAL_CPPFLAGS": "cppflags",
"LOCAL_REQUIRED_MODULES": "required",
"LOCAL_HOST_REQUIRED_MODULES": "host_required",
"LOCAL_TARGET_REQUIRED_MODULES": "target_required",
"LOCAL_OVERRIDES_MODULES": "overrides",
"LOCAL_LDLIBS": "host_ldlibs",
"LOCAL_CLANG_CFLAGS": "clang_cflags",

View File

@ -38,7 +38,7 @@ func (library *Library) AndroidMkHostDex(w io.Writer, name string, data android.
}
fmt.Fprintln(w, "LOCAL_SOONG_HEADER_JAR :=", library.headerJarFile.String())
fmt.Fprintln(w, "LOCAL_SOONG_CLASSES_JAR :=", library.implementationAndResourcesJar.String())
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES := "+strings.Join(data.Required, " "))
android.WriteRequiredModulesSettings(w, data)
fmt.Fprintln(w, "include $(BUILD_SYSTEM)/soong_java_prebuilt.mk")
}
}

View File

@ -28,7 +28,9 @@ func init() {
type phony struct {
android.ModuleBase
requiredModuleNames []string
requiredModuleNames []string
hostRequiredModuleNames []string
targetRequiredModuleNames []string
}
func PhonyFactory() android.Module {
@ -40,8 +42,12 @@ func PhonyFactory() android.Module {
func (p *phony) GenerateAndroidBuildActions(ctx android.ModuleContext) {
p.requiredModuleNames = ctx.RequiredModuleNames()
if len(p.requiredModuleNames) == 0 {
ctx.PropertyErrorf("required", "phony must not have empty required dependencies in order to be useful(and therefore permitted).")
p.hostRequiredModuleNames = ctx.HostRequiredModuleNames()
p.targetRequiredModuleNames = ctx.TargetRequiredModuleNames()
if len(p.requiredModuleNames) == 0 &&
len(p.hostRequiredModuleNames) == 0 && len(p.targetRequiredModuleNames) == 0 {
ctx.PropertyErrorf("required", "phony must not have empty required dependencies "+
"in order to be useful(and therefore permitted).")
}
}
@ -54,7 +60,18 @@ func (p *phony) AndroidMk() android.AndroidMkData {
if p.Host() {
fmt.Fprintln(w, "LOCAL_IS_HOST_MODULE := true")
}
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES := "+strings.Join(p.requiredModuleNames, " "))
if len(p.requiredModuleNames) > 0 {
fmt.Fprintln(w, "LOCAL_REQUIRED_MODULES :=",
strings.Join(p.requiredModuleNames, " "))
}
if len(p.hostRequiredModuleNames) > 0 {
fmt.Fprintln(w, "LOCAL_HOST_REQUIRED_MODULES :=",
strings.Join(p.hostRequiredModuleNames, " "))
}
if len(p.targetRequiredModuleNames) > 0 {
fmt.Fprintln(w, "LOCAL_TARGET_REQUIRED_MODULES :=",
strings.Join(p.targetRequiredModuleNames, " "))
}
fmt.Fprintln(w, "include $(BUILD_PHONY_PACKAGE)")
},
}