aboutsummaryrefslogtreecommitdiff
path: root/platforms
diff options
context:
space:
mode:
authorLiz Kammer <eakammer@google.com>2022-02-16 16:50:50 -0500
committerLiz Kammer <eakammer@google.com>2022-03-01 10:32:33 -0500
commita0b54dd5ee3718b1e4b17be619d664d255de95e7 (patch)
tree4f3a9b9cecca24b79fa190b7ed3a1b7be6b46a69 /platforms
parent8492edc8eec73ad55d5a5751f01047f4ab97a721 (diff)
downloadbazel-a0b54dd5ee3718b1e4b17be619d664d255de95e7.tar.gz
Support arch/cpu variants/features in Bazel.
Test: bp2build.sh Change-Id: I030e570296a12d3bc5f5832a3ec94461798a7e8d
Diffstat (limited to 'platforms')
-rw-r--r--platforms/BUILD.bazel10
-rw-r--r--platforms/arch/BUILD1
-rw-r--r--platforms/arch/variants/BUILD89
-rw-r--r--platforms/arch/variants/constants.bzl44
-rw-r--r--platforms/product_variables/product_platform.bzl38
5 files changed, 175 insertions, 7 deletions
diff --git a/platforms/BUILD.bazel b/platforms/BUILD.bazel
index 0eaf477d..b1bbe5f3 100644
--- a/platforms/BUILD.bazel
+++ b/platforms/BUILD.bazel
@@ -12,7 +12,7 @@
# These model after the arch and OS definitions in build/soong/android/arch.go.
load("@soong_injection//product_config:product_variables.bzl", "product_vars")
-load("//build/bazel/platforms:product_variables/product_platform.bzl", "android_platform", "product_variable_config")
+load("//build/bazel/platforms:product_variables/product_platform.bzl", "android_platform", "android_variant_constraints", "product_variable_config")
package(default_visibility = ["//visibility:public"])
@@ -106,7 +106,7 @@ android_platform(
constraint_values = [
"//build/bazel/platforms/arch:arm",
"//build/bazel/platforms/os:android",
- ],
+ ] + android_variant_constraints("arm", "armv7-a-neon"), # default to armv7-a-neon
product = ":android_target",
)
@@ -115,7 +115,7 @@ android_platform(
constraint_values = [
"//build/bazel/platforms/arch:arm64",
"//build/bazel/platforms/os:android",
- ],
+ ] + android_variant_constraints("arm64", "armv8-a"), # default to armv8-a
product = ":android_target",
)
@@ -124,7 +124,7 @@ android_platform(
constraint_values = [
"//build/bazel/platforms/arch:x86",
"//build/bazel/platforms/os:android",
- ],
+ ] + android_variant_constraints("x86"),
product = ":android_target",
)
@@ -133,6 +133,6 @@ android_platform(
constraint_values = [
"//build/bazel/platforms/arch:x86_64",
"//build/bazel/platforms/os:android",
- ],
+ ] + android_variant_constraints("x86_64"),
product = ":android_target",
)
diff --git a/platforms/arch/BUILD b/platforms/arch/BUILD
index c0fdf7cd..35df294f 100644
--- a/platforms/arch/BUILD
+++ b/platforms/arch/BUILD
@@ -1,4 +1,5 @@
# Standard cpu name constraint_setting and constraint_values
+
licenses(["notice"])
package(
diff --git a/platforms/arch/variants/BUILD b/platforms/arch/variants/BUILD
new file mode 100644
index 00000000..0b722b6b
--- /dev/null
+++ b/platforms/arch/variants/BUILD
@@ -0,0 +1,89 @@
+# Cpu/Arch Variants and features
+
+load("//build/bazel/product_variables:constants.bzl", _product_variable_constants = "constants")
+load(":constants.bzl", "constants")
+
+constraint_setting(
+ name = "arch_variant_constraint",
+)
+
+licenses(["notice"])
+
+package(
+ default_visibility = ["//visibility:public"],
+)
+
+[
+ constraint_value(
+ name = arch_variant,
+ constraint_setting = "arch_variant_constraint",
+ )
+ for arch_variant in constants.AvailableArchVariants
+]
+
+[
+ [
+ config_setting(
+ name = variant + "-" + arch,
+ constraint_values = [
+ _product_variable_constants.ArchVariantToConstraints[arch],
+ ":" + variant,
+ ],
+ )
+ for variant in variants
+ ]
+ for arch, variants in constants.ArchToVariants.items()
+]
+
+constraint_setting(
+ name = "cpu_variant_constraint",
+)
+
+[
+ constraint_value(
+ name = cpu_variant,
+ constraint_setting = "cpu_variant_constraint",
+ )
+ for cpu_variant in constants.AvailableCpuVariants
+]
+
+[
+ [
+ config_setting(
+ name = variant + "-" + arch,
+ constraint_values = [
+ _product_variable_constants.ArchVariantToConstraints[arch],
+ ":" + variant,
+ ],
+ )
+ for variant in variants
+ ]
+ for arch, variants in constants.CpuToVariants.items()
+]
+
+[
+ (
+ constraint_setting(
+ name = "arch_feature_constraint_" + arch_feature,
+ ),
+ constraint_value(
+ name = arch_feature,
+ constraint_setting = "arch_feature_constraint_" + arch_feature,
+ ),
+ )
+ for arch_feature in constants.AvailableArchFeatures
+]
+
+[
+ [
+ config_setting(
+ name = feature + "-" + arch,
+ constraint_values = [
+ _product_variable_constants.ArchVariantToConstraints[arch],
+ ":" + feature,
+ ],
+ )
+ for feature in features
+ ]
+ for arch, features in constants.ArchToFeatures.items()
+]
diff --git a/platforms/arch/variants/constants.bzl b/platforms/arch/variants/constants.bzl
new file mode 100644
index 00000000..1e5feb94
--- /dev/null
+++ b/platforms/arch/variants/constants.bzl
@@ -0,0 +1,44 @@
+"""Constants for arch/cpu variants/features."""
+
+# Copyright (C) 2022 The Android Open Source Project
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+load(
+ "@soong_injection//product_config:arch_configuration.bzl",
+ _android_arch_feature_for_arch_variant = "android_arch_feature_for_arch_variants",
+ _arch_to_cpu_variants = "arch_to_cpu_variants",
+ _arch_to_features = "arch_to_features",
+ _arch_to_variants = "arch_to_variants",
+)
+
+def _flatten_string_list_dict_to_set(string_list_dict):
+ ret = {}
+ for l in string_list_dict.values():
+ for i in l:
+ ret[i] = True
+ return ret
+
+_arch_variants = _flatten_string_list_dict_to_set(_arch_to_variants)
+_cpu_variants = _flatten_string_list_dict_to_set(_arch_to_cpu_variants)
+_arch_features = _flatten_string_list_dict_to_set(_arch_to_features)
+
+constants = struct(
+ AvailableArchVariants = _arch_variants,
+ AvailableCpuVariants = _cpu_variants,
+ AvailableArchFeatures = _arch_features,
+ ArchToVariants = _arch_to_variants,
+ CpuToVariants = _arch_to_cpu_variants,
+ ArchToFeatures = _arch_to_features,
+ AndroidArchToVariantToFeatures = _android_arch_feature_for_arch_variant,
+)
diff --git a/platforms/product_variables/product_platform.bzl b/platforms/product_variables/product_platform.bzl
index 28629d01..b04ae947 100644
--- a/platforms/product_variables/product_platform.bzl
+++ b/platforms/product_variables/product_platform.bzl
@@ -1,6 +1,7 @@
"""Parallels variable.go to provide variables and create a platform based on converted config."""
load("//build/bazel/product_variables:constants.bzl", "constants")
+load("//build/bazel/platforms/arch/variants:constants.bzl", _arch_constants = "constants")
def _product_variables_providing_rule_impl(ctx):
return [
@@ -76,7 +77,6 @@ def product_variable_config(name, product_config_vars):
constraints.append("//build/bazel/product_variables:" + constraint_var)
add_providing_var(providing_vars, "string", constraint_var, value)
-
for (var, value) in local_vars.items():
# TODO(b/187323817): determine how to handle remaining product
# variables not used in product_variables
@@ -100,6 +100,9 @@ def product_variable_config(name, product_config_vars):
)
arch = local_vars.get("DeviceArch")
+ arch_variant = local_vars.get("DeviceArchVariant")
+ cpu_variant = local_vars.get("DeviceCpuVariant")
+
os = "android"
native.platform(
@@ -107,14 +110,45 @@ def product_variable_config(name, product_config_vars):
constraint_values = constraints + [
"//build/bazel/platforms/arch:" + arch,
"//build/bazel/platforms/os:" + os,
- ],
+ ] + android_variant_constraints(arch, arch_variant, cpu_variant),
)
+ arch = local_vars.get("DeviceSecondaryArch")
+ arch_variant = local_vars.get("DeviceSecondaryArchVariant")
+ cpu_variant = local_vars.get("DeviceSecondaryCpuVariant")
+
+ if arch:
+ native.platform(
+ name = name + "_secondary",
+ constraint_values = constraints + [
+ "//build/bazel/platforms/arch:" + arch,
+ "//build/bazel/platforms/os:" + os,
+ ] + android_variant_constraints(arch, arch_variant, cpu_variant),
+ )
+
product_variables_providing_rule(
name = name + "_product_vars",
product_vars = providing_vars,
)
+def _is_variant_default(arch, variant):
+ return variant == None or variant in (arch, "generic")
+
+def android_variant_constraints(arch, arch_variant = None, cpu_variant = None):
+ additional_constraints = []
+ if not _is_variant_default(arch, arch_variant):
+ additional_constraints.append("//build/bazel/platforms/arch/variants:" + arch_variant)
+ else:
+ arch_variant = ""
+
+ features = _arch_constants.AndroidArchToVariantToFeatures[arch].get(arch_variant, [])
+ for feature in features:
+ additional_constraints.append("//build/bazel/platforms/arch/variants:" + feature)
+
+ if not _is_variant_default(arch, cpu_variant):
+ additional_constraints.append("//build/bazel/platforms/arch/variants:" + cpu_variant)
+ return additional_constraints
+
def android_platform(name = None, constraint_values = [], product = None):
""" android_platform creates a platform with the specified constraint_values and product constraints."""
native.platform(