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", ) 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, ], ), ], ), ], ) 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 = [linker_flags, compiler_flags, sysroot_flags], 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], )