Loading Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -444,6 +444,7 @@ toolchain_library { defaults: ["linux_bionic_supported"], vendor_available: true, recovery_available: true, native_bridge_supported: true, arch: { arm: { Loading @@ -466,6 +467,7 @@ toolchain_library { defaults: ["linux_bionic_supported"], vendor_available: true, recovery_available: true, native_bridge_supported: true, arch: { arm: { Loading android/androidmk.go +24 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,10 @@ import ( "github.com/google/blueprint/bootstrap" ) var ( NativeBridgeSuffix = ".native_bridge" ) func init() { RegisterSingletonType("androidmk", AndroidMkSingleton) } Loading Loading @@ -161,6 +165,10 @@ func (a *AndroidMkEntries) fillInEntries(config Config, bpPath string, mod bluep } } if amod.Target().NativeBridge { a.SubName += NativeBridgeSuffix } fmt.Fprintln(&a.header, "\ninclude $(CLEAR_VARS)") // Collect make variable assignment entries. Loading Loading @@ -190,8 +198,23 @@ func (a *AndroidMkEntries) fillInEntries(config Config, bpPath string, mod bluep case Device: // Make cannot identify LOCAL_MODULE_TARGET_ARCH:= common. if archStr != "common" { if amod.Target().NativeBridge { // TODO: Unhardcode these rules. guestArchStr := archStr hostArchStr := "" if guestArchStr == "arm" { hostArchStr = "x86" } else if guestArchStr == "arm64" { hostArchStr = "x86_64" } if hostArchStr != "" { a.SetString("LOCAL_MODULE_TARGET_ARCH", hostArchStr) } } else { a.SetString("LOCAL_MODULE_TARGET_ARCH", archStr) } } a.AddStrings("LOCAL_INIT_RC", amod.commonProperties.Init_rc...) a.AddStrings("LOCAL_VINTF_FRAGMENTS", amod.commonProperties.Vintf_fragments...) Loading android/arch.go +53 −13 Original line number Diff line number Diff line Loading @@ -683,13 +683,25 @@ func osByName(name string) OsType { return NoOsType } type NativeBridgeSupport bool const ( NativeBridgeDisabled NativeBridgeSupport = false NativeBridgeEnabled NativeBridgeSupport = true ) type Target struct { Os OsType Arch Arch NativeBridge NativeBridgeSupport } func (target Target) String() string { return target.Os.String() + "_" + target.Arch.String() variant := "" if target.NativeBridge { variant = "native_bridge_" } return target.Os.String() + "_" + variant + target.Arch.String() } // archMutator splits a module into a variant for each Target requested by the module. Target selection Loading Loading @@ -750,6 +762,18 @@ func archMutator(mctx BottomUpMutatorContext) { continue } // Filter NativeBridge targets unless they are explicitly supported if os == Android && !Bool(base.commonProperties.Native_bridge_supported) { var targets []Target for _, t := range osTargets { if !t.NativeBridge { targets = append(targets, t) } } osTargets = targets } // only the primary arch in the recovery partition if os == Android && module.InstallInRecovery() { osTargets = []Target{osTargets[0]} Loading Loading @@ -1378,7 +1402,8 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { targets := make(map[OsType][]Target) var targetErr error addTarget := func(os OsType, archName string, archVariant, cpuVariant *string, abi []string) { addTarget := func(os OsType, archName string, archVariant, cpuVariant *string, abi []string, nativeBridgeEnabled NativeBridgeSupport) { if targetErr != nil { return } Loading @@ -1393,6 +1418,7 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { Target{ Os: os, Arch: arch, NativeBridge: nativeBridgeEnabled, }) } Loading @@ -1400,14 +1426,14 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { return nil, fmt.Errorf("No host primary architecture set") } addTarget(BuildOs, *variables.HostArch, nil, nil, nil) addTarget(BuildOs, *variables.HostArch, nil, nil, nil, NativeBridgeDisabled) if variables.HostSecondaryArch != nil && *variables.HostSecondaryArch != "" { addTarget(BuildOs, *variables.HostSecondaryArch, nil, nil, nil) addTarget(BuildOs, *variables.HostSecondaryArch, nil, nil, nil, NativeBridgeDisabled) } if Bool(config.Host_bionic) { addTarget(LinuxBionic, "x86_64", nil, nil, nil) addTarget(LinuxBionic, "x86_64", nil, nil, nil, NativeBridgeDisabled) } if String(variables.CrossHost) != "" { Loading @@ -1420,10 +1446,10 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { return nil, fmt.Errorf("No cross-host primary architecture set") } addTarget(crossHostOs, *variables.CrossHostArch, nil, nil, nil) addTarget(crossHostOs, *variables.CrossHostArch, nil, nil, nil, NativeBridgeDisabled) if variables.CrossHostSecondaryArch != nil && *variables.CrossHostSecondaryArch != "" { addTarget(crossHostOs, *variables.CrossHostSecondaryArch, nil, nil, nil) addTarget(crossHostOs, *variables.CrossHostSecondaryArch, nil, nil, nil, NativeBridgeDisabled) } } Loading @@ -1434,18 +1460,32 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { } addTarget(target, *variables.DeviceArch, variables.DeviceArchVariant, variables.DeviceCpuVariant, variables.DeviceAbi) variables.DeviceCpuVariant, variables.DeviceAbi, NativeBridgeDisabled) if variables.DeviceSecondaryArch != nil && *variables.DeviceSecondaryArch != "" { addTarget(Android, *variables.DeviceSecondaryArch, variables.DeviceSecondaryArchVariant, variables.DeviceSecondaryCpuVariant, variables.DeviceSecondaryAbi) variables.DeviceSecondaryAbi, NativeBridgeDisabled) deviceArches := targets[Android] if deviceArches[0].Arch.ArchType.Multilib == deviceArches[1].Arch.ArchType.Multilib { deviceArches[1].Arch.Native = false } } if variables.NativeBridgeArch != nil && *variables.NativeBridgeArch != "" { addTarget(Android, *variables.NativeBridgeArch, variables.NativeBridgeArchVariant, variables.NativeBridgeCpuVariant, variables.NativeBridgeAbi, NativeBridgeEnabled) } if variables.DeviceSecondaryArch != nil && *variables.DeviceSecondaryArch != "" && variables.NativeBridgeSecondaryArch != nil && *variables.NativeBridgeSecondaryArch != "" { addTarget(Android, *variables.NativeBridgeSecondaryArch, variables.NativeBridgeSecondaryArchVariant, variables.NativeBridgeSecondaryCpuVariant, variables.NativeBridgeSecondaryAbi, NativeBridgeEnabled) } } if targetErr != nil { Loading android/config.go +26 −6 Original line number Diff line number Diff line Loading @@ -234,16 +234,36 @@ func TestConfig(buildDir string, env map[string]string) Config { return Config{config} } func TestArchConfigNativeBridge(buildDir string, env map[string]string) Config { testConfig := TestConfig(buildDir, env) config := testConfig.config config.Targets = map[OsType][]Target{ Android: []Target{ {Android, Arch{ArchType: X86_64, ArchVariant: "silvermont", Native: true, Abi: []string{"arm64-v8a"}}, NativeBridgeDisabled}, {Android, Arch{ArchType: X86, ArchVariant: "silvermont", Native: true, Abi: []string{"armeabi-v7a"}}, NativeBridgeDisabled}, {Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Native: true, Abi: []string{"arm64-v8a"}}, NativeBridgeEnabled}, {Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Native: true, Abi: []string{"armeabi-v7a"}}, NativeBridgeEnabled}, }, BuildOs: []Target{ {BuildOs, Arch{ArchType: X86_64}, NativeBridgeDisabled}, {BuildOs, Arch{ArchType: X86}, NativeBridgeDisabled}, }, } return testConfig } func TestArchConfigFuchsia(buildDir string, env map[string]string) Config { testConfig := TestConfig(buildDir, env) config := testConfig.config config.Targets = map[OsType][]Target{ Fuchsia: []Target{ {Fuchsia, Arch{ArchType: Arm64, ArchVariant: "", Native: true}}, {Fuchsia, Arch{ArchType: Arm64, ArchVariant: "", Native: true}, NativeBridgeDisabled}, }, BuildOs: []Target{ {BuildOs, Arch{ArchType: X86_64}}, {BuildOs, Arch{ArchType: X86_64}, NativeBridgeDisabled}, }, } Loading @@ -257,12 +277,12 @@ func TestArchConfig(buildDir string, env map[string]string) Config { config.Targets = map[OsType][]Target{ Android: []Target{ {Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Native: true, Abi: []string{"arm64-v8a"}}}, {Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Native: true, Abi: []string{"armeabi-v7a"}}}, {Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Native: true, Abi: []string{"arm64-v8a"}}, NativeBridgeDisabled}, {Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Native: true, Abi: []string{"armeabi-v7a"}}, NativeBridgeDisabled}, }, BuildOs: []Target{ {BuildOs, Arch{ArchType: X86_64}}, {BuildOs, Arch{ArchType: X86}}, {BuildOs, Arch{ArchType: X86_64}, NativeBridgeDisabled}, {BuildOs, Arch{ArchType: X86}, NativeBridgeDisabled}, }, } Loading android/module.go +3 −0 Original line number Diff line number Diff line Loading @@ -290,6 +290,9 @@ type commonProperties struct { // Whether this module is installed to recovery partition Recovery *bool // Whether this module is built for non-native architecures (also known as native bridge binary) Native_bridge_supported *bool `android:"arch_variant"` // init.rc files to be installed if this module is installed Init_rc []string `android:"path"` Loading Loading
Android.bp +2 −0 Original line number Diff line number Diff line Loading @@ -444,6 +444,7 @@ toolchain_library { defaults: ["linux_bionic_supported"], vendor_available: true, recovery_available: true, native_bridge_supported: true, arch: { arm: { Loading @@ -466,6 +467,7 @@ toolchain_library { defaults: ["linux_bionic_supported"], vendor_available: true, recovery_available: true, native_bridge_supported: true, arch: { arm: { Loading
android/androidmk.go +24 −1 Original line number Diff line number Diff line Loading @@ -28,6 +28,10 @@ import ( "github.com/google/blueprint/bootstrap" ) var ( NativeBridgeSuffix = ".native_bridge" ) func init() { RegisterSingletonType("androidmk", AndroidMkSingleton) } Loading Loading @@ -161,6 +165,10 @@ func (a *AndroidMkEntries) fillInEntries(config Config, bpPath string, mod bluep } } if amod.Target().NativeBridge { a.SubName += NativeBridgeSuffix } fmt.Fprintln(&a.header, "\ninclude $(CLEAR_VARS)") // Collect make variable assignment entries. Loading Loading @@ -190,8 +198,23 @@ func (a *AndroidMkEntries) fillInEntries(config Config, bpPath string, mod bluep case Device: // Make cannot identify LOCAL_MODULE_TARGET_ARCH:= common. if archStr != "common" { if amod.Target().NativeBridge { // TODO: Unhardcode these rules. guestArchStr := archStr hostArchStr := "" if guestArchStr == "arm" { hostArchStr = "x86" } else if guestArchStr == "arm64" { hostArchStr = "x86_64" } if hostArchStr != "" { a.SetString("LOCAL_MODULE_TARGET_ARCH", hostArchStr) } } else { a.SetString("LOCAL_MODULE_TARGET_ARCH", archStr) } } a.AddStrings("LOCAL_INIT_RC", amod.commonProperties.Init_rc...) a.AddStrings("LOCAL_VINTF_FRAGMENTS", amod.commonProperties.Vintf_fragments...) Loading
android/arch.go +53 −13 Original line number Diff line number Diff line Loading @@ -683,13 +683,25 @@ func osByName(name string) OsType { return NoOsType } type NativeBridgeSupport bool const ( NativeBridgeDisabled NativeBridgeSupport = false NativeBridgeEnabled NativeBridgeSupport = true ) type Target struct { Os OsType Arch Arch NativeBridge NativeBridgeSupport } func (target Target) String() string { return target.Os.String() + "_" + target.Arch.String() variant := "" if target.NativeBridge { variant = "native_bridge_" } return target.Os.String() + "_" + variant + target.Arch.String() } // archMutator splits a module into a variant for each Target requested by the module. Target selection Loading Loading @@ -750,6 +762,18 @@ func archMutator(mctx BottomUpMutatorContext) { continue } // Filter NativeBridge targets unless they are explicitly supported if os == Android && !Bool(base.commonProperties.Native_bridge_supported) { var targets []Target for _, t := range osTargets { if !t.NativeBridge { targets = append(targets, t) } } osTargets = targets } // only the primary arch in the recovery partition if os == Android && module.InstallInRecovery() { osTargets = []Target{osTargets[0]} Loading Loading @@ -1378,7 +1402,8 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { targets := make(map[OsType][]Target) var targetErr error addTarget := func(os OsType, archName string, archVariant, cpuVariant *string, abi []string) { addTarget := func(os OsType, archName string, archVariant, cpuVariant *string, abi []string, nativeBridgeEnabled NativeBridgeSupport) { if targetErr != nil { return } Loading @@ -1393,6 +1418,7 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { Target{ Os: os, Arch: arch, NativeBridge: nativeBridgeEnabled, }) } Loading @@ -1400,14 +1426,14 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { return nil, fmt.Errorf("No host primary architecture set") } addTarget(BuildOs, *variables.HostArch, nil, nil, nil) addTarget(BuildOs, *variables.HostArch, nil, nil, nil, NativeBridgeDisabled) if variables.HostSecondaryArch != nil && *variables.HostSecondaryArch != "" { addTarget(BuildOs, *variables.HostSecondaryArch, nil, nil, nil) addTarget(BuildOs, *variables.HostSecondaryArch, nil, nil, nil, NativeBridgeDisabled) } if Bool(config.Host_bionic) { addTarget(LinuxBionic, "x86_64", nil, nil, nil) addTarget(LinuxBionic, "x86_64", nil, nil, nil, NativeBridgeDisabled) } if String(variables.CrossHost) != "" { Loading @@ -1420,10 +1446,10 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { return nil, fmt.Errorf("No cross-host primary architecture set") } addTarget(crossHostOs, *variables.CrossHostArch, nil, nil, nil) addTarget(crossHostOs, *variables.CrossHostArch, nil, nil, nil, NativeBridgeDisabled) if variables.CrossHostSecondaryArch != nil && *variables.CrossHostSecondaryArch != "" { addTarget(crossHostOs, *variables.CrossHostSecondaryArch, nil, nil, nil) addTarget(crossHostOs, *variables.CrossHostSecondaryArch, nil, nil, nil, NativeBridgeDisabled) } } Loading @@ -1434,18 +1460,32 @@ func decodeTargetProductVariables(config *config) (map[OsType][]Target, error) { } addTarget(target, *variables.DeviceArch, variables.DeviceArchVariant, variables.DeviceCpuVariant, variables.DeviceAbi) variables.DeviceCpuVariant, variables.DeviceAbi, NativeBridgeDisabled) if variables.DeviceSecondaryArch != nil && *variables.DeviceSecondaryArch != "" { addTarget(Android, *variables.DeviceSecondaryArch, variables.DeviceSecondaryArchVariant, variables.DeviceSecondaryCpuVariant, variables.DeviceSecondaryAbi) variables.DeviceSecondaryAbi, NativeBridgeDisabled) deviceArches := targets[Android] if deviceArches[0].Arch.ArchType.Multilib == deviceArches[1].Arch.ArchType.Multilib { deviceArches[1].Arch.Native = false } } if variables.NativeBridgeArch != nil && *variables.NativeBridgeArch != "" { addTarget(Android, *variables.NativeBridgeArch, variables.NativeBridgeArchVariant, variables.NativeBridgeCpuVariant, variables.NativeBridgeAbi, NativeBridgeEnabled) } if variables.DeviceSecondaryArch != nil && *variables.DeviceSecondaryArch != "" && variables.NativeBridgeSecondaryArch != nil && *variables.NativeBridgeSecondaryArch != "" { addTarget(Android, *variables.NativeBridgeSecondaryArch, variables.NativeBridgeSecondaryArchVariant, variables.NativeBridgeSecondaryCpuVariant, variables.NativeBridgeSecondaryAbi, NativeBridgeEnabled) } } if targetErr != nil { Loading
android/config.go +26 −6 Original line number Diff line number Diff line Loading @@ -234,16 +234,36 @@ func TestConfig(buildDir string, env map[string]string) Config { return Config{config} } func TestArchConfigNativeBridge(buildDir string, env map[string]string) Config { testConfig := TestConfig(buildDir, env) config := testConfig.config config.Targets = map[OsType][]Target{ Android: []Target{ {Android, Arch{ArchType: X86_64, ArchVariant: "silvermont", Native: true, Abi: []string{"arm64-v8a"}}, NativeBridgeDisabled}, {Android, Arch{ArchType: X86, ArchVariant: "silvermont", Native: true, Abi: []string{"armeabi-v7a"}}, NativeBridgeDisabled}, {Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Native: true, Abi: []string{"arm64-v8a"}}, NativeBridgeEnabled}, {Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Native: true, Abi: []string{"armeabi-v7a"}}, NativeBridgeEnabled}, }, BuildOs: []Target{ {BuildOs, Arch{ArchType: X86_64}, NativeBridgeDisabled}, {BuildOs, Arch{ArchType: X86}, NativeBridgeDisabled}, }, } return testConfig } func TestArchConfigFuchsia(buildDir string, env map[string]string) Config { testConfig := TestConfig(buildDir, env) config := testConfig.config config.Targets = map[OsType][]Target{ Fuchsia: []Target{ {Fuchsia, Arch{ArchType: Arm64, ArchVariant: "", Native: true}}, {Fuchsia, Arch{ArchType: Arm64, ArchVariant: "", Native: true}, NativeBridgeDisabled}, }, BuildOs: []Target{ {BuildOs, Arch{ArchType: X86_64}}, {BuildOs, Arch{ArchType: X86_64}, NativeBridgeDisabled}, }, } Loading @@ -257,12 +277,12 @@ func TestArchConfig(buildDir string, env map[string]string) Config { config.Targets = map[OsType][]Target{ Android: []Target{ {Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Native: true, Abi: []string{"arm64-v8a"}}}, {Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Native: true, Abi: []string{"armeabi-v7a"}}}, {Android, Arch{ArchType: Arm64, ArchVariant: "armv8-a", Native: true, Abi: []string{"arm64-v8a"}}, NativeBridgeDisabled}, {Android, Arch{ArchType: Arm, ArchVariant: "armv7-a-neon", Native: true, Abi: []string{"armeabi-v7a"}}, NativeBridgeDisabled}, }, BuildOs: []Target{ {BuildOs, Arch{ArchType: X86_64}}, {BuildOs, Arch{ArchType: X86}}, {BuildOs, Arch{ArchType: X86_64}, NativeBridgeDisabled}, {BuildOs, Arch{ArchType: X86}, NativeBridgeDisabled}, }, } Loading
android/module.go +3 −0 Original line number Diff line number Diff line Loading @@ -290,6 +290,9 @@ type commonProperties struct { // Whether this module is installed to recovery partition Recovery *bool // Whether this module is built for non-native architecures (also known as native bridge binary) Native_bridge_supported *bool `android:"arch_variant"` // init.rc files to be installed if this module is installed Init_rc []string `android:"path"` Loading