From b6d230515e3104a2630388d11810d98d440a7943 Mon Sep 17 00:00:00 2001 From: Sasha Smundak Date: Mon, 1 Apr 2019 18:37:36 -0700 Subject: [PATCH] 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 --- android/androidmk.go | 35 ++++++++++++++++++++---------- android/module.go | 16 ++++++++++++++ android/prebuilt_etc.go | 3 +-- android/prebuilt_etc_test.go | 14 +++++++----- android/variable.go | 10 +++++---- androidmk/cmd/androidmk/android.go | 2 ++ java/androidmk.go | 2 +- phony/phony.go | 25 +++++++++++++++++---- 8 files changed, 80 insertions(+), 27 deletions(-) diff --git a/android/androidmk.go b/android/androidmk.go index bd49e4c6f..42e143951 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -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, " ")) + } +} diff --git a/android/module.go b/android/module.go index 201c27a8f..93966e16d 100644 --- a/android/module.go +++ b/android/module.go @@ -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 { diff --git a/android/prebuilt_etc.go b/android/prebuilt_etc.go index 2a3e07e30..3cadaeb22 100644 --- a/android/prebuilt_etc.go +++ b/android/prebuilt_etc.go @@ -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 { diff --git a/android/prebuilt_etc_test.go b/android/prebuilt_etc_test.go index e0ade7e50..fbdbc970b 100644 --- a/android/prebuilt_etc_test.go +++ b/android/prebuilt_etc_test.go @@ -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) diff --git a/android/variable.go b/android/variable.go index 21af31fb7..68a24ab35 100644 --- a/android/variable.go +++ b/android/variable.go @@ -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 diff --git a/androidmk/cmd/androidmk/android.go b/androidmk/cmd/androidmk/android.go index 52bcf9c99..8b996e0b4 100644 --- a/androidmk/cmd/androidmk/android.go +++ b/androidmk/cmd/androidmk/android.go @@ -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", diff --git a/java/androidmk.go b/java/androidmk.go index 908286a74..865c1201a 100644 --- a/java/androidmk.go +++ b/java/androidmk.go @@ -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") } } diff --git a/phony/phony.go b/phony/phony.go index ed6a2fef1..305a434f4 100644 --- a/phony/phony.go +++ b/phony/phony.go @@ -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)") }, }