1load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES") 2load( 3 "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl", 4 "artifact_name_pattern", 5 "feature", 6 "flag_group", 7 "flag_set", 8 "tool_path", 9) 10 11all_link_actions = [ 12 ACTION_NAMES.cpp_link_executable, 13 ACTION_NAMES.cpp_link_dynamic_library, 14 ACTION_NAMES.cpp_link_nodeps_dynamic_library, 15] 16 17all_compile_actions = [ 18 ACTION_NAMES.assemble, 19 ACTION_NAMES.preprocess_assemble, 20 ACTION_NAMES.linkstamp_compile, 21 ACTION_NAMES.c_compile, 22 ACTION_NAMES.cpp_compile, 23 ACTION_NAMES.cpp_header_parsing, 24 ACTION_NAMES.cpp_module_codegen, 25 ACTION_NAMES.cpp_module_compile, 26 ACTION_NAMES.clif_match, 27 ACTION_NAMES.lto_backend, 28] 29 30def _impl(ctx): 31 if 'mingw' in ctx.attr.target_full_name: 32 artifact_name_patterns = [ 33 artifact_name_pattern( 34 category_name = "executable", 35 prefix = "", 36 extension = ".exe", 37 ), 38 ] 39 else: 40 artifact_name_patterns = [] 41 42 tool_paths = [ 43 tool_path( 44 name = "gcc", 45 path = "/usr/local/bin/clang", 46 ), 47 tool_path( 48 name = "ld", 49 path = ctx.attr.linker_path, 50 ), 51 tool_path( 52 name = "ar", 53 path = "/usr/local/bin/llvm-ar", 54 ), 55 tool_path( 56 name = "compat-ld", 57 path = ctx.attr.linker_path, 58 ), 59 tool_path( 60 name = "cpp", 61 path = "/bin/false", 62 ), 63 tool_path( 64 name = "dwp", 65 path = "/bin/false", 66 ), 67 tool_path( 68 name = "gcov", 69 path = "/bin/false", 70 ), 71 tool_path( 72 name = "nm", 73 path = "/bin/false", 74 ), 75 tool_path( 76 name = "objcopy", 77 path = "/bin/false", 78 ), 79 tool_path( 80 name = "objdump", 81 path = "/bin/false", 82 ), 83 tool_path( 84 name = "strip", 85 path = "/bin/false", 86 ), 87 ] 88 89 linker_flags = feature( 90 name = "default_linker_flags", 91 enabled = True, 92 flag_sets = [ 93 flag_set( 94 actions = all_link_actions, 95 flag_groups = [ 96 flag_group( 97 flags = [ 98 "-B" + ctx.attr.linker_path, 99 ctx.attr.cpp_flag, 100 "--target=" + ctx.attr.target_full_name, 101 ] + ctx.attr.extra_linker_flags, 102 ), 103 ], 104 ), 105 ], 106 ) 107 108 if 'osx' in ctx.attr.target_full_name: 109 sysroot_action_set = all_link_actions 110 else: 111 sysroot_action_set = all_link_actions + all_compile_actions 112 113 sysroot_flags = feature( 114 name = "sysroot_flags", 115 #Only enable this if a sysroot was specified 116 enabled = (ctx.attr.sysroot != ""), 117 flag_sets = [ 118 flag_set( 119 actions = sysroot_action_set, 120 flag_groups = [ 121 flag_group( 122 flags = [ 123 "--sysroot", 124 ctx.attr.sysroot, 125 ], 126 ), 127 ], 128 ), 129 ], 130 ) 131 132 compiler_flags = feature( 133 name = "default_compile_flags", 134 enabled = True, 135 flag_sets = [ 136 flag_set( 137 actions = all_compile_actions, 138 flag_groups = [ 139 flag_group( 140 flags = [ 141 ctx.attr.bit_flag, 142 "-Wall", 143 "-no-canonical-prefixes", 144 "--target=" + ctx.attr.target_full_name, 145 "-fvisibility=hidden", 146 ] + ctx.attr.extra_compiler_flags + [ 147 "-isystem", 148 ctx.attr.toolchain_dir, 149 ], 150 ), 151 ], 152 ), 153 ], 154 ) 155 156 return cc_common.create_cc_toolchain_config_info( 157 abi_libc_version = ctx.attr.abi_version, 158 abi_version = ctx.attr.abi_version, 159 artifact_name_patterns = artifact_name_patterns, 160 ctx = ctx, 161 compiler = "clang", 162 cxx_builtin_include_directories = [ 163 ctx.attr.toolchain_dir, 164 ctx.attr.extra_include, 165 "/usr/local/include", 166 "/usr/local/lib/clang", 167 ], 168 features = [linker_flags, compiler_flags, sysroot_flags], 169 host_system_name = "local", 170 target_cpu = ctx.attr.target_cpu, 171 target_libc = ctx.attr.target_cpu, 172 target_system_name = ctx.attr.target_full_name, 173 toolchain_identifier = ctx.attr.toolchain_name, 174 tool_paths = tool_paths, 175 ) 176 177cc_toolchain_config = rule( 178 implementation = _impl, 179 attrs = { 180 "abi_version": attr.string(default = "local"), 181 "bit_flag": attr.string(mandatory = True, values = ["-m32", "-m64"]), 182 "cpp_flag": attr.string(mandatory = True), 183 "extra_compiler_flags": attr.string_list(), 184 "extra_include": attr.string(mandatory = False), 185 "extra_linker_flags": attr.string_list(), 186 "linker_path": attr.string(mandatory = True), 187 "sysroot": attr.string(mandatory = False), 188 "target_cpu": attr.string(mandatory = True, values = ["aarch64", "ppc64", "systemz", "x86_32", "x86_64"]), 189 "target_full_name": attr.string(mandatory = True), 190 "toolchain_dir": attr.string(mandatory = True), 191 "toolchain_name": attr.string(mandatory = True), 192 }, 193 provides = [CcToolchainConfigInfo], 194) 195