| # 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", |
| "action_config", |
| "artifact_name_pattern", |
| "env_entry", |
| "env_set", |
| "feature", |
| "feature_set", |
| "flag_group", |
| "flag_set", |
| "make_variable", |
| "tool", |
| "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, |
| ] |
| |
| def _impl(ctx): |
| tool_paths = [ |
| %{tool_paths} |
| ] |
| |
| cxx_builtin_include_directories = [ |
| %{cxx_builtin_include_directories} |
| ] |
| |
| action_configs = [] |
| |
| compile_flags = [ |
| %{compile_content} |
| ] |
| |
| dbg_compile_flags = [ |
| %{dbg_compile_content} |
| ] |
| |
| opt_compile_flags = [ |
| %{opt_compile_content} |
| ] |
| |
| cxx_flags = [ |
| %{cxx_content} |
| ] |
| |
| link_flags = [ |
| %{link_content} |
| ] |
| |
| opt_link_flags = [ |
| %{opt_link_content} |
| ] |
| |
| unfiltered_compile_flags = [ |
| %{unfiltered_content} |
| ] |
| |
| %{coverage_feature} |
| |
| 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 = [ |
| ACTION_NAMES.assemble, |
| 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, |
| ], |
| flag_groups = ([flag_group(flags = compile_flags)] if compile_flags else []), |
| ), |
| 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_header_parsing, |
| ACTION_NAMES.cpp_module_compile, |
| ACTION_NAMES.cpp_module_codegen, |
| ACTION_NAMES.lto_backend, |
| ACTION_NAMES.clif_match, |
| ], |
| flag_groups = ([flag_group(flags = dbg_compile_flags)] if dbg_compile_flags else []), |
| with_features = [with_feature_set(features = ["dbg"])], |
| ), |
| 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_header_parsing, |
| ACTION_NAMES.cpp_module_compile, |
| ACTION_NAMES.cpp_module_codegen, |
| ACTION_NAMES.lto_backend, |
| ACTION_NAMES.clif_match, |
| ], |
| flag_groups = ([flag_group(flags = opt_compile_flags)] if opt_compile_flags else []), |
| with_features = [with_feature_set(features = ["opt"])], |
| ), |
| flag_set( |
| actions = [ |
| ACTION_NAMES.linkstamp_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, |
| ], |
| flag_groups = ([flag_group(flags = cxx_flags)] if cxx_flags else []), |
| ), |
| ], |
| ) |
| |
| default_link_flags_feature = feature( |
| name = "default_link_flags", |
| enabled = True, |
| flag_sets = [ |
| flag_set( |
| actions = all_link_actions, |
| flag_groups = ([flag_group(flags = link_flags)] if link_flags else []), |
| ), |
| flag_set( |
| actions = all_link_actions, |
| flag_groups = ([flag_group(flags = opt_link_flags)] if 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, |
| ACTION_NAMES.cpp_link_executable, |
| ACTION_NAMES.cpp_link_dynamic_library, |
| ACTION_NAMES.cpp_link_nodeps_dynamic_library, |
| ], |
| 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 = [ |
| ACTION_NAMES.assemble, |
| 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, |
| ], |
| 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 = [ |
| ACTION_NAMES.assemble, |
| 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, |
| ], |
| flag_groups = ([flag_group(flags = unfiltered_compile_flags)] if unfiltered_compile_flags else []), |
| ), |
| ], |
| ) |
| |
| library_search_directories_feature = feature( |
| name = "library_search_directories", |
| flag_sets = [ |
| flag_set( |
| actions = all_link_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, |
| ], |
| 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, |
| 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, |
| 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, |
| 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, |
| ], |
| flag_groups = [flag_group(flags = ["-shared"])], |
| ), |
| ], |
| ) |
| |
| if "%{use_coverage_feature}" == "": |
| coverage_feature = feature(name = "coverage") |
| |
| 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, |
| ACTION_NAMES.cpp_link_dynamic_library, |
| ACTION_NAMES.cpp_link_nodeps_dynamic_library, |
| ACTION_NAMES.cpp_link_executable, |
| ], |
| 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, |
| ACTION_NAMES.cpp_link_dynamic_library, |
| ACTION_NAMES.cpp_link_nodeps_dynamic_library, |
| ACTION_NAMES.cpp_link_executable, |
| ], |
| 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, |
| 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 = [ |
| ACTION_NAMES.cpp_link_dynamic_library, |
| ACTION_NAMES.cpp_link_nodeps_dynamic_library, |
| ACTION_NAMES.cpp_link_executable, |
| "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, |
| 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, |
| ], |
| 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, |
| 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, |
| flag_groups = [ |
| flag_group( |
| flags = ["%{user_link_flags}"], |
| iterate_over = "user_link_flags", |
| expand_if_available = "user_link_flags", |
| ), |
| ], |
| ), |
| ], |
| ) |
| |
| 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, |
| 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 = [ |
| ACTION_NAMES.cpp_link_dynamic_library, |
| ACTION_NAMES.cpp_link_nodeps_dynamic_library, |
| ACTION_NAMES.cpp_link_executable, |
| ], |
| 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], |
| 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_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, |
| ], |
| 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 = [ |
| ACTION_NAMES.cpp_link_dynamic_library, |
| ACTION_NAMES.cpp_link_nodeps_dynamic_library, |
| ACTION_NAMES.cpp_link_executable, |
| ], |
| flag_groups = [ |
| flag_group( |
| flags = ["-o", "%{output_execpath}"], |
| expand_if_available = "output_execpath", |
| ), |
| ], |
| ), |
| ], |
| ) |
| |
| is_linux = "%{target_libc}" != "macosx" |
| |
| # TODO(#8303): Windows and Mac crosstools 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, |
| 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, |
| user_link_flags_feature, |
| force_pic_flags_feature, |
| static_libgcc_feature, |
| fission_support_feature, |
| strip_debug_symbols_feature |
| ] |
| if "%{use_coverage_feature}" == "": |
| features.extend([ |
| coverage_feature, |
| llvm_coverage_map_format_feature, |
| gcc_coverage_map_format_feature |
| ]) |
| features.extend([ |
| supports_pic_feature, |
| %{supports_start_end_lib} |
| %{use_coverage_feature} |
| default_compile_flags_feature, |
| default_link_flags_feature, |
| libraries_to_link_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} |
| %{use_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 = cxx_builtin_include_directories, |
| toolchain_identifier = "%{toolchain_identifier}", |
| host_system_name = "%{host_system_name}", |
| target_system_name = "%{target_system_name}", |
| target_cpu = "%{target_cpu}", |
| target_libc = "%{target_libc}", |
| compiler = "%{compiler}", |
| abi_version = "%{abi_version}", |
| abi_libc_version = "%{abi_libc_version}", |
| tool_paths = tool_paths, |
| builtin_sysroot = "%{builtin_sysroot}", |
| cc_target_os = None, |
| ) |
| |
| cc_toolchain_config = rule( |
| implementation = _impl, |
| attrs = { |
| "cpu" : attr.string(mandatory = True), |
| "compiler": attr.string(), |
| }, |
| provides = [CcToolchainConfigInfo], |
| ) |