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 +}