• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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