aboutsummaryrefslogtreecommitdiffstats
path: root/android/arch.go
diff options
context:
space:
mode:
Diffstat (limited to 'android/arch.go')
-rw-r--r--android/arch.go38
1 files changed, 31 insertions, 7 deletions
diff --git a/android/arch.go b/android/arch.go
index f0f0ea36..b653ce6b 100644
--- a/android/arch.go
+++ b/android/arch.go
@@ -274,6 +274,7 @@ func ArchMutator(mctx BottomUpMutatorContext) {
}
var moduleTargets []Target
+ primaryModules := make(map[int]bool)
for _, class := range osClasses {
targets := mctx.AConfig().Targets[class]
@@ -293,11 +294,18 @@ func ArchMutator(mctx BottomUpMutatorContext) {
if multilib == "" {
multilib = module.base().commonProperties.Default_multilib
}
- targets, err := decodeMultilib(multilib, targets)
+ prefer32 := false
+ if class == Device {
+ prefer32 = mctx.AConfig().DevicePrefer32BitExecutables()
+ }
+ targets, err := decodeMultilib(multilib, targets, prefer32)
if err != nil {
mctx.ModuleErrorf("%s", err.Error())
}
- moduleTargets = append(moduleTargets, targets...)
+ if len(targets) > 0 {
+ primaryModules[len(moduleTargets)] = true
+ moduleTargets = append(moduleTargets, targets...)
+ }
}
if len(moduleTargets) == 0 {
@@ -313,7 +321,7 @@ func ArchMutator(mctx BottomUpMutatorContext) {
modules := mctx.CreateVariations(targetNames...)
for i, m := range modules {
- m.(Module).base().SetTarget(moduleTargets[i])
+ m.(Module).base().SetTarget(moduleTargets[i], primaryModules[i])
m.(Module).base().setArchProperties(mctx)
}
}
@@ -915,15 +923,26 @@ func filterMultilibTargets(targets []Target, multilib string) []Target {
}
// Use the module multilib setting to select one or more targets from a target list
-func decodeMultilib(multilib string, targets []Target) ([]Target, error) {
+func decodeMultilib(multilib string, targets []Target, prefer32 bool) ([]Target, error) {
buildTargets := []Target{}
+ if multilib == "first" {
+ if prefer32 {
+ multilib = "prefer32"
+ } else {
+ multilib = "prefer64"
+ }
+ }
switch multilib {
case "common":
buildTargets = append(buildTargets, commonTarget)
case "both":
- buildTargets = append(buildTargets, targets...)
- case "first":
- buildTargets = append(buildTargets, targets[0])
+ if prefer32 {
+ buildTargets = append(buildTargets, filterMultilibTargets(targets, "lib32")...)
+ buildTargets = append(buildTargets, filterMultilibTargets(targets, "lib64")...)
+ } else {
+ buildTargets = append(buildTargets, filterMultilibTargets(targets, "lib64")...)
+ buildTargets = append(buildTargets, filterMultilibTargets(targets, "lib32")...)
+ }
case "32":
buildTargets = filterMultilibTargets(targets, "lib32")
case "64":
@@ -933,6 +952,11 @@ func decodeMultilib(multilib string, targets []Target) ([]Target, error) {
if len(buildTargets) == 0 {
buildTargets = filterMultilibTargets(targets, "lib64")
}
+ case "prefer64":
+ buildTargets = filterMultilibTargets(targets, "lib64")
+ if len(buildTargets) == 0 {
+ buildTargets = filterMultilibTargets(targets, "lib32")
+ }
default:
return nil, fmt.Errorf(`compile_multilib must be "both", "first", "32", "64", or "prefer32" found %q`,
multilib)