libyuv/BUILD.bazel
Frank Barchard 39445fa162 [libyuv] Fix RISC-V CMake/GN/Bazel builds and C compiler driver linking
- Use -fno-tree-vectorize and -fno-tree-slp-vectorize instead of
  Clang-only -fno-vectorize and -fno-slp-vectorize in CMakeLists.txt,
  riscv-clang.cmake, BUILD.gn, and BUILD.bazel for GCC and Clang
  compatibility.
- Split row_rvv.cc and scale_rvv.cc into a dedicated libyuv_rvv target
  in BUILD.gn and define LIBYUV_RVV so callers in row.h and scale_row.h
  can dispatch to RVV kernels when built without global -march=rv64gcv.
- Guard the x86 AVX512-BF16 vdpphps inline assembly probe in
  util/cpuid.c with __i386__ / __x86_64__.
- Replace new/delete and new[]/delete[] with calloc/malloc/free in
  source/mjpeg_decoder.cc and util/yuvconvert.cc to avoid C++ standard
  library dependencies, and link libm for yuvconstants and
  libyuv_unittest in CMakeLists.txt.

Test: cmake -DCMAKE_C_COMPILER=clang -DCMAKE_CXX_COMPILER=clang++ ..
Bug: None
Change-Id: I701c0625f2730e864806556213a5e013c931e2d6
Reviewed-on: https://chromium-review.googlesource.com/c/libyuv/libyuv/+/8464751
Reviewed-by: richard winterton <rrwinterton@gmail.com>
Commit-Queue: Frank Barchard <fbarchard@google.com>
2026-09-28 10:59:30 -07:00

286 lines
7.3 KiB
Python

# Copyright 2026 The LibYuv Project Authors. All rights reserved.
#
# Description:
# The libyuv package provides implementation yuv image conversion, rotation
# and scaling.
load("@bazel_skylib//lib:selects.bzl", "selects")
load(":libyuv.bzl", "libyuv_hdrs", "libyuv_neon_srcs", "libyuv_rvv_srcs", "libyuv_srcs", "libyuv_sve_srcs", "libyuv_test_srcs")
# Detect if we are in Google's internal repository (where source files are
# under files/) or open source (where source files are at the root).
PREFIX = "files/" if len(native.glob(["files/source/*.cc"])) > 0 else ""
# We support NEON for all arm processors, as we only support ARMv7a+.
SUPPORTS_NEON_COPTS = [
"-DLIBYUV_NEON",
]
# ARMv7a requires that we explicitly enable NEON. arm64 enables it implicitly.
ENABLE_NEON_COPTS = [
"-mfpu=neon",
]
ENABLE_NEON64_COPTS = [
"-march=armv8-a+dotprod+i8mm",
]
NEON_COPTS = select({
"@platforms//cpu:armv7": ENABLE_NEON_COPTS + SUPPORTS_NEON_COPTS,
"@platforms//cpu:aarch64": ENABLE_NEON64_COPTS + SUPPORTS_NEON_COPTS,
"//conditions:default": [],
})
SUPPORTS_SVE_COPTS = [
"-DLIBYUV_SVE",
]
ENABLE_SVE_COPTS = [
"-march=armv8.5-a+i8mm+sve2",
]
SVE_COPTS = select({
"@platforms//cpu:aarch64": ENABLE_SVE_COPTS + SUPPORTS_SVE_COPTS,
"//conditions:default": [],
})
SUPPORTS_RVV_COPTS = [
"-DLIBYUV_RVV",
"-fno-tree-vectorize",
"-fno-tree-slp-vectorize",
]
ENABLE_RVV_COPTS = [
"-march=rv32gcv",
]
ENABLE_RVV64_COPTS = [
"-march=rv64gcv",
]
RVV_COPTS = select({
"@platforms//cpu:riscv32": ENABLE_RVV_COPTS + SUPPORTS_RVV_COPTS,
"@platforms//cpu:riscv64": ENABLE_RVV64_COPTS + SUPPORTS_RVV_COPTS,
"//conditions:default": [],
})
ARCH_SUPPORT_COPTS = select({
"@platforms//cpu:armv7": SUPPORTS_NEON_COPTS,
"@platforms//cpu:aarch64": SUPPORTS_NEON_COPTS + SUPPORTS_SVE_COPTS,
"@platforms//cpu:riscv32": SUPPORTS_RVV_COPTS,
"@platforms//cpu:riscv64": SUPPORTS_RVV_COPTS,
"//conditions:default": [],
})
PLATFORM_COPTS = select({
"@platforms//os:android": ["-DHAVE_JPEG"],
"@platforms//os:linux": ["-DHAVE_JPEG"],
"@platforms//os:windows": ["-DHAVE_JPEG"],
"@platforms//os:macos": ["-DHAVE_JPEG"],
"//conditions:default": [],
}) + [
"-DLIBYUV_DISABLE_SME",
"-DLIBYUV_USE_ABSL_FLAGS",
"-DGOOGLE_COMMANDLINEFLAGS_FULL_API",
]
ALL_COPTS = PLATFORM_COPTS + ARCH_SUPPORT_COPTS
ALL_NEON_COPTS = NEON_COPTS + PLATFORM_COPTS
ALL_SVE_COPTS = SVE_COPTS + PLATFORM_COPTS
ALL_RVV_COPTS = RVV_COPTS + PLATFORM_COPTS
NEON_DEPS = select({
"@platforms//cpu:armv7": [":libyuv_neon_impl"],
"@platforms//cpu:aarch64": [":libyuv_neon_impl"],
"//conditions:default": [],
})
SVE_DEPS = select({
"@platforms//cpu:aarch64": [":libyuv_sve_impl"],
"//conditions:default": [],
})
RVV_DEPS = select({
"@platforms//cpu:riscv32": [":libyuv_rvv_impl"],
"@platforms//cpu:riscv64": [":libyuv_rvv_impl"],
"//conditions:default": [],
})
PLATFORM_DEPS = select({
"@platforms//os:android": ["@libjpeg_turbo//:jpeg"],
"@platforms//os:linux": ["@libjpeg_turbo//:jpeg"],
"@platforms//os:windows": ["@libjpeg_turbo//:jpeg"],
"@platforms//os:macos": ["@libjpeg_turbo//:jpeg"],
"//conditions:default": [],
})
ALL_DEPS = NEON_DEPS + SVE_DEPS + RVV_DEPS + PLATFORM_DEPS
cc_library(
name = "libyuv",
hdrs = [
PREFIX + "include/libyuv.h",
# Headers included by libyuv.h.
PREFIX + "include/libyuv/basic_types.h",
PREFIX + "include/libyuv/compare.h",
PREFIX + "include/libyuv/convert.h",
PREFIX + "include/libyuv/convert_argb.h",
PREFIX + "include/libyuv/convert_from.h",
PREFIX + "include/libyuv/convert_from_argb.h",
PREFIX + "include/libyuv/cpu_id.h",
PREFIX + "include/libyuv/mjpeg_decoder.h",
PREFIX + "include/libyuv/planar_functions.h",
PREFIX + "include/libyuv/rotate.h",
PREFIX + "include/libyuv/rotate_argb.h",
PREFIX + "include/libyuv/row.h", # Bug 553148013: Should be private.
PREFIX + "include/libyuv/scale.h",
PREFIX + "include/libyuv/scale_argb.h",
PREFIX + "include/libyuv/scale_rgb.h",
PREFIX + "include/libyuv/scale_uv.h",
PREFIX + "include/libyuv/version.h",
PREFIX + "include/libyuv/video_common.h",
# Headers included by libyuv/row.h.
PREFIX + "include/libyuv/cpu_support.h", # Bug 553148013: Should be private.
],
strip_include_prefix = PREFIX + "include",
visibility = ["//visibility:public"],
deps = [":libyuv_impl"],
)
cc_library(
name = "libyuv_impl",
srcs = libyuv_srcs(PREFIX),
hdrs = libyuv_hdrs(PREFIX),
copts = ALL_COPTS + selects.with_or({
(
"@platforms//os:android",
"@platforms//os:ios",
"@platforms//os:tvos",
"@platforms//os:windows",
"@platforms//os:macos",
): [],
"//conditions:default": [
"-fomit-frame-pointer",
],
}) + selects.with_or({
(
"@platforms//os:android",
"@platforms//os:ios",
"@platforms//os:tvos",
): ["-O2"],
"//conditions:default": [],
}),
includes = [PREFIX + "include"],
deps = ALL_DEPS,
alwayslink = 1,
)
cc_library(
name = "libyuv_neon_impl",
srcs = libyuv_neon_srcs(PREFIX),
copts = ALL_NEON_COPTS,
includes = [PREFIX + "include"],
visibility = ["//visibility:private"],
alwayslink = 1,
)
cc_library(
name = "libyuv_sve_impl",
srcs = libyuv_sve_srcs(PREFIX),
copts = ALL_SVE_COPTS,
includes = [PREFIX + "include"],
visibility = ["//visibility:private"],
alwayslink = 1,
)
cc_library(
name = "libyuv_rvv_impl",
srcs = libyuv_rvv_srcs(PREFIX),
copts = ALL_RVV_COPTS,
includes = [PREFIX + "include"],
visibility = ["//visibility:private"],
alwayslink = 1,
)
cc_test(
name = "libyuv_test",
srcs = libyuv_test_srcs(PREFIX),
copts = ALL_COPTS + [
"-Wno-unused-variable",
],
visibility = ["//visibility:public"],
deps = [
":libyuv",
"@com_google_googletest//:gtest_main",
"@com_google_absl//absl/flags:flag",
"@com_google_absl//absl/flags:parse",
],
)
cc_library(
name = "psnr_lib",
srcs = [PREFIX + "util/psnr.cc"],
hdrs = [PREFIX + "util/psnr.h"],
copts = PLATFORM_COPTS,
visibility = ["//visibility:private"],
)
cc_library(
name = "ssim_lib",
srcs = [PREFIX + "util/ssim.cc"],
hdrs = [PREFIX + "util/ssim.h"],
visibility = ["//visibility:private"],
)
cc_binary(
name = "psnr",
srcs = [PREFIX + "util/psnr_main.cc"],
copts = PLATFORM_COPTS + [
"-Wframe-larger-than=64000",
],
deps = [
":libyuv",
":psnr_lib",
":ssim_lib",
],
)
cc_binary(
name = "i444tonv12_eg",
srcs = [PREFIX + "util/i444tonv12_eg.cc"],
visibility = ["//visibility:public"],
deps = [
":libyuv",
],
)
cc_binary(
name = "cpuid",
srcs = [PREFIX + "util/cpuid.c"],
visibility = ["//visibility:public"],
deps = [
":libyuv",
],
)
cc_binary(
name = "yuvconstants",
srcs = [PREFIX + "util/yuvconstants.c"],
visibility = ["//visibility:public"],
deps = [
":libyuv",
],
)
cc_binary(
name = "yuvconvert",
srcs = [PREFIX + "util/yuvconvert.cc"],
visibility = ["//visibility:public"],
deps = [
":libyuv",
],
)