diff --git a/android/androidmk.go b/android/androidmk.go index 0afa1bd9d..a40893395 100644 --- a/android/androidmk.go +++ b/android/androidmk.go @@ -197,7 +197,6 @@ func translateAndroidMkModule(ctx blueprint.SingletonContext, w io.Writer, mod b fmt.Fprintln(w, "LOCAL_PATH :=", filepath.Dir(ctx.BlueprintFile(mod))) fmt.Fprintln(w, "LOCAL_MODULE :=", name) fmt.Fprintln(w, "LOCAL_MODULE_CLASS :=", data.Class) - fmt.Fprintln(w, "LOCAL_MULTILIB :=", amod.commonProperties.Compile_multilib) fmt.Fprintln(w, "LOCAL_PREBUILT_MODULE_FILE :=", data.OutputFile.String()) if len(amod.commonProperties.Required) > 0 { diff --git a/android/arch.go b/android/arch.go index 62acb09d8..4f7ffb4ad 100644 --- a/android/arch.go +++ b/android/arch.go @@ -420,7 +420,19 @@ func ArchMutator(mctx BottomUpMutatorContext) { if len(targets) == 0 { continue } - multilib := module.base().commonProperties.Compile_multilib + var multilib string + switch class { + case Device: + multilib = module.base().commonProperties.Target.Android.Compile_multilib + case Host, HostCross: + multilib = module.base().commonProperties.Target.Host.Compile_multilib + } + if multilib == "" { + multilib = module.base().commonProperties.Compile_multilib + } + if multilib == "" { + multilib = module.base().commonProperties.Default_multilib + } targets, err := decodeMultilib(multilib, targets) if err != nil { mctx.ModuleErrorf("%s", err.Error()) @@ -903,6 +915,16 @@ func decodeArch(arch string, archVariant, cpuVariant *string, abi *[]string) (Ar return a, nil } +func filterMultilibTargets(targets []Target, multilib string) []Target { + var ret []Target + for _, t := range targets { + if t.Arch.ArchType.Multilib == multilib { + ret = append(ret, t) + } + } + return ret +} + // Use the module multilib setting to select one or more targets from a target list func decodeMultilib(multilib string, targets []Target) ([]Target, error) { buildTargets := []Target{} @@ -914,19 +936,16 @@ func decodeMultilib(multilib string, targets []Target) ([]Target, error) { case "first": buildTargets = append(buildTargets, targets[0]) case "32": - for _, t := range targets { - if t.Arch.ArchType.Multilib == "lib32" { - buildTargets = append(buildTargets, t) - } - } + buildTargets = filterMultilibTargets(targets, "lib32") case "64": - for _, t := range targets { - if t.Arch.ArchType.Multilib == "lib64" { - buildTargets = append(buildTargets, t) - } + buildTargets = filterMultilibTargets(targets, "lib64") + case "prefer32": + buildTargets = filterMultilibTargets(targets, "lib32") + if len(buildTargets) == 0 { + buildTargets = filterMultilibTargets(targets, "lib64") } default: - return nil, fmt.Errorf(`compile_multilib must be "both", "first", "32", or "64", found %q`, + return nil, fmt.Errorf(`compile_multilib must be "both", "first", "32", "64", or "prefer32" found %q`, multilib) } diff --git a/android/module.go b/android/module.go index 45afec146..aaaa2fbf2 100644 --- a/android/module.go +++ b/android/module.go @@ -118,7 +118,18 @@ type commonProperties struct { // are "32" (compile for 32-bit only), "64" (compile for 64-bit only), "both" (compile for both // architectures), or "first" (compile for 64-bit on a 64-bit platform, and 32-bit on a 32-bit // platform - Compile_multilib string + Compile_multilib string `android:"arch_variant"` + + Target struct { + Host struct { + Compile_multilib string + } + Android struct { + Compile_multilib string + } + } + + Default_multilib string `blueprint:"mutated"` // whether this is a proprietary vendor module, and should be installed into /vendor Proprietary bool @@ -182,7 +193,7 @@ func InitAndroidArchModule(m Module, hod HostOrDeviceSupported, defaultMultilib base := m.base() base.commonProperties.HostOrDeviceSupported = hod - base.commonProperties.Compile_multilib = string(defaultMultilib) + base.commonProperties.Default_multilib = string(defaultMultilib) switch hod { case HostAndDeviceSupported: