diff options
author | Liz Kammer <eakammer@google.com> | 2022-02-16 16:50:50 -0500 |
---|---|---|
committer | Liz Kammer <eakammer@google.com> | 2022-03-01 10:32:33 -0500 |
commit | a0b54dd5ee3718b1e4b17be619d664d255de95e7 (patch) | |
tree | 4f3a9b9cecca24b79fa190b7ed3a1b7be6b46a69 /platforms | |
parent | 8492edc8eec73ad55d5a5751f01047f4ab97a721 (diff) | |
download | bazel-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.bazel | 10 | ||||
-rw-r--r-- | platforms/arch/BUILD | 1 | ||||
-rw-r--r-- | platforms/arch/variants/BUILD | 89 | ||||
-rw-r--r-- | platforms/arch/variants/constants.bzl | 44 | ||||
-rw-r--r-- | platforms/product_variables/product_platform.bzl | 38 |
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( |