# Cpu/Arch Variants and features

load("//build/bazel/product_variables:constants.bzl", _product_variable_constants = "constants")
load(":constants.bzl", "constants", "power_set")
load(":constants_test.bzl", "power_set_test_suite")

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 = arch + "-" + "-".join(sorted(features)),
            constraint_values = [
                _product_variable_constants.ArchVariantToConstraints[arch],
            ] + [":" + feature for feature in features],
        )
        for features in power_set(
            all_features,
            include_empty = False,
        )
    ]
    for arch, all_features in constants.ArchToFeatures.items()
]

power_set_test_suite(name = "power_set_tests")
