Refactor unix cc autoconfiguration to not use a template Starlark cc_toolchain_config rule RELNOTES: None. PiperOrigin-RevId: 249219938
diff --git a/tools/cpp/BUILD.tpl b/tools/cpp/BUILD.tpl index be1fbf5..23a4bc5 100644 --- a/tools/cpp/BUILD.tpl +++ b/tools/cpp/BUILD.tpl
@@ -73,6 +73,24 @@ name = "%{cc_toolchain_identifier}", cpu = "%{target_cpu}", compiler = "%{compiler}", + toolchain_identifier = "%{cc_toolchain_identifier}", + host_system_name = "%{host_system_name}", + target_system_name = "%{target_system_name}", + target_libc = "%{target_libc}", + abi_version = "%{abi_version}", + abi_libc_version = "%{abi_libc_version}", + cxx_builtin_include_directories = [%{cxx_builtin_include_directories}], + tool_paths = {%{tool_paths}}, + compile_flags = [%{compile_flags}], + opt_compile_flags = [%{opt_compile_flags}], + dbg_compile_flags = [%{dbg_compile_flags}], + cxx_flags = [%{cxx_flags}], + link_flags = [%{link_flags}], + opt_link_flags = [%{opt_link_flags}], + unfiltered_compile_flags = [%{unfiltered_compile_flags}], + coverage_compile_flags = [%{coverage_compile_flags}], + coverage_link_flags = [%{coverage_link_flags}], + supports_start_end_lib = %{supports_start_end_lib}, ) toolchain(
diff --git a/tools/cpp/unix_cc_configure.bzl b/tools/cpp/unix_cc_configure.bzl index 2eeca8e..0cfc5aa 100644 --- a/tools/cpp/unix_cc_configure.bzl +++ b/tools/cpp/unix_cc_configure.bzl
@@ -72,14 +72,6 @@ else: return "\"%s\"" % it -def _build_tool_path(d): - """Build the list of %-escaped tool_path for the CROSSTOOL file.""" - return [" tool_path { name: \"%s\" path: \"%s\" }" % (k, escape_string(d[k])) for k in d] - -def _build_tool_path_starlark(d): - """Build the list of %-escaped tool_path for the Starlark rule.""" - return "\n".join([" tool_path ( name= \"%s\", path= \"%s\" )," % (k, escape_string(d[k])) for k in d]) - def _find_tool(repository_ctx, tool, overriden_tools): """Find a tool for repository, taking overriden tools into account.""" if tool in overriden_tools: @@ -87,9 +79,9 @@ return which(repository_ctx, tool, "/usr/bin/" + tool) def _get_tool_paths(repository_ctx, overriden_tools): - """Compute the path to the various tools. Doesn't %-escape the result!""" + """Compute the %-escaped path to the various tools""" return dict({ - k: _find_tool(repository_ctx, k, overriden_tools) + k: escape_string(_find_tool(repository_ctx, k, overriden_tools)) for k in [ "ar", "ld", @@ -231,7 +223,7 @@ else: return "" -def _coverage_feature(repository_ctx, darwin): +def _coverage_flags(repository_ctx, darwin): use_llvm_cov = "1" == get_env_var( repository_ctx, "BAZEL_USE_LLVM_NATIVE_COVERAGE", @@ -239,49 +231,14 @@ enable_warning = False, ) if darwin or use_llvm_cov: - compile_flags = """flag_group ( - flags = ["-fprofile-instr-generate", "-fcoverage-mapping"], - ),""" - link_flags = """flag_group (flags = ["-fprofile-instr-generate"]),""" + compile_flags = '"-fprofile-instr-generate", "-fcoverage-mapping"' + link_flags = '"-fprofile-instr-generate"' else: # gcc requires --coverage being passed for compilation and linking # https://gcc.gnu.org/onlinedocs/gcc/Instrumentation-Options.html#Instrumentation-Options - compile_flags = """flag_group (flags = ["--coverage"]),""" - link_flags = """flag_group (flags = ["--coverage"]),""" - - # 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. - return """ - 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 = [ - """ + compile_flags + """ - ], - ), - flag_set ( - actions = [ - ACTION_NAMES.cpp_link_dynamic_library, - ACTION_NAMES.cpp_link_nodeps_dynamic_library, - ACTION_NAMES.cpp_link_executable, - ], - flag_groups = [ - """ + link_flags + """ - ], - ), - ], - ) -""" + compile_flags = '"--coverage"' + link_flags = '"--coverage"' + return compile_flags, link_flags def _find_generic(repository_ctx, name, env_name, overriden_tools, warn = False, silent = False): """Find a generic C++ toolchain tool. Doesn't %-escape the result.""" @@ -314,20 +271,22 @@ def find_cc(repository_ctx, overriden_tools): return _find_generic(repository_ctx, "gcc", "CC", overriden_tools) -def _feature(name, enabled): - return " feature { name: '" + name + "' enabled: " + ("true" if enabled else "false") + " }" - def configure_unix_toolchain(repository_ctx, cpu_value, overriden_tools): """Configure C++ toolchain on Unix platforms.""" paths = resolve_labels(repository_ctx, [ "@bazel_tools//tools/cpp:BUILD.tpl", "@bazel_tools//tools/cpp:armeabi_cc_toolchain_config.bzl", - "@bazel_tools//tools/cpp:cc_toolchain_config.bzl.tpl", + "@bazel_tools//tools/cpp:unix_cc_toolchain_config.bzl", "@bazel_tools//tools/cpp:linux_cc_wrapper.sh.tpl", "@bazel_tools//tools/cpp:osx_cc_wrapper.sh.tpl", ]) repository_ctx.symlink( + paths["@bazel_tools//tools/cpp:unix_cc_toolchain_config.bzl"], + "cc_toolchain_config.bzl", + ) + + repository_ctx.symlink( paths["@bazel_tools//tools/cpp:armeabi_cc_toolchain_config.bzl"], "armeabi_cc_toolchain_config.bzl", ) @@ -351,25 +310,12 @@ overriden_tools["ar"] = "/usr/bin/libtool" tool_paths = _get_tool_paths(repository_ctx, overriden_tools) - cc_toolchain_identifier = get_env_var(repository_ctx, "CC_TOOLCHAIN_NAME", "local", False) - - repository_ctx.template( - "BUILD", - paths["@bazel_tools//tools/cpp:BUILD.tpl"], - { - "%{cc_toolchain_identifier}": cc_toolchain_identifier, - "%{name}": cpu_value, - "%{supports_param_files}": "0" if darwin else "1", - "%{cc_compiler_deps}": ":cc_wrapper" if darwin else ":empty", - "%{compiler}": get_env_var( - repository_ctx, - "BAZEL_COMPILER", - "compiler", - False, - ), - "%{target_cpu}": escape_string(get_env_var(repository_ctx, "BAZEL_TARGET_CPU", cpu_value, False)), - }, - ) + cc_toolchain_identifier = escape_string(get_env_var( + repository_ctx, + "CC_TOOLCHAIN_NAME", + "local", + False, + )) cc_wrapper_src = ( "@bazel_tools//tools/cpp:osx_cc_wrapper.sh.tpl" if darwin else "@bazel_tools//tools/cpp:linux_cc_wrapper.sh.tpl" @@ -383,8 +329,18 @@ }, ) - cxx_opts = split_escaped(get_env_var(repository_ctx, "BAZEL_CXXOPTS", "-std=c++0x", False), ":") - link_opts = split_escaped(get_env_var(repository_ctx, "BAZEL_LINKOPTS", "-lstdc++:-lm", False), ":") + cxx_opts = split_escaped(get_env_var( + repository_ctx, + "BAZEL_CXXOPTS", + "-std=c++0x", + False, + ), ":") + link_opts = split_escaped(get_env_var( + repository_ctx, + "BAZEL_LINKOPTS", + "-lstdc++:-lm", + False, + ), ":") supports_gold_linker = _is_gold_supported(repository_ctx, cc) cc_path = repository_ctx.path(cc) if not str(cc_path).startswith(str(repository_ctx.path(".")) + "/"): @@ -394,20 +350,61 @@ # cc is inside the repository, don't set -B. bin_search_flag = [] + coverage_compile_flags, coverage_link_flags = _coverage_flags(repository_ctx, darwin) + repository_ctx.template( - "cc_toolchain_config.bzl", - paths["@bazel_tools//tools/cpp:cc_toolchain_config.bzl.tpl"], + "BUILD", + paths["@bazel_tools//tools/cpp:BUILD.tpl"], { - "%{toolchain_identifier}": escape_string(cc_toolchain_identifier), - "%{abi_version}": escape_string(get_env_var(repository_ctx, "ABI_VERSION", "local", False)), - "%{abi_libc_version}": escape_string(get_env_var(repository_ctx, "ABI_LIBC_VERSION", "local", False)), - "%{builtin_sysroot}": "", - "%{compiler}": escape_string(get_env_var(repository_ctx, "BAZEL_COMPILER", "compiler", False)), - "%{host_system_name}": escape_string(get_env_var(repository_ctx, "BAZEL_HOST_SYSTEM", "local", False)), - "%{target_libc}": "macosx" if darwin else escape_string(get_env_var(repository_ctx, "BAZEL_TARGET_LIBC", "local", False)), - "%{target_cpu}": escape_string(get_env_var(repository_ctx, "BAZEL_TARGET_CPU", cpu_value, False)), - "%{target_system_name}": escape_string(get_env_var(repository_ctx, "BAZEL_TARGET_SYSTEM", "local", False)), - "%{tool_paths}": _build_tool_path_starlark(tool_paths), + "%{cc_toolchain_identifier}": cc_toolchain_identifier, + "%{name}": cpu_value, + "%{supports_param_files}": "0" if darwin else "1", + "%{cc_compiler_deps}": ":cc_wrapper" if darwin else ":empty", + "%{compiler}": escape_string(get_env_var( + repository_ctx, + "BAZEL_COMPILER", + "compiler", + False, + )), + "%{abi_version}": escape_string(get_env_var( + repository_ctx, + "ABI_VERSION", + "local", + False, + )), + "%{abi_libc_version}": escape_string(get_env_var( + repository_ctx, + "ABI_LIBC_VERSION", + "local", + False, + )), + "%{host_system_name}": escape_string(get_env_var( + repository_ctx, + "BAZEL_HOST_SYSTEM", + "local", + False, + )), + "%{target_libc}": "macosx" if darwin else escape_string(get_env_var( + repository_ctx, + "BAZEL_TARGET_LIBC", + "local", + False, + )), + "%{target_cpu}": escape_string(get_env_var( + repository_ctx, + "BAZEL_TARGET_CPU", + cpu_value, + False, + )), + "%{target_system_name}": escape_string(get_env_var( + repository_ctx, + "BAZEL_TARGET_SYSTEM", + "local", + False, + )), + "%{tool_paths}": ",\n ".join( + ['"%s": "%s"' % (k, v) for k, v in tool_paths.items()], + ), "%{cxx_builtin_include_directories}": get_starlark_list( _uniq( get_escaped_cxx_inc_directories(repository_ctx, cc, "-xc") + @@ -426,7 +423,7 @@ ), ), ), - "%{compile_content}": get_starlark_list( + "%{compile_flags}": get_starlark_list( [ # Security hardening requires optimization. # We need to undef it as some distributions now have it enabled by default. @@ -451,8 +448,8 @@ "-fno-omit-frame-pointer", ], ), - "%{cxx_content}": get_starlark_list(cxx_opts + _escaped_cplus_include_paths(repository_ctx)), - "%{link_content}": get_starlark_list(( + "%{cxx_flags}": get_starlark_list(cxx_opts + _escaped_cplus_include_paths(repository_ctx)), + "%{link_flags}": get_starlark_list(( ["-fuse-ld=gold"] if supports_gold_linker else [] ) + _add_linker_option_if_supported( repository_ctx, @@ -480,7 +477,7 @@ "-pass-exit-codes", ) ) + link_opts), - "%{opt_compile_content}": get_starlark_list( + "%{opt_compile_flags}": get_starlark_list( [ # No debug symbols. # Maybe we should enable https://gcc.gnu.org/wiki/DebugFission for opt or @@ -500,12 +497,13 @@ # Disable assertions "-DNDEBUG", - # Removal of unused code and data at link time (can this increase binary size in some cases?). + # Removal of unused code and data at link time (can this increase binary + # size in some cases?). "-ffunction-sections", "-fdata-sections", ], ), - "%{opt_link_content}": get_starlark_list( + "%{opt_link_flags}": get_starlark_list( [] if darwin else _add_linker_option_if_supported( repository_ctx, cc, @@ -513,7 +511,7 @@ "-gc-sections", ), ), - "%{unfiltered_content}": get_starlark_list( + "%{unfiltered_compile_flags}": get_starlark_list( _get_no_canonical_prefixes_opt(repository_ctx, cc) + [ # Make C++ compilation deterministic. Use linkstamping instead of these # compiler symbols. @@ -523,9 +521,9 @@ "-D__TIME__=\\\"redacted\\\"", ], ), - "%{dbg_compile_content}": get_starlark_list(["-g"]), - "%{coverage_feature}": _coverage_feature(repository_ctx, darwin), - "%{use_coverage_feature}": "coverage_feature,", - "%{supports_start_end_lib}": "supports_start_end_lib_feature," if supports_gold_linker else "", + "%{dbg_compile_flags}": get_starlark_list(["-g"]), + "%{coverage_compile_flags}": coverage_compile_flags, + "%{coverage_link_flags}": coverage_link_flags, + "%{supports_start_end_lib}": "True" if supports_gold_linker else "False", }, )
diff --git a/tools/cpp/cc_toolchain_config.bzl.tpl b/tools/cpp/unix_cc_toolchain_config.bzl similarity index 82% rename from tools/cpp/cc_toolchain_config.bzl.tpl rename to tools/cpp/unix_cc_toolchain_config.bzl index 253001a..d7da983 100644 --- a/tools/cpp/cc_toolchain_config.bzl.tpl +++ b/tools/cpp/unix_cc_toolchain_config.bzl
@@ -13,23 +13,18 @@ # 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") +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, @@ -81,45 +76,11 @@ def _impl(ctx): tool_paths = [ -%{tool_paths} + tool_path(name = name, path = path) + for name, path in ctx.attr.tool_paths.items() ] - - 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, @@ -146,7 +107,11 @@ ACTION_NAMES.lto_backend, ACTION_NAMES.clif_match, ], - flag_groups = ([flag_group(flags = compile_flags)] if compile_flags else []), + flag_groups = ([ + flag_group( + flags = ctx.attr.compile_flags, + ), + ] if ctx.attr.compile_flags else []), ), flag_set( actions = [ @@ -161,7 +126,11 @@ ACTION_NAMES.lto_backend, ACTION_NAMES.clif_match, ], - flag_groups = ([flag_group(flags = dbg_compile_flags)] if dbg_compile_flags else []), + 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( @@ -177,7 +146,11 @@ ACTION_NAMES.lto_backend, ACTION_NAMES.clif_match, ], - flag_groups = ([flag_group(flags = opt_compile_flags)] if opt_compile_flags else []), + 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( @@ -190,7 +163,11 @@ ACTION_NAMES.lto_backend, ACTION_NAMES.clif_match, ], - flag_groups = ([flag_group(flags = cxx_flags)] if cxx_flags else []), + flag_groups = ([ + flag_group( + flags = ctx.attr.cxx_flags, + ), + ] if ctx.attr.cxx_flags else []), ), ], ) @@ -201,11 +178,19 @@ flag_sets = [ flag_set( actions = all_link_actions, - flag_groups = ([flag_group(flags = link_flags)] if link_flags else []), + flag_groups = ([ + flag_group( + flags = ctx.attr.link_flags, + ), + ] if ctx.attr.link_flags else []), ), flag_set( actions = all_link_actions, - flag_groups = ([flag_group(flags = opt_link_flags)] if opt_link_flags else []), + flag_groups = ([ + flag_group( + flags = ctx.attr.opt_link_flags, + ), + ] if ctx.attr.opt_link_flags else []), with_features = [with_feature_set(features = ["opt"])], ), ], @@ -221,24 +206,24 @@ 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, + 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", - ), + flag_group( + flags = ["--sysroot=%{sysroot}"], + expand_if_available = "sysroot", + ), ], ), ], @@ -250,13 +235,13 @@ 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", - ), + flag_group( + flags = [ + "-fprofile-use=%{fdo_profile_path}", + "-fprofile-correction", + ], + expand_if_available = "fdo_profile_path", + ), ], ), ], @@ -271,26 +256,26 @@ 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, + 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", - ), + flag_group( + flags = ["%{user_compile_flags}"], + iterate_over = "user_compile_flags", + expand_if_available = "user_compile_flags", + ), ], ), - ], + ], ) unfiltered_compile_flags_feature = feature( @@ -299,18 +284,22 @@ 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, + 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 []), + flag_groups = ([ + flag_group( + flags = ctx.attr.unfiltered_compile_flags, + ), + ] if ctx.attr.unfiltered_compile_flags else []), ), ], ) @@ -342,7 +331,7 @@ ], flag_groups = [flag_group(flags = ["-static-libgcc"])], with_features = [ - with_feature_set(features = ["static_link_cpp_runtimes"]) + with_feature_set(features = ["static_link_cpp_runtimes"]), ], ), ], @@ -481,7 +470,7 @@ ), ], with_features = [ - with_feature_set(features = ["static_link_cpp_runtimes"]) + with_feature_set(features = ["static_link_cpp_runtimes"]), ], ), flag_set( @@ -537,9 +526,6 @@ ], ) - if "%{use_coverage_feature}" == "": - coverage_feature = feature(name = "coverage") - random_seed_feature = feature( name = "random_seed", enabled = True, @@ -628,7 +614,7 @@ flag_groups = [ flag_group( flags = [ - "-fcs-profile-generate=%{cs_fdo_instrument_path}" + "-fcs-profile-generate=%{cs_fdo_instrument_path}", ], expand_if_available = "cs_fdo_instrument_path", ), @@ -680,7 +666,7 @@ flag_groups = [ flag_group( flags = [ - "-Wl,--print-symbol-counts=%{symbol_counts_output}" + "-Wl,--print-symbol-counts=%{symbol_counts_output}", ], expand_if_available = "symbol_counts_output", ), @@ -705,7 +691,7 @@ flag_group( flags = [ "-fprofile-instr-generate", - "-fcoverage-mapping" + "-fcoverage-mapping", ], ), ], @@ -719,7 +705,7 @@ "objc++-executable", ], flag_groups = [ - flag_group(flags = ["-fprofile-instr-generate"]) + flag_group(flags = ["-fprofile-instr-generate"]), ], ), ], @@ -1070,9 +1056,41 @@ ], ) - is_linux = "%{target_libc}" != "macosx" + # 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 = [ + ACTION_NAMES.cpp_link_dynamic_library, + ACTION_NAMES.cpp_link_nodeps_dynamic_library, + ACTION_NAMES.cpp_link_executable, + ], + flag_groups = ([ + flag_group(flags = ctx.attr.coverage_link_flags), + ] if ctx.attr.coverage_link_flags else []), + ), + ], + ) - # TODO(#8303): Windows and Mac crosstools should also declare every feature. + is_linux = ctx.attr.target_libc != "macosx" + + # TODO(#8303): Mac crosstool should also declare every feature. if is_linux: features = [ dependency_file_feature, @@ -1098,18 +1116,14 @@ archiver_flags_feature, force_pic_flags_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([ + strip_debug_symbols_feature, + coverage_feature, supports_pic_feature, - %{supports_start_end_lib} - %{use_coverage_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, @@ -1122,12 +1136,16 @@ user_compile_flags_feature, sysroot_feature, unfiltered_compile_flags_feature, - ]) + ] else: features = [ supports_pic_feature, - %{supports_start_end_lib} - %{use_coverage_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, @@ -1143,25 +1161,41 @@ 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}", + 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, - builtin_sysroot = "%{builtin_sysroot}", - cc_target_os = None, ) cc_toolchain_config = rule( implementation = _impl, attrs = { - "cpu" : attr.string(mandatory = True), - "compiler": attr.string(), + "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(), + "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], )