blob: a846a1d2d6561bc795f06b216cdfe7a5f1a6b917 [file] [log] [blame]
load("@bazel_skylib//lib:selects.bzl", "selects")
load("@rules_cc//cc:defs.bzl", "cc_test")
package(default_visibility = ["//visibility:public"])
licenses(["notice"])
exports_files(["LICENSE"])
# Detect compiler:
config_setting(
name = "compiler_clang",
flag_values = {"@bazel_tools//tools/cpp:compiler": "clang"},
)
config_setting(
name = "compiler_msvc",
flag_values = {"@bazel_tools//tools/cpp:compiler": "msvc"},
)
# See https://github.com/bazelbuild/bazel/issues/12707
config_setting(
name = "compiler_gcc_bug",
flag_values = {
"@bazel_tools//tools/cpp:compiler": "compiler",
},
)
config_setting(
name = "compiler_gcc_actual",
flag_values = {
"@bazel_tools//tools/cpp:compiler": "gcc",
},
)
selects.config_setting_group(
name = "compiler_gcc",
match_any = [
":compiler_gcc_bug",
":compiler_gcc_actual",
],
)
config_setting(
name = "emulate_sve",
values = {
"copt": "-DHWY_EMULATE_SVE",
},
)
# Additional warnings for Clang OR GCC (skip for MSVC)
CLANG_GCC_COPTS = [
"-Werror",
"-Wunused-parameter",
"-Wunused-variable",
"-Wextra-semi",
"-Wunreachable-code",
]
# Additional warnings only supported by Clang
CLANG_ONLY_COPTS = [
"-Wfloat-overflow-conversion",
"-Wfloat-zero-conversion",
"-Wfor-loop-analysis",
"-Wgnu-redeclared-enum",
"-Winfinite-recursion",
"-Wliteral-conversion",
"-Wno-c++98-compat",
"-Wno-unused-command-line-argument",
"-Wprivate-header",
"-Wself-assign",
"-Wstring-conversion",
"-Wtautological-overlap-compare",
"-Wthread-safety-analysis",
"-Wundefined-func-template",
"-Wunused-comparison",
]
COPTS = select({
":compiler_msvc": [],
":compiler_gcc": CLANG_GCC_COPTS,
# Default to clang because compiler detection only works in Bazel
"//conditions:default": CLANG_GCC_COPTS + CLANG_ONLY_COPTS,
})
# Unused on Bazel builds, where this is not defined/known; Copybara replaces
# usages with an empty list.
COMPAT = [
"//buildenv/target:non_prod", # includes mobile/vendor.
]
# WARNING: changing flags such as HWY_DISABLED_TARGETS may break users without
# failing integration tests, if the machine running tests does not support the
# newly enabled instruction set, or the failure is only caught by sanitizers
# which do not run in CI.
cc_library(
name = "hwy",
srcs = [
"hwy/aligned_allocator.cc",
"hwy/targets.cc",
],
# Normal headers with include guards
hdrs = [
"hwy/aligned_allocator.h",
"hwy/base.h",
"hwy/cache_control.h",
"hwy/detect_compiler_arch.h", # private
"hwy/detect_targets.h", # private
"hwy/targets.h",
],
compatible_with = [],
copts = COPTS,
textual_hdrs = [
"hwy/highway.h", # public
"hwy/foreach_target.h", # public
"hwy/ops/arm_neon-inl.h",
"hwy/ops/arm_sve-inl.h",
"hwy/ops/generic_ops-inl.h",
"hwy/ops/rvv-inl.h",
"hwy/ops/scalar-inl.h",
"hwy/ops/set_macros-inl.h",
"hwy/ops/shared-inl.h",
"hwy/ops/wasm_128-inl.h",
"hwy/ops/x86_128-inl.h",
"hwy/ops/x86_256-inl.h",
"hwy/ops/x86_512-inl.h",
],
deps = select({
":emulate_sve": ["//third_party/farm_sve"],
"//conditions:default": [],
}),
)
cc_library(
name = "image",
srcs = [
"hwy/contrib/image/image.cc",
],
hdrs = [
"hwy/contrib/image/image.h",
],
compatible_with = [],
deps = [":hwy"],
)
cc_library(
name = "math",
compatible_with = [],
textual_hdrs = [
"hwy/contrib/math/math-inl.h",
],
deps = [":hwy"],
)
cc_library(
name = "hwy_test_util",
textual_hdrs = ["hwy/tests/test_util-inl.h"],
deps = [":hwy"],
)
cc_library(
name = "nanobenchmark",
srcs = ["hwy/nanobenchmark.cc"],
hdrs = ["hwy/nanobenchmark.h"],
deps = [":hwy"],
)
cc_binary(
name = "benchmark",
srcs = ["hwy/examples/benchmark.cc"],
deps = [
":hwy",
":nanobenchmark",
],
)
cc_library(
name = "skeleton",
srcs = ["hwy/examples/skeleton.cc"],
hdrs = ["hwy/examples/skeleton.h"],
textual_hdrs = ["hwy/examples/skeleton-inl.h"],
deps = [":hwy"],
)
cc_binary(
name = "list_targets",
srcs = ["hwy/tests/list_targets.cc"],
deps = [":hwy"],
)
# path, name
HWY_TESTS = [
("hwy/contrib/image/", "image_test"),
("hwy/contrib/math/", "math_test"),
("hwy/examples/", "skeleton_test"),
("hwy/", "nanobenchmark_test"),
("hwy/", "aligned_allocator_test"),
("hwy/", "base_test"),
("hwy/", "highway_test"),
("hwy/", "targets_test"),
("hwy/tests/", "arithmetic_test"),
("hwy/tests/", "blockwise_test"),
("hwy/tests/", "combine_test"),
("hwy/tests/", "compare_test"),
("hwy/tests/", "convert_test"),
("hwy/tests/", "crypto_test"),
("hwy/tests/", "logical_test"),
("hwy/tests/", "mask_test"),
("hwy/tests/", "memory_test"),
("hwy/tests/", "swizzle_test"),
("hwy/tests/", "test_util_test"),
]
[
[
cc_test(
name = test,
size = "medium",
timeout = "long", # default moderate is not enough for math_test
srcs = [
subdir + test + ".cc",
],
copts = COPTS + [
# gTest triggers this warning (which is enabled by the
# extra-semi in COPTS), so we need to disable it here,
# but it's still enabled for :hwy.
"-Wno-c++98-compat-extra-semi",
],
# for test_suite.
tags = ["hwy_ops_test"],
deps = [
":hwy",
":hwy_test_util",
":image",
":math",
":nanobenchmark",
":skeleton",
"@com_google_googletest//:gtest_main",
],
),
]
for subdir, test in HWY_TESTS
]
# For manually building the tests we define here (:all does not work in --config=msvc)
test_suite(
name = "hwy_ops_tests",
tags = ["hwy_ops_test"],
)