| # 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( | |
| "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", | |
| "feature", | |
| "feature_set", | |
| "flag_group", | |
| "flag_set", | |
| "tool_path", | |
| "variable_with_value", | |
| "with_feature_set", | |
| ) | |
| load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") | |
| 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 = { | |
| "cpu": attr.string(mandatory = True), | |
| "compiler": attr.string(mandatory = True), | |
| "toolchain_identifier": attr.string(mandatory = True), | |
| "host_system_name": attr.string(mandatory = True), | |
| "target_system_name": attr.string(mandatory = True), | |
| "target_libc": attr.string(mandatory = True), | |
| "abi_version": attr.string(mandatory = True), | |
| "abi_libc_version": attr.string(mandatory = True), | |
| "cxx_builtin_include_directories": attr.string_list(), | |
| "tool_paths": attr.string_dict(), | |
| "compile_flags": attr.string_list(), | |
| "dbg_compile_flags": attr.string_list(), | |
| "opt_compile_flags": attr.string_list(), | |
| "cxx_flags": attr.string_list(), | |
| "link_flags": attr.string_list(), | |
| "link_libs": attr.string_list(), | |
| "opt_link_flags": attr.string_list(), | |
| "unfiltered_compile_flags": attr.string_list(), | |
| "coverage_compile_flags": attr.string_list(), | |
| "coverage_link_flags": attr.string_list(), | |
| "supports_start_end_lib": attr.bool(), | |
| }, | |
| provides = [CcToolchainConfigInfo], | |
| ) |