mongo/bazel/toolchains/cc/mongo_custom_features.bzl

439 lines
14 KiB
Python

""" This file contains customized features that is common to most platforms"""
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
load(
"@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
"feature",
"flag_group",
"flag_set",
)
# Features listed in this file is only visible to the toolchain cc.
#visibility([
# "//",
# "//bazel/toolchains/cc/mongo_linux",
# "//bazel/toolchains/cc/mongo_apple",
#])
COMPILERS = struct(
CLANG = "clang",
GCC = "gcc",
)
LINKERS = struct(
GOLD = "gold",
LLD = "lld",
MOLD = "mold",
)
all_c_compile_actions = [
ACTION_NAMES.assemble,
ACTION_NAMES.c_compile,
ACTION_NAMES.objc_compile,
ACTION_NAMES.preprocess_assemble,
]
all_cpp_compile_actions = [
ACTION_NAMES.clif_match,
ACTION_NAMES.cpp_compile,
ACTION_NAMES.cpp_header_parsing,
ACTION_NAMES.cpp_module_compile,
ACTION_NAMES.cpp_module_codegen,
ACTION_NAMES.linkstamp_compile,
ACTION_NAMES.objcpp_compile,
]
all_compile_actions = \
all_c_compile_actions + \
all_cpp_compile_actions + \
[
ACTION_NAMES.lto_backend,
]
all_link_actions = [
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]
lto_index_actions = [
ACTION_NAMES.lto_index_for_executable,
ACTION_NAMES.lto_index_for_dynamic_library,
ACTION_NAMES.lto_index_for_nodeps_dynamic_library,
]
FEATURES_ATTR_NAMES = struct(
OPT_LEVEL = "optimization_level",
)
def get_common_features_attrs():
""" get_common_features_attrs returns a map of attributes and their values.
The map of attributes settings and their values is returned which
is used by the toolchain config. Please make sure to refer the key
by the FEATURE_ATTR_NAMES.
Returns:
list: The map of attributes and their values.
"""
return {
FEATURES_ATTR_NAMES.OPT_LEVEL: select({
# This is opt=debug, not to be confused with (opt=on && dbg=on)
"@//bazel/config:gcc_or_clang_opt_debug": "Og",
"@//bazel/config:gcc_or_clang_opt_off": "O0",
"@//bazel/config:gcc_or_clang_opt_on": "O2",
"@//bazel/config:gcc_or_clang_opt_size": "Os",
"@//conditions:default": None,
}),
}
def get_common_features(ctx):
""" get_features returns a list of toolchain features.
The list of features that is returned is a common list
to most of the platforms that we currently support.
Args:
ctx: The toolchain context.
Returns:
list: The list of features.
"""
return [
feature(
name = "og",
enabled = ctx.attr.optimization_level == "Og",
provides = [
"O0",
"O2",
"Os",
],
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
"-Og",
],
),
],
),
],
),
feature(
name = "o0",
enabled = ctx.attr.optimization_level == "O0",
provides = [
"Og",
"O2",
"Os",
],
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
"-O0",
],
),
],
),
],
),
feature(
name = "o2",
enabled = ctx.attr.optimization_level == "O2",
provides = [
"Og",
"O1",
"Os",
],
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
"-O2",
],
),
],
),
],
),
feature(
name = "os",
enabled = ctx.attr.optimization_level == "Os",
provides = [
"Og",
"O1",
"O2",
],
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
"-Os",
],
),
],
),
],
),
feature(
name = "no_unused_function",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
# Clang likes to warn about unused functions, which seems a tad
# aggressive and breaks -Werror, which we want to be able to use.
"-Wno-unused-function",
],
),
],
),
],
),
feature(
name = "no_defaulted_function_deleted",
enabled = ctx.attr.compiler == COMPILERS.CLANG,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
# This warning was added in Apple clang version 11 and flags many
# explicitly defaulted move constructors and assignment operators for
# being implicitly deleted, which is not useful.
"-Wno-defaulted-function-deleted",
],
),
],
),
],
),
# -Wno-invalid-offsetof is only valid for C++ but not for C
feature(
name = "no_invalid_offsetof_warning",
enabled = False,
flag_sets = [
flag_set(
actions = all_cpp_compile_actions,
flag_groups = [flag_group(flags = ["-Wno-invalid-offsetof"])],
),
],
),
feature(
name = "no_unknown_pragmas",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
# Do not warn on unknown pragmas.
"-Wno-unknown-pragmas",
])],
),
],
),
feature(
name = "no_builtin_macro_redefined",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
# Replace compile timestamp-related macros for reproducible binaries with consistent hashes.
"-Wno-builtin-macro-redefined",
])],
),
],
),
feature(
name = "no_unused_local_typedefs",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
# This warning was added in g++-4.8.
"-Wno-unused-local-typedefs",
])],
),
],
),
feature(
name = "no_unused_lambda_capture",
enabled = ctx.attr.compiler == COMPILERS.CLANG,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
# This warning was added in clang-5 and flags many of our lambdas. Since
# it isn't actively harmful to capture unused variables we are
# suppressing for now with a plan to fix later.
"-Wno-unused-lambda-capture",
])],
),
],
),
feature(
name = "no_deprecated_declarations",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
# Prevents warning about using deprecated features (such as auto_ptr in
# c++11) Using -Wno-error=deprecated-declarations does not seem to work
# on some compilers, including at least g++-4.6.
"-Wno-deprecated-declarations",
])],
),
],
),
feature(
name = "no_unused_const_variable",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
# New in clang-3.4, trips up things mostly in third_party, but in a few
# places in the primary mongo sources as well.
"-Wno-unused-const-variable",
])],
),
],
),
feature(
name = "no_deprecate_this_capture",
enabled = ctx.attr.compiler == COMPILERS.CLANG,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
"-Wno-deprecated-this-capture",
])],
),
],
),
feature(
name = "no_undefined_var_template",
enabled = ctx.attr.compiler == COMPILERS.CLANG,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
# Disable warning about templates that can't be implicitly instantiated.
# It is an attempt to make a link error into an easier-to-debug compiler
# failure, but it triggers false positives if explicit instantiation is
# used in a TU that can see the full definition. This is a problem at
# least for the S2 headers.
"-Wno-undefined-var-template",
])],
),
],
),
feature(
name = "no_unused_private_field",
enabled = ctx.attr.compiler == COMPILERS.CLANG,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
# Clang likes to warn about unused private fields, but some of our
# third_party libraries have such things.
"-Wno-unused-private-field",
])],
),
],
),
feature(
name = "no_potentially_evaluated_expression",
enabled = ctx.attr.compiler == COMPILERS.CLANG,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
# Don't issue warnings about potentially evaluated expressions
"-Wno-potentially-evaluated-expression",
])],
),
],
),
feature(
name = "internal_thin_lto",
enabled = ctx.attr.internal_thin_lto_enabled,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
"-flto=thin",
])],
),
flag_set(
actions = all_link_actions,
flag_groups = [flag_group(flags = [
"-flto=thin",
])],
),
],
),
feature(
# The mongo is added because coverage is a used feature already
name = "coverage_mongo",
enabled = ctx.attr.coverage_enabled,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
"--coverage",
"-fprofile-update=single",
])],
),
flag_set(
actions = all_link_actions + lto_index_actions,
flag_groups = [flag_group(flags = [
"--coverage",
"-fprofile-update=single",
])],
),
],
),
feature(
name = "compress_debug",
enabled = ctx.attr.compress_debug_enabled,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
"-Wa,--compress-debug-sections",
])],
),
],
),
feature(
name = "warnings_as_errors_compile",
enabled = False,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = [
"-Werror",
])],
),
],
),
]