Support arch features in bp2build
Bug: 189972518
Test: New soong test
Change-Id: I05d77c8f63ffe6697d8e0300226864658055e116
diff --git a/bazel/configurability.go b/bazel/configurability.go
index d9b0a12..e1cdd4a 100644
--- a/bazel/configurability.go
+++ b/bazel/configurability.go
@@ -16,6 +16,8 @@
import (
"fmt"
+ "math"
+ "sort"
"strings"
)
@@ -69,6 +71,71 @@
AndroidAndNonApex = "android-non_apex"
)
+func PowerSetWithoutEmptySet[T any](items []T) [][]T {
+ resultSize := int(math.Pow(2, float64(len(items))))
+ powerSet := make([][]T, 0, resultSize-1)
+ for i := 1; i < resultSize; i++ {
+ combination := make([]T, 0)
+ for j := 0; j < len(items); j++ {
+ if (i>>j)%2 == 1 {
+ combination = append(combination, items[j])
+ }
+ }
+ powerSet = append(powerSet, combination)
+ }
+ return powerSet
+}
+
+func createPlatformArchMap() map[string]string {
+ // Copy of archFeatures from android/arch_list.go because the bazel
+ // package can't access the android package
+ archFeatures := map[string][]string{
+ "arm": {
+ "neon",
+ },
+ "arm64": {
+ "dotprod",
+ },
+ "x86": {
+ "ssse3",
+ "sse4",
+ "sse4_1",
+ "sse4_2",
+ "aes_ni",
+ "avx",
+ "avx2",
+ "avx512",
+ "popcnt",
+ "movbe",
+ },
+ "x86_64": {
+ "ssse3",
+ "sse4",
+ "sse4_1",
+ "sse4_2",
+ "aes_ni",
+ "avx",
+ "avx2",
+ "avx512",
+ "popcnt",
+ },
+ }
+ result := make(map[string]string)
+ for arch, allFeatures := range archFeatures {
+ result[arch] = "//build/bazel/platforms/arch:" + arch
+ // Sometimes we want to select on multiple features being active, so
+ // add the power set of all possible features to the map. More details
+ // in android.ModuleBase.GetArchVariantProperties
+ for _, features := range PowerSetWithoutEmptySet(allFeatures) {
+ sort.Strings(features)
+ archFeaturesName := arch + "-" + strings.Join(features, "-")
+ result[archFeaturesName] = "//build/bazel/platforms/arch/variants:" + archFeaturesName
+ }
+ }
+ result[ConditionsDefaultConfigKey] = ConditionsDefaultSelectKey
+ return result
+}
+
var (
// These are the list of OSes and architectures with a Bazel config_setting
// and constraint value equivalent. These exist in arch.go, but the android
@@ -77,13 +144,7 @@
// A map of architectures to the Bazel label of the constraint_value
// for the @platforms//cpu:cpu constraint_setting
- platformArchMap = map[string]string{
- archArm: "//build/bazel/platforms/arch:arm",
- archArm64: "//build/bazel/platforms/arch:arm64",
- archX86: "//build/bazel/platforms/arch:x86",
- archX86_64: "//build/bazel/platforms/arch:x86_64",
- ConditionsDefaultConfigKey: ConditionsDefaultSelectKey, // The default condition of as arch select map.
- }
+ platformArchMap = createPlatformArchMap()
// A map of target operating systems to the Bazel label of the
// constraint_value for the @platforms//os:os constraint_setting