|  | #  Copyright 2020 The Monogon Project Authors. | 
|  | # | 
|  | #  SPDX-License-Identifier: Apache-2.0 | 
|  | # | 
|  | #  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. | 
|  |  | 
|  | load("@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", "feature", "flag_group", "flag_set", "tool", "tool_path") | 
|  | 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, | 
|  | ] | 
|  |  | 
|  | # This defines a minimal, barely parametrized toolchain configuration rule that | 
|  | # uses the host GCC with some possible overrides. | 
|  |  | 
|  | def _host_cc_toolchain_impl(ctx): | 
|  | cpp_feature = feature( | 
|  | name = "cpp", | 
|  | enabled = ctx.attr.has_cpp, | 
|  | flag_sets = [ | 
|  | flag_set( | 
|  | actions = all_cpp_compile_actions + [ACTION_NAMES.lto_backend], | 
|  | flag_groups = ([ | 
|  | flag_group( | 
|  | flags = ["-std=c++17"], | 
|  | ), | 
|  | ]), | 
|  | ), | 
|  | flag_set( | 
|  | actions = all_link_actions + lto_index_actions, | 
|  | flag_groups = ([ | 
|  | flag_group( | 
|  | flags = [ | 
|  | "-lstdc++", | 
|  | ], | 
|  | ), | 
|  | ]), | 
|  | ), | 
|  | ], | 
|  | ) | 
|  | link_full_libc_feature = feature( | 
|  | name = "link_full_libc", | 
|  | enabled = True, | 
|  | flag_sets = [ | 
|  | flag_set( | 
|  | actions = all_link_actions + lto_index_actions, | 
|  | flag_groups = ([ | 
|  | flag_group( | 
|  | flags = [ | 
|  | "-lm", | 
|  | "-lutil", | 
|  | "-lpthread", | 
|  | ], | 
|  | ), | 
|  | ] if ctx.attr.is_glibc else []),  # musl just works | 
|  | ), | 
|  | ], | 
|  | ) | 
|  | 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 = [ | 
|  | "-Wl,-z,relro,-z,now", | 
|  | "-pass-exit-codes", | 
|  | ], | 
|  | ), | 
|  | ]), | 
|  | ), | 
|  | ], | 
|  | ) | 
|  | tool_paths = [ | 
|  | tool_path( | 
|  | name = "gcc", | 
|  | path = ctx.attr.gcc, | 
|  | ), | 
|  | tool_path( | 
|  | name = "ld", | 
|  | path = "/usr/bin/ld", | 
|  | ), | 
|  | tool_path( | 
|  | name = "ar", | 
|  | path = "/usr/bin/ar", | 
|  | ), | 
|  | tool_path( | 
|  | name = "cpp", | 
|  | path = "/bin/false", | 
|  | ), | 
|  | tool_path( | 
|  | name = "gcov", | 
|  | path = "/bin/false", | 
|  | ), | 
|  | tool_path( | 
|  | name = "nm", | 
|  | path = "/bin/false", | 
|  | ), | 
|  | tool_path( | 
|  | name = "objdump", | 
|  | path = "/bin/false", | 
|  | ), | 
|  | tool_path( | 
|  | name = "strip", | 
|  | path = "/bin/false", | 
|  | ), | 
|  | ] | 
|  |  | 
|  | return cc_common.create_cc_toolchain_config_info( | 
|  | ctx = ctx, | 
|  | features = [default_link_flags_feature, link_full_libc_feature, cpp_feature], | 
|  | cxx_builtin_include_directories = ctx.attr.host_includes, | 
|  | toolchain_identifier = "k8-toolchain", | 
|  | host_system_name = "local", | 
|  | target_system_name = "local", | 
|  | target_cpu = "k8", | 
|  | target_libc = "unknown", | 
|  | compiler = "gcc", | 
|  | abi_version = "unknown", | 
|  | abi_libc_version = "unknown", | 
|  | tool_paths = tool_paths, | 
|  | builtin_sysroot = ctx.attr.sysroot, | 
|  | ) | 
|  |  | 
|  | host_cc_toolchain_config = rule( | 
|  | implementation = _host_cc_toolchain_impl, | 
|  | attrs = { | 
|  | "gcc": attr.string( | 
|  | default = "/usr/bin/gcc", | 
|  | ), | 
|  | "has_cpp": attr.bool(default = True), | 
|  | "is_glibc": attr.bool(default = True), | 
|  | "host_includes": attr.string_list( | 
|  | default = [ | 
|  | "/usr/lib/gcc/x86_64-redhat-linux/11/include/", | 
|  | "/usr/include", | 
|  | ], | 
|  | ), | 
|  | "sysroot": attr.string( | 
|  | default = "", | 
|  | ), | 
|  | }, | 
|  | provides = [CcToolchainConfigInfo], | 
|  | ) |