From 87788b5247161d3d7510f6ad4e4fcd51e5375b75 Mon Sep 17 00:00:00 2001 From: Jiyong Park Date: Tue, 1 Sep 2020 12:37:45 +0900 Subject: [PATCH] Don't assume host arch is always x86 This change fixes some places where host arch is assumed to be x86 to form a path element like linux-x86. In preparation for non-x86 host targets, the host arch part is derived from the context. In addition, InstallForceOS() is refactored so that it can override not only OsType, but also ArchType. Without this, the paths for the robolectic modules will be changed from linux-x86 to linux-common, which breaks several other places where the old paths are expected. Bug: 134795810 Test: m Change-Id: Ib38c715948ae546e55021ece82bac1d82e9e5da0 --- android/arch.go | 9 +++++++++ android/module.go | 10 +++++----- android/paths.go | 35 +++++++++++++++++++++++------------ android/paths_test.go | 10 ++++++---- android/test_suites.go | 2 +- java/robolectric.go | 16 ++++++++++------ 6 files changed, 54 insertions(+), 28 deletions(-) diff --git a/android/arch.go b/android/arch.go index 9a5461474..66edf7eae 100644 --- a/android/arch.go +++ b/android/arch.go @@ -551,6 +551,15 @@ var BuildOs = func() OsType { } }() +var BuildArch = func() ArchType { + switch runtime.GOARCH { + case "amd64": + return X86_64 + default: + panic(fmt.Sprintf("unsupported Arch: %s", runtime.GOARCH)) + } +}() + var ( OsTypeList []OsType commonTargetMap = make(map[string]Target) diff --git a/android/module.go b/android/module.go index 3374e1dcb..046c0a082 100644 --- a/android/module.go +++ b/android/module.go @@ -198,7 +198,7 @@ type ModuleContext interface { InstallInRecovery() bool InstallInRoot() bool InstallBypassMake() bool - InstallForceOS() *OsType + InstallForceOS() (*OsType, *ArchType) RequiredModuleNames() []string HostRequiredModuleNames() []string @@ -254,7 +254,7 @@ type Module interface { InstallInRecovery() bool InstallInRoot() bool InstallBypassMake() bool - InstallForceOS() *OsType + InstallForceOS() (*OsType, *ArchType) SkipInstall() IsSkipInstall() bool MakeUninstallable() @@ -1120,8 +1120,8 @@ func (m *ModuleBase) InstallBypassMake() bool { return false } -func (m *ModuleBase) InstallForceOS() *OsType { - return nil +func (m *ModuleBase) InstallForceOS() (*OsType, *ArchType) { + return nil, nil } func (m *ModuleBase) Owner() string { @@ -2021,7 +2021,7 @@ func (m *moduleContext) InstallBypassMake() bool { return m.module.InstallBypassMake() } -func (m *moduleContext) InstallForceOS() *OsType { +func (m *moduleContext) InstallForceOS() (*OsType, *ArchType) { return m.module.InstallForceOS() } diff --git a/android/paths.go b/android/paths.go index 6b603ba41..3825d45a4 100644 --- a/android/paths.go +++ b/android/paths.go @@ -61,7 +61,7 @@ type ModuleInstallPathContext interface { InstallInRecovery() bool InstallInRoot() bool InstallBypassMake() bool - InstallForceOS() *OsType + InstallForceOS() (*OsType, *ArchType) } var _ ModuleInstallPathContext = ModuleContext(nil) @@ -1278,12 +1278,17 @@ func (p InstallPath) ToMakePath() InstallPath { // module appended with paths... func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string) InstallPath { os := ctx.Os() - if forceOS := ctx.InstallForceOS(); forceOS != nil { + arch := ctx.Arch().ArchType + forceOS, forceArch := ctx.InstallForceOS() + if forceOS != nil { os = *forceOS } + if forceArch != nil { + arch = *forceArch + } partition := modulePartition(ctx, os) - ret := pathForInstall(ctx, os, partition, ctx.Debug(), pathComponents...) + ret := pathForInstall(ctx, os, arch, partition, ctx.Debug(), pathComponents...) if ctx.InstallBypassMake() && ctx.Config().EmbeddedInMake() { ret = ret.ToMakePath() @@ -1292,7 +1297,7 @@ func PathForModuleInstall(ctx ModuleInstallPathContext, pathComponents ...string return ret } -func pathForInstall(ctx PathContext, os OsType, partition string, debug bool, +func pathForInstall(ctx PathContext, os OsType, arch ArchType, partition string, debug bool, pathComponents ...string) InstallPath { var outPaths []string @@ -1300,15 +1305,21 @@ func pathForInstall(ctx PathContext, os OsType, partition string, debug bool, if os.Class == Device { outPaths = []string{"target", "product", ctx.Config().DeviceName(), partition} } else { - switch os { - case Linux: - outPaths = []string{"host", "linux-x86", partition} - case LinuxBionic: - // TODO: should this be a separate top level, or shared with linux-x86? - outPaths = []string{"host", "linux_bionic-x86", partition} - default: - outPaths = []string{"host", os.String() + "-x86", partition} + osName := os.String() + if os == Linux { + // instead of linux_glibc + osName = "linux" } + // SOONG_HOST_OUT is set to out/host/$(HOST_OS)-$(HOST_PREBUILT_ARCH) + // and HOST_PREBUILT_ARCH is forcibly set to x86 even on x86_64 hosts. We don't seem + // to have a plan to fix it (see the comment in build/make/core/envsetup.mk). + // Let's keep using x86 for the existing cases until we have a need to support + // other architectures. + archName := arch.String() + if os.Class == Host && (arch == X86_64 || arch == Common) { + archName = "x86" + } + outPaths = []string{"host", osName + "-" + archName, partition} } if debug { outPaths = append([]string{"debug"}, outPaths...) diff --git a/android/paths_test.go b/android/paths_test.go index a9cd22bce..d099f6502 100644 --- a/android/paths_test.go +++ b/android/paths_test.go @@ -207,6 +207,7 @@ type moduleInstallPathContextImpl struct { inRecovery bool inRoot bool forceOS *OsType + forceArch *ArchType } func (m moduleInstallPathContextImpl) Config() Config { @@ -243,8 +244,8 @@ func (m moduleInstallPathContextImpl) InstallBypassMake() bool { return false } -func (m moduleInstallPathContextImpl) InstallForceOS() *OsType { - return m.forceOS +func (m moduleInstallPathContextImpl) InstallForceOS() (*OsType, *ArchType) { + return m.forceOS, m.forceArch } func pathTestConfig(buildDir string) Config { @@ -254,8 +255,8 @@ func pathTestConfig(buildDir string) Config { func TestPathForModuleInstall(t *testing.T) { testConfig := pathTestConfig("") - hostTarget := Target{Os: Linux} - deviceTarget := Target{Os: Android} + hostTarget := Target{Os: Linux, Arch: Arch{ArchType: X86}} + deviceTarget := Target{Os: Android, Arch: Arch{ArchType: Arm64}} testCases := []struct { name string @@ -635,6 +636,7 @@ func TestPathForModuleInstall(t *testing.T) { }, inTestcases: true, forceOS: &Linux, + forceArch: &X86, }, in: []string{"my_test", "my_test_bin"}, out: "host/linux-x86/testcases/my_test/my_test_bin", diff --git a/android/test_suites.go b/android/test_suites.go index 79d0fbc60..34e487e8e 100644 --- a/android/test_suites.go +++ b/android/test_suites.go @@ -60,7 +60,7 @@ func robolectricTestSuite(ctx SingletonContext, files map[string]InstallPaths) W for _, module := range SortedStringKeys(files) { installedPaths = append(installedPaths, files[module]...) } - testCasesDir := pathForInstall(ctx, BuildOs, "testcases", false).ToMakePath() + testCasesDir := pathForInstall(ctx, BuildOs, X86, "testcases", false).ToMakePath() outputFile := PathForOutput(ctx, "packaging", "robolectric-tests.zip") rule := NewRuleBuilder() diff --git a/java/robolectric.go b/java/robolectric.go index 3fe6626bb..ec112bc99 100644 --- a/java/robolectric.go +++ b/java/robolectric.go @@ -326,9 +326,11 @@ func RobolectricTestFactory() android.Module { return module } -func (r *robolectricTest) InstallBypassMake() bool { return true } -func (r *robolectricTest) InstallInTestcases() bool { return true } -func (r *robolectricTest) InstallForceOS() *android.OsType { return &android.BuildOs } +func (r *robolectricTest) InstallBypassMake() bool { return true } +func (r *robolectricTest) InstallInTestcases() bool { return true } +func (r *robolectricTest) InstallForceOS() (*android.OsType, *android.ArchType) { + return &android.BuildOs, &android.BuildArch +} func robolectricRuntimesFactory() android.Module { module := &robolectricRuntimes{} @@ -390,6 +392,8 @@ func (r *robolectricRuntimes) GenerateAndroidBuildActions(ctx android.ModuleCont } } -func (r *robolectricRuntimes) InstallBypassMake() bool { return true } -func (r *robolectricRuntimes) InstallInTestcases() bool { return true } -func (r *robolectricRuntimes) InstallForceOS() *android.OsType { return &android.BuildOs } +func (r *robolectricRuntimes) InstallBypassMake() bool { return true } +func (r *robolectricRuntimes) InstallInTestcases() bool { return true } +func (r *robolectricRuntimes) InstallForceOS() (*android.OsType, *android.ArchType) { + return &android.BuildOs, &android.BuildArch +}