blob: b610a8ee9d969543bcbd835aee49b0e48f2421d3 [file] [log] [blame]
load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
load(
"@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
"artifact_name_pattern",
"feature",
"flag_group",
"flag_set",
"tool_path",
"with_feature_set",
)
all_link_actions = [
ACTION_NAMES.cpp_link_executable,
ACTION_NAMES.cpp_link_dynamic_library,
ACTION_NAMES.cpp_link_nodeps_dynamic_library,
]
all_compile_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_codegen,
ACTION_NAMES.cpp_module_compile,
ACTION_NAMES.clif_match,
ACTION_NAMES.lto_backend,
]
def _impl(ctx):
if "mingw" in ctx.attr.target_full_name:
artifact_name_patterns = [
artifact_name_pattern(
category_name = "executable",
prefix = "",
extension = ".exe",
),
]
else:
artifact_name_patterns = []
tool_paths = [
tool_path(
name = "gcc",
path = "/usr/local/bin/clang",
),
tool_path(
name = "ld",
path = ctx.attr.linker_path,
),
tool_path(
name = "ar",
path = "/usr/local/bin/llvm-ar",
),
tool_path(
name = "compat-ld",
path = ctx.attr.linker_path,
),
tool_path(
name = "cpp",
path = "/bin/false",
),
tool_path(
name = "dwp",
path = "/bin/false",
),
tool_path(
name = "gcov",
path = "/bin/false",
),
tool_path(
name = "nm",
path = "/bin/false",
),
tool_path(
name = "objcopy",
path = "/bin/false",
),
tool_path(
name = "objdump",
path = "/bin/false",
),
tool_path(
name = "strip",
path = "/bin/false",
),
]
linker_flags = feature(
name = "default_linker_flags",
enabled = True,
flag_sets = [
flag_set(
actions = all_link_actions,
flag_groups = [
flag_group(
flags = [
"-B" + ctx.attr.linker_path,
"-lstdc++",
"--target=" + ctx.attr.target_full_name,
] + ctx.attr.extra_linker_flags,
),
],
),
],
)
if "osx" in ctx.attr.target_full_name:
sysroot_action_set = all_link_actions
else:
sysroot_action_set = all_link_actions + all_compile_actions
sysroot_flags = feature(
name = "sysroot_flags",
#Only enable this if a sysroot was specified
enabled = (ctx.attr.sysroot != ""),
flag_sets = [
flag_set(
actions = sysroot_action_set,
flag_groups = [
flag_group(
flags = [
"--sysroot",
ctx.attr.sysroot,
],
),
],
),
],
)
if ctx.attr.target_cpu == "x86_32":
bit_flag = "-m32"
else:
bit_flag = "-m64"
compiler_flags = feature(
name = "default_compile_flags",
enabled = True,
flag_sets = [
flag_set(
actions = all_compile_actions,
flag_groups = [
flag_group(
flags = [
bit_flag,
"-Wall",
"-no-canonical-prefixes",
"--target=" + ctx.attr.target_full_name,
"-fvisibility=hidden",
] + ctx.attr.extra_compiler_flags + [
"-isystem",
ctx.attr.sysroot,
],
),
],
),
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = ["-DNDEBUG", "-O3"])],
with_features = [with_feature_set(features = ["opt"])],
),
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = ["-g"])],
with_features = [with_feature_set(features = ["dbg"])],
),
flag_set(
actions = all_compile_actions,
flag_groups = [flag_group(flags = ["-O1"])],
with_features = [with_feature_set(features = ["fastbuild"])],
),
],
)
features = [
linker_flags,
compiler_flags,
sysroot_flags,
feature(name = "dbg"),
feature(name = "opt"),
]
if "mingw" in ctx.attr.target_full_name:
features.append(
feature(
name = "targets_windows",
enabled = True,
),
)
else:
features.append(
feature(
name = "supports_pic",
enabled = True,
),
)
return cc_common.create_cc_toolchain_config_info(
abi_libc_version = ctx.attr.abi_version,
abi_version = ctx.attr.abi_version,
artifact_name_patterns = artifact_name_patterns,
ctx = ctx,
compiler = "clang",
cxx_builtin_include_directories = [
ctx.attr.sysroot,
ctx.attr.extra_include,
"/usr/local/include",
"/usr/local/lib/clang",
],
features = features,
host_system_name = "local",
target_cpu = ctx.attr.target_cpu,
target_libc = ctx.attr.target_cpu,
target_system_name = ctx.attr.target_full_name,
toolchain_identifier = ctx.attr.target_full_name,
tool_paths = tool_paths,
)
cc_toolchain_config = rule(
implementation = _impl,
attrs = {
"abi_version": attr.string(default = "local"),
"extra_compiler_flags": attr.string_list(),
"extra_include": attr.string(mandatory = False),
"extra_linker_flags": attr.string_list(),
"linker_path": attr.string(mandatory = True),
"sysroot": attr.string(mandatory = False),
"target_cpu": attr.string(mandatory = True, values = ["aarch64", "ppc64", "systemz", "x86_32", "x86_64"]),
"target_full_name": attr.string(mandatory = True),
},
provides = [CcToolchainConfigInfo],
)