mirror of
https://github.com/bazelbuild/rules_cc
synced 2024-11-30 22:41:22 +00:00
262ebec3c2
Fixes: * Enabled buildifier on the Bazel CI again * Added Skydocs where missing * Moved public files out of .../private/... (e.g. cc_toolchain_config_lib.bzl) * Reformatted * Removed unused loads * Using relative labels for cc_configure related files * Added development dependency on rules_proto * they're not in the federation yet, so hand rolling in rules_cc's WORKSPACE file * Added development dependency on rules_python (from federation) * Cleaned up copybara (notable change - not using @rules_cc in labels inside rules_cc repo) * Made cc_flags_supplier usable internally * Moved load statements to the top of the bzl file * Moved runfiles to the tools directory * Unified toolchain_utils.bzl and find_cc_toolchain.bzl RELNOTES: None. PiperOrigin-RevId: 276479521 Change-Id: I3196896061fa2ee61a3efb130c214d288782066a
1198 lines
42 KiB
Python
1198 lines
42 KiB
Python
# Copyright 2019 The Bazel Authors. All rights reserved.
|
|
#
|
|
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
# you may not use this file except in compliance with the License.
|
|
# You may obtain a copy of the License at
|
|
#
|
|
# http://www.apache.org/licenses/LICENSE-2.0
|
|
#
|
|
# Unless required by applicable law or agreed to in writing, software
|
|
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
# See the License for the specific language governing permissions and
|
|
# limitations under the License.
|
|
|
|
"""A Starlark cc_toolchain configuration rule"""
|
|
|
|
load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES")
|
|
load(
|
|
"@rules_cc//cc:cc_toolchain_config_lib.bzl",
|
|
"feature",
|
|
"feature_set",
|
|
"flag_group",
|
|
"flag_set",
|
|
"tool_path",
|
|
"variable_with_value",
|
|
"with_feature_set",
|
|
)
|
|
|
|
all_compile_actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.clif_match,
|
|
ACTION_NAMES.lto_backend,
|
|
]
|
|
|
|
all_cpp_compile_actions = [
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.clif_match,
|
|
]
|
|
|
|
preprocessor_compile_actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.clif_match,
|
|
]
|
|
|
|
codegen_compile_actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
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,
|
|
]
|
|
|
|
def _impl(ctx):
|
|
tool_paths = [
|
|
tool_path(name = name, path = path)
|
|
for name, path in ctx.attr.tool_paths.items()
|
|
]
|
|
action_configs = []
|
|
|
|
supports_pic_feature = feature(
|
|
name = "supports_pic",
|
|
enabled = True,
|
|
)
|
|
supports_start_end_lib_feature = feature(
|
|
name = "supports_start_end_lib",
|
|
enabled = True,
|
|
)
|
|
|
|
default_compile_flags_feature = feature(
|
|
name = "default_compile_flags",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_compile_actions,
|
|
flag_groups = ([
|
|
flag_group(
|
|
flags = ctx.attr.compile_flags,
|
|
),
|
|
] if ctx.attr.compile_flags else []),
|
|
),
|
|
flag_set(
|
|
actions = all_compile_actions,
|
|
flag_groups = ([
|
|
flag_group(
|
|
flags = ctx.attr.dbg_compile_flags,
|
|
),
|
|
] if ctx.attr.dbg_compile_flags else []),
|
|
with_features = [with_feature_set(features = ["dbg"])],
|
|
),
|
|
flag_set(
|
|
actions = all_compile_actions,
|
|
flag_groups = ([
|
|
flag_group(
|
|
flags = ctx.attr.opt_compile_flags,
|
|
),
|
|
] if ctx.attr.opt_compile_flags else []),
|
|
with_features = [with_feature_set(features = ["opt"])],
|
|
),
|
|
flag_set(
|
|
actions = all_cpp_compile_actions + [ACTION_NAMES.lto_backend],
|
|
flag_groups = ([
|
|
flag_group(
|
|
flags = ctx.attr.cxx_flags,
|
|
),
|
|
] if ctx.attr.cxx_flags else []),
|
|
),
|
|
],
|
|
)
|
|
|
|
default_link_flags_feature = feature(
|
|
name = "default_link_flags",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = ([
|
|
flag_group(
|
|
flags = ctx.attr.link_flags,
|
|
),
|
|
] if ctx.attr.link_flags else []),
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = ([
|
|
flag_group(
|
|
flags = ctx.attr.opt_link_flags,
|
|
),
|
|
] if ctx.attr.opt_link_flags else []),
|
|
with_features = [with_feature_set(features = ["opt"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
dbg_feature = feature(name = "dbg")
|
|
|
|
opt_feature = feature(name = "opt")
|
|
|
|
sysroot_feature = feature(
|
|
name = "sysroot",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.lto_backend,
|
|
ACTION_NAMES.clif_match,
|
|
] + all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["--sysroot=%{sysroot}"],
|
|
expand_if_available = "sysroot",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
fdo_optimize_feature = feature(
|
|
name = "fdo_optimize",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-fprofile-use=%{fdo_profile_path}",
|
|
"-fprofile-correction",
|
|
],
|
|
expand_if_available = "fdo_profile_path",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
provides = ["profile"],
|
|
)
|
|
|
|
supports_dynamic_linker_feature = feature(name = "supports_dynamic_linker", enabled = True)
|
|
|
|
user_compile_flags_feature = feature(
|
|
name = "user_compile_flags",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_compile_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{user_compile_flags}"],
|
|
iterate_over = "user_compile_flags",
|
|
expand_if_available = "user_compile_flags",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
unfiltered_compile_flags_feature = feature(
|
|
name = "unfiltered_compile_flags",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_compile_actions,
|
|
flag_groups = ([
|
|
flag_group(
|
|
flags = ctx.attr.unfiltered_compile_flags,
|
|
),
|
|
] if ctx.attr.unfiltered_compile_flags else []),
|
|
),
|
|
],
|
|
)
|
|
|
|
library_search_directories_feature = feature(
|
|
name = "library_search_directories",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-L%{library_search_directories}"],
|
|
iterate_over = "library_search_directories",
|
|
expand_if_available = "library_search_directories",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
static_libgcc_feature = feature(
|
|
name = "static_libgcc",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.cpp_link_executable,
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.lto_index_for_executable,
|
|
ACTION_NAMES.lto_index_for_dynamic_library,
|
|
],
|
|
flag_groups = [flag_group(flags = ["-static-libgcc"])],
|
|
with_features = [
|
|
with_feature_set(features = ["static_link_cpp_runtimes"]),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
pic_feature = feature(
|
|
name = "pic",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
],
|
|
flag_groups = [
|
|
flag_group(flags = ["-fPIC"], expand_if_available = "pic"),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
per_object_debug_info_feature = feature(
|
|
name = "per_object_debug_info",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-gsplit-dwarf"],
|
|
expand_if_available = "per_object_debug_info_file",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
preprocessor_defines_feature = feature(
|
|
name = "preprocessor_defines",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.clif_match,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-D%{preprocessor_defines}"],
|
|
iterate_over = "preprocessor_defines",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
cs_fdo_optimize_feature = feature(
|
|
name = "cs_fdo_optimize",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.lto_backend],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-fprofile-use=%{fdo_profile_path}",
|
|
"-Xclang-only=-Wno-profile-instr-unprofiled",
|
|
"-Xclang-only=-Wno-profile-instr-out-of-date",
|
|
"-fprofile-correction",
|
|
],
|
|
expand_if_available = "fdo_profile_path",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
provides = ["csprofile"],
|
|
)
|
|
|
|
autofdo_feature = feature(
|
|
name = "autofdo",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-fauto-profile=%{fdo_profile_path}",
|
|
"-fprofile-correction",
|
|
],
|
|
expand_if_available = "fdo_profile_path",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
provides = ["profile"],
|
|
)
|
|
|
|
runtime_library_search_directories_feature = feature(
|
|
name = "runtime_library_search_directories",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
iterate_over = "runtime_library_search_directories",
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-Wl,-rpath,$EXEC_ORIGIN/%{runtime_library_search_directories}",
|
|
],
|
|
expand_if_true = "is_cc_test",
|
|
),
|
|
flag_group(
|
|
flags = [
|
|
"-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}",
|
|
],
|
|
expand_if_false = "is_cc_test",
|
|
),
|
|
],
|
|
expand_if_available =
|
|
"runtime_library_search_directories",
|
|
),
|
|
],
|
|
with_features = [
|
|
with_feature_set(features = ["static_link_cpp_runtimes"]),
|
|
],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
iterate_over = "runtime_library_search_directories",
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}",
|
|
],
|
|
),
|
|
],
|
|
expand_if_available =
|
|
"runtime_library_search_directories",
|
|
),
|
|
],
|
|
with_features = [
|
|
with_feature_set(
|
|
not_features = ["static_link_cpp_runtimes"],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
fission_support_feature = feature(
|
|
name = "fission_support",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-Wl,--gdb-index"],
|
|
expand_if_available = "is_using_fission",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
shared_flag_feature = feature(
|
|
name = "shared_flag",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
ACTION_NAMES.lto_index_for_dynamic_library,
|
|
ACTION_NAMES.lto_index_for_nodeps_dynamic_library,
|
|
],
|
|
flag_groups = [flag_group(flags = ["-shared"])],
|
|
),
|
|
],
|
|
)
|
|
|
|
random_seed_feature = feature(
|
|
name = "random_seed",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_codegen,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-frandom-seed=%{output_file}"],
|
|
expand_if_available = "output_file",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
includes_feature = feature(
|
|
name = "includes",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.clif_match,
|
|
ACTION_NAMES.objc_compile,
|
|
ACTION_NAMES.objcpp_compile,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-include", "%{includes}"],
|
|
iterate_over = "includes",
|
|
expand_if_available = "includes",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
fdo_instrument_feature = feature(
|
|
name = "fdo_instrument",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
] + all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-fprofile-generate=%{fdo_instrument_path}",
|
|
"-fno-data-sections",
|
|
],
|
|
expand_if_available = "fdo_instrument_path",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
provides = ["profile"],
|
|
)
|
|
|
|
cs_fdo_instrument_feature = feature(
|
|
name = "cs_fdo_instrument",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.lto_backend,
|
|
] + all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-fcs-profile-generate=%{cs_fdo_instrument_path}",
|
|
],
|
|
expand_if_available = "cs_fdo_instrument_path",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
provides = ["csprofile"],
|
|
)
|
|
|
|
include_paths_feature = feature(
|
|
name = "include_paths",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.linkstamp_compile,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.clif_match,
|
|
ACTION_NAMES.objc_compile,
|
|
ACTION_NAMES.objcpp_compile,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-iquote", "%{quote_include_paths}"],
|
|
iterate_over = "quote_include_paths",
|
|
),
|
|
flag_group(
|
|
flags = ["-I%{include_paths}"],
|
|
iterate_over = "include_paths",
|
|
),
|
|
flag_group(
|
|
flags = ["-isystem", "%{system_include_paths}"],
|
|
iterate_over = "system_include_paths",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
symbol_counts_feature = feature(
|
|
name = "symbol_counts",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-Wl,--print-symbol-counts=%{symbol_counts_output}",
|
|
],
|
|
expand_if_available = "symbol_counts_output",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
llvm_coverage_map_format_feature = feature(
|
|
name = "llvm_coverage_map_format",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.objc_compile,
|
|
ACTION_NAMES.objcpp_compile,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-fprofile-instr-generate",
|
|
"-fcoverage-mapping",
|
|
],
|
|
),
|
|
],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions + [
|
|
"objc-executable",
|
|
"objc++-executable",
|
|
],
|
|
flag_groups = [
|
|
flag_group(flags = ["-fprofile-instr-generate"]),
|
|
],
|
|
),
|
|
],
|
|
requires = [feature_set(features = ["coverage"])],
|
|
provides = ["profile"],
|
|
)
|
|
|
|
strip_debug_symbols_feature = feature(
|
|
name = "strip_debug_symbols",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-Wl,-S"],
|
|
expand_if_available = "strip_debug_symbols",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
build_interface_libraries_feature = feature(
|
|
name = "build_interface_libraries",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
ACTION_NAMES.lto_index_for_dynamic_library,
|
|
ACTION_NAMES.lto_index_for_nodeps_dynamic_library,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"%{generate_interface_library}",
|
|
"%{interface_library_builder_path}",
|
|
"%{interface_library_input_path}",
|
|
"%{interface_library_output_path}",
|
|
],
|
|
expand_if_available = "generate_interface_library",
|
|
),
|
|
],
|
|
with_features = [
|
|
with_feature_set(
|
|
features = ["supports_interface_shared_libraries"],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
libraries_to_link_feature = feature(
|
|
name = "libraries_to_link",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
iterate_over = "libraries_to_link",
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-Wl,--start-lib"],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "object_file_group",
|
|
),
|
|
),
|
|
flag_group(
|
|
flags = ["-Wl,-whole-archive"],
|
|
expand_if_true =
|
|
"libraries_to_link.is_whole_archive",
|
|
),
|
|
flag_group(
|
|
flags = ["%{libraries_to_link.object_files}"],
|
|
iterate_over = "libraries_to_link.object_files",
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "object_file_group",
|
|
),
|
|
),
|
|
flag_group(
|
|
flags = ["%{libraries_to_link.name}"],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "object_file",
|
|
),
|
|
),
|
|
flag_group(
|
|
flags = ["%{libraries_to_link.name}"],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "interface_library",
|
|
),
|
|
),
|
|
flag_group(
|
|
flags = ["%{libraries_to_link.name}"],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "static_library",
|
|
),
|
|
),
|
|
flag_group(
|
|
flags = ["-l%{libraries_to_link.name}"],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "dynamic_library",
|
|
),
|
|
),
|
|
flag_group(
|
|
flags = ["-l:%{libraries_to_link.name}"],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "versioned_dynamic_library",
|
|
),
|
|
),
|
|
flag_group(
|
|
flags = ["-Wl,-no-whole-archive"],
|
|
expand_if_true = "libraries_to_link.is_whole_archive",
|
|
),
|
|
flag_group(
|
|
flags = ["-Wl,--end-lib"],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "object_file_group",
|
|
),
|
|
),
|
|
],
|
|
expand_if_available = "libraries_to_link",
|
|
),
|
|
flag_group(
|
|
flags = ["-Wl,@%{thinlto_param_file}"],
|
|
expand_if_true = "thinlto_param_file",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
user_link_flags_feature = feature(
|
|
name = "user_link_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{user_link_flags}"],
|
|
iterate_over = "user_link_flags",
|
|
expand_if_available = "user_link_flags",
|
|
),
|
|
] + ([flag_group(flags = ctx.attr.link_libs)] if ctx.attr.link_libs else []),
|
|
),
|
|
],
|
|
)
|
|
|
|
fdo_prefetch_hints_feature = feature(
|
|
name = "fdo_prefetch_hints",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.lto_backend,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [
|
|
"-Xclang-only=-mllvm",
|
|
"-Xclang-only=-prefetch-hints-file=%{fdo_prefetch_hints_path}",
|
|
],
|
|
expand_if_available = "fdo_prefetch_hints_path",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
linkstamps_feature = feature(
|
|
name = "linkstamps",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{linkstamp_paths}"],
|
|
iterate_over = "linkstamp_paths",
|
|
expand_if_available = "linkstamp_paths",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
gcc_coverage_map_format_feature = feature(
|
|
name = "gcc_coverage_map_format",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.objc_compile,
|
|
ACTION_NAMES.objcpp_compile,
|
|
"objc-executable",
|
|
"objc++-executable",
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-fprofile-arcs", "-ftest-coverage"],
|
|
expand_if_available = "gcov_gcno_file",
|
|
),
|
|
],
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [flag_group(flags = ["--coverage"])],
|
|
),
|
|
],
|
|
requires = [feature_set(features = ["coverage"])],
|
|
provides = ["profile"],
|
|
)
|
|
|
|
archiver_flags_feature = feature(
|
|
name = "archiver_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [ACTION_NAMES.cpp_link_static_library],
|
|
flag_groups = [
|
|
flag_group(flags = ["rcsD"]),
|
|
flag_group(
|
|
flags = ["%{output_execpath}"],
|
|
expand_if_available = "output_execpath",
|
|
),
|
|
],
|
|
),
|
|
flag_set(
|
|
actions = [ACTION_NAMES.cpp_link_static_library],
|
|
flag_groups = [
|
|
flag_group(
|
|
iterate_over = "libraries_to_link",
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["%{libraries_to_link.name}"],
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "object_file",
|
|
),
|
|
),
|
|
flag_group(
|
|
flags = ["%{libraries_to_link.object_files}"],
|
|
iterate_over = "libraries_to_link.object_files",
|
|
expand_if_equal = variable_with_value(
|
|
name = "libraries_to_link.type",
|
|
value = "object_file_group",
|
|
),
|
|
),
|
|
],
|
|
expand_if_available = "libraries_to_link",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
force_pic_flags_feature = feature(
|
|
name = "force_pic_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.cpp_link_executable,
|
|
ACTION_NAMES.lto_index_for_executable,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-pie"],
|
|
expand_if_available = "force_pic",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
dependency_file_feature = feature(
|
|
name = "dependency_file",
|
|
enabled = True,
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.assemble,
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
ACTION_NAMES.objc_compile,
|
|
ACTION_NAMES.objcpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.clif_match,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-MD", "-MF", "%{dependency_file}"],
|
|
expand_if_available = "dependency_file",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
dynamic_library_linker_tool_path = tool_paths
|
|
dynamic_library_linker_tool_feature = feature(
|
|
name = "dynamic_library_linker_tool",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.cpp_link_dynamic_library,
|
|
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
|
|
ACTION_NAMES.lto_index_for_dynamic_library,
|
|
ACTION_NAMES.lto_index_for_nodeps_dynamic_library,
|
|
],
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = [" + cppLinkDynamicLibraryToolPath + "],
|
|
expand_if_available = "generate_interface_library",
|
|
),
|
|
],
|
|
with_features = [
|
|
with_feature_set(
|
|
features = ["supports_interface_shared_libraries"],
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
output_execpath_flags_feature = feature(
|
|
name = "output_execpath_flags",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(
|
|
flags = ["-o", "%{output_execpath}"],
|
|
expand_if_available = "output_execpath",
|
|
),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
# Note that we also set --coverage for c++-link-nodeps-dynamic-library. The
|
|
# generated code contains references to gcov symbols, and the dynamic linker
|
|
# can't resolve them unless the library is linked against gcov.
|
|
coverage_feature = feature(
|
|
name = "coverage",
|
|
provides = ["profile"],
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.preprocess_assemble,
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
ACTION_NAMES.cpp_header_parsing,
|
|
ACTION_NAMES.cpp_module_compile,
|
|
],
|
|
flag_groups = ([
|
|
flag_group(flags = ctx.attr.coverage_compile_flags),
|
|
] if ctx.attr.coverage_compile_flags else []),
|
|
),
|
|
flag_set(
|
|
actions = all_link_actions + lto_index_actions,
|
|
flag_groups = ([
|
|
flag_group(flags = ctx.attr.coverage_link_flags),
|
|
] if ctx.attr.coverage_link_flags else []),
|
|
),
|
|
],
|
|
)
|
|
|
|
thinlto_feature = feature(
|
|
name = "thin_lto",
|
|
flag_sets = [
|
|
flag_set(
|
|
actions = [
|
|
ACTION_NAMES.c_compile,
|
|
ACTION_NAMES.cpp_compile,
|
|
] + all_link_actions + lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(flags = ["-flto=thin"]),
|
|
flag_group(
|
|
expand_if_available = "lto_indexing_bitcode_file",
|
|
flags = [
|
|
"-Xclang",
|
|
"-fthin-link-bitcode=%{lto_indexing_bitcode_file}",
|
|
],
|
|
),
|
|
],
|
|
),
|
|
flag_set(
|
|
actions = [ACTION_NAMES.linkstamp_compile],
|
|
flag_groups = [flag_group(flags = ["-DBUILD_LTO_TYPE=thin"])],
|
|
),
|
|
flag_set(
|
|
actions = lto_index_actions,
|
|
flag_groups = [
|
|
flag_group(flags = [
|
|
"-flto=thin",
|
|
"-Wl,-plugin-opt,thinlto-index-only%{thinlto_optional_params_file}",
|
|
"-Wl,-plugin-opt,thinlto-emit-imports-files",
|
|
"-Wl,-plugin-opt,thinlto-prefix-replace=%{thinlto_prefix_replace}",
|
|
]),
|
|
flag_group(
|
|
expand_if_available = "thinlto_object_suffix_replace",
|
|
flags = [
|
|
"-Wl,-plugin-opt,thinlto-object-suffix-replace=%{thinlto_object_suffix_replace}",
|
|
],
|
|
),
|
|
flag_group(
|
|
expand_if_available = "thinlto_merged_object_file",
|
|
flags = [
|
|
"-Wl,-plugin-opt,obj-path=%{thinlto_merged_object_file}",
|
|
],
|
|
),
|
|
],
|
|
),
|
|
flag_set(
|
|
actions = [ACTION_NAMES.lto_backend],
|
|
flag_groups = [
|
|
flag_group(flags = [
|
|
"-c",
|
|
"-fthinlto-index=%{thinlto_index}",
|
|
"-o",
|
|
"%{thinlto_output_object_file}",
|
|
"-x",
|
|
"ir",
|
|
"%{thinlto_input_bitcode_file}",
|
|
]),
|
|
],
|
|
),
|
|
],
|
|
)
|
|
|
|
is_linux = ctx.attr.target_libc != "macosx"
|
|
|
|
# TODO(#8303): Mac crosstool should also declare every feature.
|
|
if is_linux:
|
|
features = [
|
|
dependency_file_feature,
|
|
random_seed_feature,
|
|
pic_feature,
|
|
per_object_debug_info_feature,
|
|
preprocessor_defines_feature,
|
|
includes_feature,
|
|
include_paths_feature,
|
|
fdo_instrument_feature,
|
|
cs_fdo_instrument_feature,
|
|
cs_fdo_optimize_feature,
|
|
thinlto_feature,
|
|
fdo_prefetch_hints_feature,
|
|
autofdo_feature,
|
|
build_interface_libraries_feature,
|
|
dynamic_library_linker_tool_feature,
|
|
symbol_counts_feature,
|
|
shared_flag_feature,
|
|
linkstamps_feature,
|
|
output_execpath_flags_feature,
|
|
runtime_library_search_directories_feature,
|
|
library_search_directories_feature,
|
|
archiver_flags_feature,
|
|
force_pic_flags_feature,
|
|
fission_support_feature,
|
|
strip_debug_symbols_feature,
|
|
coverage_feature,
|
|
supports_pic_feature,
|
|
] + (
|
|
[
|
|
supports_start_end_lib_feature,
|
|
] if ctx.attr.supports_start_end_lib else []
|
|
) + [
|
|
default_compile_flags_feature,
|
|
default_link_flags_feature,
|
|
libraries_to_link_feature,
|
|
user_link_flags_feature,
|
|
static_libgcc_feature,
|
|
fdo_optimize_feature,
|
|
supports_dynamic_linker_feature,
|
|
dbg_feature,
|
|
opt_feature,
|
|
user_compile_flags_feature,
|
|
sysroot_feature,
|
|
unfiltered_compile_flags_feature,
|
|
]
|
|
else:
|
|
features = [
|
|
supports_pic_feature,
|
|
] + (
|
|
[
|
|
supports_start_end_lib_feature,
|
|
] if ctx.attr.supports_start_end_lib else []
|
|
) + [
|
|
coverage_feature,
|
|
default_compile_flags_feature,
|
|
default_link_flags_feature,
|
|
fdo_optimize_feature,
|
|
supports_dynamic_linker_feature,
|
|
dbg_feature,
|
|
opt_feature,
|
|
user_compile_flags_feature,
|
|
sysroot_feature,
|
|
unfiltered_compile_flags_feature,
|
|
]
|
|
|
|
return cc_common.create_cc_toolchain_config_info(
|
|
ctx = ctx,
|
|
features = features,
|
|
action_configs = action_configs,
|
|
cxx_builtin_include_directories = ctx.attr.cxx_builtin_include_directories,
|
|
toolchain_identifier = ctx.attr.toolchain_identifier,
|
|
host_system_name = ctx.attr.host_system_name,
|
|
target_system_name = ctx.attr.target_system_name,
|
|
target_cpu = ctx.attr.cpu,
|
|
target_libc = ctx.attr.target_libc,
|
|
compiler = ctx.attr.compiler,
|
|
abi_version = ctx.attr.abi_version,
|
|
abi_libc_version = ctx.attr.abi_libc_version,
|
|
tool_paths = tool_paths,
|
|
)
|
|
|
|
cc_toolchain_config = rule(
|
|
implementation = _impl,
|
|
attrs = {
|
|
"abi_libc_version": attr.string(mandatory = True),
|
|
"abi_version": attr.string(mandatory = True),
|
|
"compile_flags": attr.string_list(),
|
|
"compiler": attr.string(mandatory = True),
|
|
"coverage_compile_flags": attr.string_list(),
|
|
"coverage_link_flags": attr.string_list(),
|
|
"cpu": attr.string(mandatory = True),
|
|
"cxx_builtin_include_directories": attr.string_list(),
|
|
"cxx_flags": attr.string_list(),
|
|
"dbg_compile_flags": attr.string_list(),
|
|
"host_system_name": attr.string(mandatory = True),
|
|
"link_flags": attr.string_list(),
|
|
"link_libs": attr.string_list(),
|
|
"opt_compile_flags": attr.string_list(),
|
|
"opt_link_flags": attr.string_list(),
|
|
"supports_start_end_lib": attr.bool(),
|
|
"target_libc": attr.string(mandatory = True),
|
|
"target_system_name": attr.string(mandatory = True),
|
|
"tool_paths": attr.string_dict(),
|
|
"toolchain_identifier": attr.string(mandatory = True),
|
|
"unfiltered_compile_flags": attr.string_list(),
|
|
},
|
|
provides = [CcToolchainConfigInfo],
|
|
)
|