| 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", | |
| ) | |
| load("@rules_cc//cc/common:cc_common.bzl", "cc_common") | |
| 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++", | |
| "-lm", | |
| "--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], | |
| ) |