blob: 7a949fa1cf06d9f77ff5adbc940558d2da45dc18 [file] [log] [blame] [edit]
# 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",
),
tool_path(
name = "objcopy",
path = "/usr/bin/objcopy",
),
]
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/12/include/",
"/usr/include",
],
),
"sysroot": attr.string(
default = "",
),
},
provides = [CcToolchainConfigInfo],
)