blob: 6309aacef5ed312b1a8a4a32d3f22ccddc9a2dd6 [file] [log] [blame]
"""
THIS IS THE EXTERNAL-ONLY VERSION OF THIS FILE. G3 HAS ITS OWN.
This file contains flags for the C++ compiler, referred to by Bazel as copts.
The copts in a cc_library to not flow to the children (dependencies) nor the parents
(dependents), so we use skia_cc_library to inject them in every library along the chain.
Now that we have a modular build, this file could maybe go away and folded into our toolchains.
They are divided into several lists/selects and were initially created to be identical to the
GN ones [2][3].
[2] https://github.com/google/skia/blob/2b07cdb07e88f2870260eabac708f31bc7977d08/gn/BUILDCONFIG.gn#L177-L181
[3] https://github.com/google/skia/blob/2b07cdb07e88f2870260eabac708f31bc7977d08/gn/skia/BUILD.gn#L593-L630
"""
CORE_COPTS = [
"-fstrict-aliasing",
] + select({
"@platforms//os:android": [],
"//conditions:default": [
# On Android, this option causes the linker to fail
# (e.g. "undefined reference to `SkString::data()'").
"-fvisibility=hidden",
],
}) + select({
"@platforms//os:windows": [],
"//conditions:default": [
# In Clang 14, this default was changed. We turn this off to (hopefully) make our
# GMs more consistent and avoid some floating-point related test failures on M1 macs.
"-ffp-contract=off",
# Windows doesn't support position-independent code.
"-fPIC",
],
}) + select({
# Turning off RTTI reduces code size, but is necessary for connecting C++
# and Objective-C code.
"@platforms//os:macos": [],
"@platforms//os:ios": [],
"//conditions:default": [
"-fno-rtti",
],
})
OPT_LEVEL = select({
"//bazel/common_config_settings:debug_build": [
"--optimize=0",
"--debug",
],
"//bazel/common_config_settings:release_build": [
"--optimize=3",
# Strip dead code (in conjunction with linkopts)
"-fdata-sections",
"-ffunction-sections",
],
"//bazel/common_config_settings:fast_build": [
"--optimize=0",
"-gline-tables-only",
],
})
WARNINGS = [
"-fcolor-diagnostics",
"-Wall",
"-Werror",
"-Weverything",
"-Wextra",
"-Wpointer-arith",
"-Wsign-compare",
"-Wvla",
#### Warnings we are unlikely to fix ####
"-Wno-c++98-compat",
"-Wno-c++98-compat-pedantic",
"-Wno-covered-switch-default",
"-Wno-declaration-after-statement",
"-Wno-deprecated",
"-Wno-missing-noreturn",
"-Wno-newline-eof",
"-Wno-old-style-cast",
"-Wno-padded",
"-Wno-psabi", # noisy
"-Wno-return-std-move-in-c++11",
"-Wno-shadow-field-in-constructor",
"-Wno-shadow-uncaptured-local",
"-Wno-undefined-func-template",
"-Wno-unused-parameter", # It is common to have unused parameters in src/
"-Wno-zero-as-null-pointer-constant", # VK_NULL_HANDLE is defined as 0
"-Wno-unsafe-buffer-usage",
#### Warnings we would like to fix ####
"-Wno-abstract-vbase-init",
"-Wno-cast-align",
"-Wno-cast-function-type-strict",
"-Wno-cast-qual",
"-Wno-class-varargs",
"-Wno-conversion", # -Wsign-conversion re-enabled for header sources
"-Wno-disabled-macro-expansion",
"-Wno-documentation",
"-Wno-documentation-unknown-command",
"-Wno-double-promotion",
"-Wno-exit-time-destructors", # TODO: OK outside libskia
"-Wno-float-equal",
"-Wno-global-constructors", # TODO: OK outside libskia
"-Wno-missing-prototypes",
"-Wno-missing-variable-declarations",
"-Wno-pedantic",
"-Wno-reserved-id-macro",
"-Wno-reserved-identifier",
"-Wno-shift-sign-overflow",
"-Wno-signed-enum-bitfield",
"-Wno-switch-enum",
"-Wno-thread-safety-negative",
"-Wno-undef",
"-Wno-unreachable-code-break",
"-Wno-unreachable-code-return",
"-Wno-unused-macros",
"-Wno-unused-member-function",
"-Wno-weak-template-vtables", # This was deprecated in Clang 14 and removed in Clang 15.
"-Wno-weak-vtables",
# https://quuxplusone.github.io/blog/2020/08/26/wrange-loop-analysis/
# https://bugzilla.mozilla.org/show_bug.cgi?id=1683213
# https://reviews.llvm.org/D73007
# May be re-enabled once clang > 12 or XCode > 12 are required.
# When this line is removed the -Wrange-loop-construct line below can also be removed.
"-Wno-range-loop-analysis",
# Wno-range-loop-analysis turns off the whole group, but this warning was later split into
# range-loop-construct and range-loop-bind-reference. We want the former but not the latter.
# Created from
# https://github.com/llvm/llvm-project/blob/bd08f413c089da5a56438cc8902f60df91a08a66/clang/include/clang/Basic/DiagnosticGroups.td
"-Wrange-loop-construct",
# Wno-deprecated turns off the whole group, but also has its own warnings like
# out-of-line definition of constexpr static data member is redundant in C++17 and is deprecated [-Werror,-Wdeprecated]
# but we would like others. Created from
# https://github.com/llvm/llvm-project/blob/bd08f413c089da5a56438cc8902f60df91a08a66/clang/include/clang/Basic/DiagnosticGroups.td
"-Wdeprecated-anon-enum-enum-conversion",
"-Wdeprecated-array-compare",
"-Wdeprecated-attributes",
"-Wdeprecated-comma-subscript",
"-Wdeprecated-copy",
"-Wdeprecated-copy-dtor",
"-Wdeprecated-dynamic-exception-spec",
"-Wdeprecated-enum-compare",
"-Wdeprecated-enum-compare-conditional",
"-Wdeprecated-enum-enum-conversion",
"-Wdeprecated-enum-float-conversion",
"-Wdeprecated-increment-bool",
"-Wdeprecated-register",
"-Wdeprecated-this-capture",
"-Wdeprecated-volatile",
"-Wdeprecated-writable-strings",
# A catch-all for when the version of clang we are using does not have the prior options
"-Wno-unknown-warning-option",
] + select({
"@platforms//os:windows": [
# skbug.com/14203
"-Wno-nonportable-system-include-path",
"-Wno-unknown-argument",
# Clang warns even when all enum values are covered.
"-Wno-switch-default",
# The Windows build fails without these options:
"-Wno-extra-semi-stmt",
"-Wno-invalid-constexpr",
"-D_CRT_USE_BUILTIN_OFFSETOF",
],
"//conditions:default": [],
})
DEFAULT_COPTS = CORE_COPTS + OPT_LEVEL + WARNINGS
OBJC_COPTS = [
"-Wno-direct-ivar-access",
"-Wno-objc-interface-ivars",
]
DEFAULT_OBJC_COPTS = DEFAULT_COPTS + OBJC_COPTS