blob: c5fd79eaec6c5282c2d4fabd64d0fb6bd5f7fce7 [file] [log] [blame]
rosica71bc38f2019-02-04 02:39:30 -08001# Copyright 2019 The Bazel Authors. All rights reserved.
2#
3# Licensed under the Apache License, Version 2.0 (the "License");
4# you may not use this file except in compliance with the License.
5# You may obtain a copy of the License at
6#
7# http://www.apache.org/licenses/LICENSE-2.0
8#
9# Unless required by applicable law or agreed to in writing, software
10# distributed under the License is distributed on an "AS IS" BASIS,
11# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12# See the License for the specific language governing permissions and
13# limitations under the License.
14
15"""A Starlark cc_toolchain configuration rule"""
rosica71bc38f2019-02-04 02:39:30 -080016
rosica96500b72019-05-21 03:25:53 -070017load(
18 "@bazel_tools//tools/cpp:cc_toolchain_config_lib.bzl",
19 "feature",
20 "feature_set",
21 "flag_group",
22 "flag_set",
23 "tool_path",
24 "variable_with_value",
25 "with_feature_set",
26)
27load("@bazel_tools//tools/build_defs/cc:action_names.bzl", "ACTION_NAMES")
rosica71bc38f2019-02-04 02:39:30 -080028
29all_compile_actions = [
30 ACTION_NAMES.c_compile,
31 ACTION_NAMES.cpp_compile,
32 ACTION_NAMES.linkstamp_compile,
33 ACTION_NAMES.assemble,
34 ACTION_NAMES.preprocess_assemble,
35 ACTION_NAMES.cpp_header_parsing,
36 ACTION_NAMES.cpp_module_compile,
37 ACTION_NAMES.cpp_module_codegen,
38 ACTION_NAMES.clif_match,
39 ACTION_NAMES.lto_backend,
40]
41
42all_cpp_compile_actions = [
43 ACTION_NAMES.cpp_compile,
44 ACTION_NAMES.linkstamp_compile,
45 ACTION_NAMES.cpp_header_parsing,
46 ACTION_NAMES.cpp_module_compile,
47 ACTION_NAMES.cpp_module_codegen,
48 ACTION_NAMES.clif_match,
49]
50
51preprocessor_compile_actions = [
52 ACTION_NAMES.c_compile,
53 ACTION_NAMES.cpp_compile,
54 ACTION_NAMES.linkstamp_compile,
55 ACTION_NAMES.preprocess_assemble,
56 ACTION_NAMES.cpp_header_parsing,
57 ACTION_NAMES.cpp_module_compile,
58 ACTION_NAMES.clif_match,
59]
60
61codegen_compile_actions = [
62 ACTION_NAMES.c_compile,
63 ACTION_NAMES.cpp_compile,
64 ACTION_NAMES.linkstamp_compile,
65 ACTION_NAMES.assemble,
66 ACTION_NAMES.preprocess_assemble,
67 ACTION_NAMES.cpp_module_codegen,
68 ACTION_NAMES.lto_backend,
69]
70
71all_link_actions = [
72 ACTION_NAMES.cpp_link_executable,
73 ACTION_NAMES.cpp_link_dynamic_library,
74 ACTION_NAMES.cpp_link_nodeps_dynamic_library,
75]
76
rosica1112b552019-07-05 06:35:15 -070077lto_index_actions = [
78 ACTION_NAMES.lto_index_for_executable,
79 ACTION_NAMES.lto_index_for_dynamic_library,
80 ACTION_NAMES.lto_index_for_nodeps_dynamic_library,
81]
82
rosica71bc38f2019-02-04 02:39:30 -080083def _impl(ctx):
rosica71bc38f2019-02-04 02:39:30 -080084 tool_paths = [
rosica96500b72019-05-21 03:25:53 -070085 tool_path(name = name, path = path)
86 for name, path in ctx.attr.tool_paths.items()
rosica71bc38f2019-02-04 02:39:30 -080087 ]
rosica71bc38f2019-02-04 02:39:30 -080088 action_configs = []
89
rosica71bc38f2019-02-04 02:39:30 -080090 supports_pic_feature = feature(
91 name = "supports_pic",
92 enabled = True,
93 )
94 supports_start_end_lib_feature = feature(
95 name = "supports_start_end_lib",
96 enabled = True,
97 )
98
99 default_compile_flags_feature = feature(
100 name = "default_compile_flags",
101 enabled = True,
102 flag_sets = [
103 flag_set(
rosica1112b552019-07-05 06:35:15 -0700104 actions = all_compile_actions,
rosica96500b72019-05-21 03:25:53 -0700105 flag_groups = ([
106 flag_group(
107 flags = ctx.attr.compile_flags,
108 ),
109 ] if ctx.attr.compile_flags else []),
rosica71bc38f2019-02-04 02:39:30 -0800110 ),
111 flag_set(
rosica1112b552019-07-05 06:35:15 -0700112 actions = all_compile_actions,
rosica96500b72019-05-21 03:25:53 -0700113 flag_groups = ([
114 flag_group(
115 flags = ctx.attr.dbg_compile_flags,
116 ),
117 ] if ctx.attr.dbg_compile_flags else []),
rosica71bc38f2019-02-04 02:39:30 -0800118 with_features = [with_feature_set(features = ["dbg"])],
119 ),
120 flag_set(
rosica1112b552019-07-05 06:35:15 -0700121 actions = all_compile_actions,
rosica96500b72019-05-21 03:25:53 -0700122 flag_groups = ([
123 flag_group(
124 flags = ctx.attr.opt_compile_flags,
125 ),
126 ] if ctx.attr.opt_compile_flags else []),
rosica71bc38f2019-02-04 02:39:30 -0800127 with_features = [with_feature_set(features = ["opt"])],
128 ),
129 flag_set(
rosica1112b552019-07-05 06:35:15 -0700130 actions = all_cpp_compile_actions + [ACTION_NAMES.lto_backend],
rosica96500b72019-05-21 03:25:53 -0700131 flag_groups = ([
132 flag_group(
133 flags = ctx.attr.cxx_flags,
134 ),
135 ] if ctx.attr.cxx_flags else []),
rosica71bc38f2019-02-04 02:39:30 -0800136 ),
137 ],
138 )
139
140 default_link_flags_feature = feature(
141 name = "default_link_flags",
142 enabled = True,
143 flag_sets = [
144 flag_set(
rosica1112b552019-07-05 06:35:15 -0700145 actions = all_link_actions + lto_index_actions,
rosica96500b72019-05-21 03:25:53 -0700146 flag_groups = ([
147 flag_group(
148 flags = ctx.attr.link_flags,
149 ),
150 ] if ctx.attr.link_flags else []),
rosica71bc38f2019-02-04 02:39:30 -0800151 ),
152 flag_set(
rosica1112b552019-07-05 06:35:15 -0700153 actions = all_link_actions + lto_index_actions,
rosica96500b72019-05-21 03:25:53 -0700154 flag_groups = ([
155 flag_group(
156 flags = ctx.attr.opt_link_flags,
157 ),
158 ] if ctx.attr.opt_link_flags else []),
rosica71bc38f2019-02-04 02:39:30 -0800159 with_features = [with_feature_set(features = ["opt"])],
160 ),
161 ],
162 )
163
164 dbg_feature = feature(name = "dbg")
165
166 opt_feature = feature(name = "opt")
167
168 sysroot_feature = feature(
169 name = "sysroot",
170 enabled = True,
171 flag_sets = [
172 flag_set(
173 actions = [
rosica96500b72019-05-21 03:25:53 -0700174 ACTION_NAMES.preprocess_assemble,
175 ACTION_NAMES.linkstamp_compile,
176 ACTION_NAMES.c_compile,
177 ACTION_NAMES.cpp_compile,
178 ACTION_NAMES.cpp_header_parsing,
179 ACTION_NAMES.cpp_module_compile,
180 ACTION_NAMES.cpp_module_codegen,
181 ACTION_NAMES.lto_backend,
182 ACTION_NAMES.clif_match,
rosica1112b552019-07-05 06:35:15 -0700183 ] + all_link_actions + lto_index_actions,
rosica71bc38f2019-02-04 02:39:30 -0800184 flag_groups = [
rosica96500b72019-05-21 03:25:53 -0700185 flag_group(
186 flags = ["--sysroot=%{sysroot}"],
187 expand_if_available = "sysroot",
188 ),
rosica71bc38f2019-02-04 02:39:30 -0800189 ],
190 ),
191 ],
192 )
193
194 fdo_optimize_feature = feature(
195 name = "fdo_optimize",
196 flag_sets = [
197 flag_set(
198 actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
199 flag_groups = [
rosica96500b72019-05-21 03:25:53 -0700200 flag_group(
201 flags = [
202 "-fprofile-use=%{fdo_profile_path}",
203 "-fprofile-correction",
204 ],
205 expand_if_available = "fdo_profile_path",
206 ),
rosica71bc38f2019-02-04 02:39:30 -0800207 ],
208 ),
209 ],
210 provides = ["profile"],
211 )
212
213 supports_dynamic_linker_feature = feature(name = "supports_dynamic_linker", enabled = True)
214
215 user_compile_flags_feature = feature(
216 name = "user_compile_flags",
217 enabled = True,
218 flag_sets = [
219 flag_set(
rosica1112b552019-07-05 06:35:15 -0700220 actions = all_compile_actions,
rosica71bc38f2019-02-04 02:39:30 -0800221 flag_groups = [
rosica96500b72019-05-21 03:25:53 -0700222 flag_group(
223 flags = ["%{user_compile_flags}"],
224 iterate_over = "user_compile_flags",
225 expand_if_available = "user_compile_flags",
226 ),
rosica71bc38f2019-02-04 02:39:30 -0800227 ],
228 ),
rosica96500b72019-05-21 03:25:53 -0700229 ],
rosica71bc38f2019-02-04 02:39:30 -0800230 )
231
232 unfiltered_compile_flags_feature = feature(
233 name = "unfiltered_compile_flags",
234 enabled = True,
235 flag_sets = [
236 flag_set(
rosica1112b552019-07-05 06:35:15 -0700237 actions = all_compile_actions,
rosica96500b72019-05-21 03:25:53 -0700238 flag_groups = ([
239 flag_group(
240 flags = ctx.attr.unfiltered_compile_flags,
241 ),
242 ] if ctx.attr.unfiltered_compile_flags else []),
rosica71bc38f2019-02-04 02:39:30 -0800243 ),
244 ],
245 )
246
plf0ff6c092019-05-14 05:22:12 -0700247 library_search_directories_feature = feature(
248 name = "library_search_directories",
249 flag_sets = [
250 flag_set(
rosica1112b552019-07-05 06:35:15 -0700251 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700252 flag_groups = [
253 flag_group(
254 flags = ["-L%{library_search_directories}"],
255 iterate_over = "library_search_directories",
256 expand_if_available = "library_search_directories",
257 ),
258 ],
259 ),
260 ],
261 )
262
263 static_libgcc_feature = feature(
264 name = "static_libgcc",
265 enabled = True,
266 flag_sets = [
267 flag_set(
268 actions = [
269 ACTION_NAMES.cpp_link_executable,
270 ACTION_NAMES.cpp_link_dynamic_library,
rosica1112b552019-07-05 06:35:15 -0700271 ACTION_NAMES.lto_index_for_executable,
272 ACTION_NAMES.lto_index_for_dynamic_library,
plf0ff6c092019-05-14 05:22:12 -0700273 ],
274 flag_groups = [flag_group(flags = ["-static-libgcc"])],
275 with_features = [
rosica96500b72019-05-21 03:25:53 -0700276 with_feature_set(features = ["static_link_cpp_runtimes"]),
plf0ff6c092019-05-14 05:22:12 -0700277 ],
278 ),
279 ],
280 )
281
282 pic_feature = feature(
283 name = "pic",
284 enabled = True,
285 flag_sets = [
286 flag_set(
287 actions = [
288 ACTION_NAMES.assemble,
289 ACTION_NAMES.preprocess_assemble,
290 ACTION_NAMES.linkstamp_compile,
291 ACTION_NAMES.c_compile,
292 ACTION_NAMES.cpp_compile,
293 ACTION_NAMES.cpp_module_codegen,
294 ACTION_NAMES.cpp_module_compile,
295 ],
296 flag_groups = [
297 flag_group(flags = ["-fPIC"], expand_if_available = "pic"),
298 ],
299 ),
300 ],
301 )
302
303 per_object_debug_info_feature = feature(
304 name = "per_object_debug_info",
305 flag_sets = [
306 flag_set(
307 actions = [
308 ACTION_NAMES.assemble,
309 ACTION_NAMES.preprocess_assemble,
310 ACTION_NAMES.c_compile,
311 ACTION_NAMES.cpp_compile,
312 ACTION_NAMES.cpp_module_codegen,
313 ],
314 flag_groups = [
315 flag_group(
316 flags = ["-gsplit-dwarf"],
317 expand_if_available = "per_object_debug_info_file",
318 ),
319 ],
320 ),
321 ],
322 )
323
324 preprocessor_defines_feature = feature(
325 name = "preprocessor_defines",
326 enabled = True,
327 flag_sets = [
328 flag_set(
329 actions = [
330 ACTION_NAMES.preprocess_assemble,
331 ACTION_NAMES.linkstamp_compile,
332 ACTION_NAMES.c_compile,
333 ACTION_NAMES.cpp_compile,
334 ACTION_NAMES.cpp_header_parsing,
335 ACTION_NAMES.cpp_module_compile,
336 ACTION_NAMES.clif_match,
337 ],
338 flag_groups = [
339 flag_group(
340 flags = ["-D%{preprocessor_defines}"],
341 iterate_over = "preprocessor_defines",
342 ),
343 ],
344 ),
345 ],
346 )
347
348 cs_fdo_optimize_feature = feature(
349 name = "cs_fdo_optimize",
350 flag_sets = [
351 flag_set(
352 actions = [ACTION_NAMES.lto_backend],
353 flag_groups = [
354 flag_group(
355 flags = [
356 "-fprofile-use=%{fdo_profile_path}",
357 "-Xclang-only=-Wno-profile-instr-unprofiled",
358 "-Xclang-only=-Wno-profile-instr-out-of-date",
359 "-fprofile-correction",
360 ],
361 expand_if_available = "fdo_profile_path",
362 ),
363 ],
364 ),
365 ],
366 provides = ["csprofile"],
367 )
368
369 autofdo_feature = feature(
370 name = "autofdo",
371 flag_sets = [
372 flag_set(
373 actions = [ACTION_NAMES.c_compile, ACTION_NAMES.cpp_compile],
374 flag_groups = [
375 flag_group(
376 flags = [
377 "-fauto-profile=%{fdo_profile_path}",
378 "-fprofile-correction",
379 ],
380 expand_if_available = "fdo_profile_path",
381 ),
382 ],
383 ),
384 ],
385 provides = ["profile"],
386 )
387
388 runtime_library_search_directories_feature = feature(
389 name = "runtime_library_search_directories",
390 flag_sets = [
391 flag_set(
rosica1112b552019-07-05 06:35:15 -0700392 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700393 flag_groups = [
394 flag_group(
395 iterate_over = "runtime_library_search_directories",
396 flag_groups = [
397 flag_group(
398 flags = [
399 "-Wl,-rpath,$EXEC_ORIGIN/%{runtime_library_search_directories}",
400 ],
401 expand_if_true = "is_cc_test",
402 ),
403 flag_group(
404 flags = [
405 "-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}",
406 ],
407 expand_if_false = "is_cc_test",
408 ),
409 ],
410 expand_if_available =
411 "runtime_library_search_directories",
412 ),
413 ],
414 with_features = [
rosica96500b72019-05-21 03:25:53 -0700415 with_feature_set(features = ["static_link_cpp_runtimes"]),
plf0ff6c092019-05-14 05:22:12 -0700416 ],
417 ),
418 flag_set(
rosica1112b552019-07-05 06:35:15 -0700419 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700420 flag_groups = [
421 flag_group(
422 iterate_over = "runtime_library_search_directories",
423 flag_groups = [
424 flag_group(
425 flags = [
426 "-Wl,-rpath,$ORIGIN/%{runtime_library_search_directories}",
427 ],
428 ),
429 ],
430 expand_if_available =
431 "runtime_library_search_directories",
432 ),
433 ],
434 with_features = [
435 with_feature_set(
436 not_features = ["static_link_cpp_runtimes"],
437 ),
438 ],
439 ),
440 ],
441 )
442
443 fission_support_feature = feature(
444 name = "fission_support",
445 flag_sets = [
446 flag_set(
rosica1112b552019-07-05 06:35:15 -0700447 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700448 flag_groups = [
449 flag_group(
450 flags = ["-Wl,--gdb-index"],
451 expand_if_available = "is_using_fission",
452 ),
453 ],
454 ),
455 ],
456 )
457
458 shared_flag_feature = feature(
459 name = "shared_flag",
460 flag_sets = [
461 flag_set(
462 actions = [
463 ACTION_NAMES.cpp_link_dynamic_library,
464 ACTION_NAMES.cpp_link_nodeps_dynamic_library,
rosica1112b552019-07-05 06:35:15 -0700465 ACTION_NAMES.lto_index_for_dynamic_library,
466 ACTION_NAMES.lto_index_for_nodeps_dynamic_library,
plf0ff6c092019-05-14 05:22:12 -0700467 ],
468 flag_groups = [flag_group(flags = ["-shared"])],
469 ),
470 ],
471 )
472
plf0ff6c092019-05-14 05:22:12 -0700473 random_seed_feature = feature(
474 name = "random_seed",
475 enabled = True,
476 flag_sets = [
477 flag_set(
478 actions = [
479 ACTION_NAMES.c_compile,
480 ACTION_NAMES.cpp_compile,
481 ACTION_NAMES.cpp_module_codegen,
482 ACTION_NAMES.cpp_module_compile,
483 ],
484 flag_groups = [
485 flag_group(
486 flags = ["-frandom-seed=%{output_file}"],
487 expand_if_available = "output_file",
488 ),
489 ],
490 ),
491 ],
492 )
493
494 includes_feature = feature(
495 name = "includes",
496 enabled = True,
497 flag_sets = [
498 flag_set(
499 actions = [
500 ACTION_NAMES.preprocess_assemble,
501 ACTION_NAMES.linkstamp_compile,
502 ACTION_NAMES.c_compile,
503 ACTION_NAMES.cpp_compile,
504 ACTION_NAMES.cpp_header_parsing,
505 ACTION_NAMES.cpp_module_compile,
506 ACTION_NAMES.clif_match,
507 ACTION_NAMES.objc_compile,
508 ACTION_NAMES.objcpp_compile,
509 ],
510 flag_groups = [
511 flag_group(
512 flags = ["-include", "%{includes}"],
513 iterate_over = "includes",
514 expand_if_available = "includes",
515 ),
516 ],
517 ),
518 ],
519 )
520
521 fdo_instrument_feature = feature(
522 name = "fdo_instrument",
523 flag_sets = [
524 flag_set(
525 actions = [
526 ACTION_NAMES.c_compile,
527 ACTION_NAMES.cpp_compile,
rosica1112b552019-07-05 06:35:15 -0700528 ] + all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700529 flag_groups = [
530 flag_group(
531 flags = [
532 "-fprofile-generate=%{fdo_instrument_path}",
533 "-fno-data-sections",
534 ],
535 expand_if_available = "fdo_instrument_path",
536 ),
537 ],
538 ),
539 ],
540 provides = ["profile"],
541 )
542
543 cs_fdo_instrument_feature = feature(
544 name = "cs_fdo_instrument",
545 flag_sets = [
546 flag_set(
547 actions = [
548 ACTION_NAMES.c_compile,
549 ACTION_NAMES.cpp_compile,
550 ACTION_NAMES.lto_backend,
rosica1112b552019-07-05 06:35:15 -0700551 ] + all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700552 flag_groups = [
553 flag_group(
554 flags = [
rosica96500b72019-05-21 03:25:53 -0700555 "-fcs-profile-generate=%{cs_fdo_instrument_path}",
plf0ff6c092019-05-14 05:22:12 -0700556 ],
557 expand_if_available = "cs_fdo_instrument_path",
558 ),
559 ],
560 ),
561 ],
562 provides = ["csprofile"],
563 )
564
565 include_paths_feature = feature(
566 name = "include_paths",
567 enabled = True,
568 flag_sets = [
569 flag_set(
570 actions = [
571 ACTION_NAMES.preprocess_assemble,
572 ACTION_NAMES.linkstamp_compile,
573 ACTION_NAMES.c_compile,
574 ACTION_NAMES.cpp_compile,
575 ACTION_NAMES.cpp_header_parsing,
576 ACTION_NAMES.cpp_module_compile,
577 ACTION_NAMES.clif_match,
578 ACTION_NAMES.objc_compile,
579 ACTION_NAMES.objcpp_compile,
580 ],
581 flag_groups = [
582 flag_group(
583 flags = ["-iquote", "%{quote_include_paths}"],
584 iterate_over = "quote_include_paths",
585 ),
586 flag_group(
587 flags = ["-I%{include_paths}"],
588 iterate_over = "include_paths",
589 ),
590 flag_group(
591 flags = ["-isystem", "%{system_include_paths}"],
592 iterate_over = "system_include_paths",
593 ),
594 ],
595 ),
596 ],
597 )
598
599 symbol_counts_feature = feature(
600 name = "symbol_counts",
601 flag_sets = [
602 flag_set(
rosica1112b552019-07-05 06:35:15 -0700603 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700604 flag_groups = [
605 flag_group(
606 flags = [
rosica96500b72019-05-21 03:25:53 -0700607 "-Wl,--print-symbol-counts=%{symbol_counts_output}",
plf0ff6c092019-05-14 05:22:12 -0700608 ],
609 expand_if_available = "symbol_counts_output",
610 ),
611 ],
612 ),
613 ],
614 )
615
616 llvm_coverage_map_format_feature = feature(
617 name = "llvm_coverage_map_format",
618 flag_sets = [
619 flag_set(
620 actions = [
621 ACTION_NAMES.preprocess_assemble,
622 ACTION_NAMES.c_compile,
623 ACTION_NAMES.cpp_compile,
624 ACTION_NAMES.cpp_module_compile,
625 ACTION_NAMES.objc_compile,
626 ACTION_NAMES.objcpp_compile,
627 ],
628 flag_groups = [
629 flag_group(
630 flags = [
631 "-fprofile-instr-generate",
rosica96500b72019-05-21 03:25:53 -0700632 "-fcoverage-mapping",
plf0ff6c092019-05-14 05:22:12 -0700633 ],
634 ),
635 ],
636 ),
637 flag_set(
rosica1112b552019-07-05 06:35:15 -0700638 actions = all_link_actions + lto_index_actions + [
plf0ff6c092019-05-14 05:22:12 -0700639 "objc-executable",
640 "objc++-executable",
641 ],
642 flag_groups = [
rosica96500b72019-05-21 03:25:53 -0700643 flag_group(flags = ["-fprofile-instr-generate"]),
plf0ff6c092019-05-14 05:22:12 -0700644 ],
645 ),
646 ],
647 requires = [feature_set(features = ["coverage"])],
648 provides = ["profile"],
649 )
650
651 strip_debug_symbols_feature = feature(
652 name = "strip_debug_symbols",
653 flag_sets = [
654 flag_set(
rosica1112b552019-07-05 06:35:15 -0700655 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700656 flag_groups = [
657 flag_group(
658 flags = ["-Wl,-S"],
659 expand_if_available = "strip_debug_symbols",
660 ),
661 ],
662 ),
663 ],
664 )
665
666 build_interface_libraries_feature = feature(
667 name = "build_interface_libraries",
668 flag_sets = [
669 flag_set(
670 actions = [
671 ACTION_NAMES.cpp_link_dynamic_library,
672 ACTION_NAMES.cpp_link_nodeps_dynamic_library,
rosica1112b552019-07-05 06:35:15 -0700673 ACTION_NAMES.lto_index_for_dynamic_library,
674 ACTION_NAMES.lto_index_for_nodeps_dynamic_library,
plf0ff6c092019-05-14 05:22:12 -0700675 ],
676 flag_groups = [
677 flag_group(
678 flags = [
679 "%{generate_interface_library}",
680 "%{interface_library_builder_path}",
681 "%{interface_library_input_path}",
682 "%{interface_library_output_path}",
683 ],
684 expand_if_available = "generate_interface_library",
685 ),
686 ],
687 with_features = [
688 with_feature_set(
689 features = ["supports_interface_shared_libraries"],
690 ),
691 ],
692 ),
693 ],
694 )
695
696 libraries_to_link_feature = feature(
697 name = "libraries_to_link",
698 flag_sets = [
699 flag_set(
rosica1112b552019-07-05 06:35:15 -0700700 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700701 flag_groups = [
702 flag_group(
703 iterate_over = "libraries_to_link",
704 flag_groups = [
705 flag_group(
706 flags = ["-Wl,--start-lib"],
707 expand_if_equal = variable_with_value(
708 name = "libraries_to_link.type",
709 value = "object_file_group",
710 ),
711 ),
712 flag_group(
713 flags = ["-Wl,-whole-archive"],
714 expand_if_true =
715 "libraries_to_link.is_whole_archive",
716 ),
717 flag_group(
718 flags = ["%{libraries_to_link.object_files}"],
719 iterate_over = "libraries_to_link.object_files",
720 expand_if_equal = variable_with_value(
721 name = "libraries_to_link.type",
722 value = "object_file_group",
723 ),
724 ),
725 flag_group(
726 flags = ["%{libraries_to_link.name}"],
727 expand_if_equal = variable_with_value(
728 name = "libraries_to_link.type",
729 value = "object_file",
730 ),
731 ),
732 flag_group(
733 flags = ["%{libraries_to_link.name}"],
734 expand_if_equal = variable_with_value(
735 name = "libraries_to_link.type",
736 value = "interface_library",
737 ),
738 ),
739 flag_group(
740 flags = ["%{libraries_to_link.name}"],
741 expand_if_equal = variable_with_value(
742 name = "libraries_to_link.type",
743 value = "static_library",
744 ),
745 ),
746 flag_group(
747 flags = ["-l%{libraries_to_link.name}"],
748 expand_if_equal = variable_with_value(
749 name = "libraries_to_link.type",
750 value = "dynamic_library",
751 ),
752 ),
753 flag_group(
754 flags = ["-l:%{libraries_to_link.name}"],
755 expand_if_equal = variable_with_value(
756 name = "libraries_to_link.type",
757 value = "versioned_dynamic_library",
758 ),
759 ),
760 flag_group(
761 flags = ["-Wl,-no-whole-archive"],
762 expand_if_true = "libraries_to_link.is_whole_archive",
763 ),
764 flag_group(
765 flags = ["-Wl,--end-lib"],
766 expand_if_equal = variable_with_value(
767 name = "libraries_to_link.type",
768 value = "object_file_group",
769 ),
770 ),
771 ],
772 expand_if_available = "libraries_to_link",
773 ),
774 flag_group(
775 flags = ["-Wl,@%{thinlto_param_file}"],
776 expand_if_true = "thinlto_param_file",
777 ),
778 ],
779 ),
780 ],
781 )
782
783 user_link_flags_feature = feature(
784 name = "user_link_flags",
785 flag_sets = [
786 flag_set(
rosica1112b552019-07-05 06:35:15 -0700787 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700788 flag_groups = [
789 flag_group(
790 flags = ["%{user_link_flags}"],
791 iterate_over = "user_link_flags",
792 expand_if_available = "user_link_flags",
793 ),
Marcel Hlopkoab9c1f52019-06-19 00:45:58 -0700794 ] + ([flag_group(flags = ctx.attr.link_libs)] if ctx.attr.link_libs else []),
plf0ff6c092019-05-14 05:22:12 -0700795 ),
796 ],
797 )
798
799 fdo_prefetch_hints_feature = feature(
800 name = "fdo_prefetch_hints",
801 flag_sets = [
802 flag_set(
803 actions = [
804 ACTION_NAMES.c_compile,
805 ACTION_NAMES.cpp_compile,
806 ACTION_NAMES.lto_backend,
807 ],
808 flag_groups = [
809 flag_group(
810 flags = [
811 "-Xclang-only=-mllvm",
812 "-Xclang-only=-prefetch-hints-file=%{fdo_prefetch_hints_path}",
813 ],
814 expand_if_available = "fdo_prefetch_hints_path",
815 ),
816 ],
817 ),
818 ],
819 )
820
821 linkstamps_feature = feature(
822 name = "linkstamps",
823 flag_sets = [
824 flag_set(
rosica1112b552019-07-05 06:35:15 -0700825 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700826 flag_groups = [
827 flag_group(
828 flags = ["%{linkstamp_paths}"],
829 iterate_over = "linkstamp_paths",
830 expand_if_available = "linkstamp_paths",
831 ),
832 ],
833 ),
834 ],
835 )
836
837 gcc_coverage_map_format_feature = feature(
838 name = "gcc_coverage_map_format",
839 flag_sets = [
840 flag_set(
841 actions = [
842 ACTION_NAMES.preprocess_assemble,
843 ACTION_NAMES.c_compile,
844 ACTION_NAMES.cpp_compile,
845 ACTION_NAMES.cpp_module_compile,
846 ACTION_NAMES.objc_compile,
847 ACTION_NAMES.objcpp_compile,
848 "objc-executable",
849 "objc++-executable",
850 ],
851 flag_groups = [
852 flag_group(
853 flags = ["-fprofile-arcs", "-ftest-coverage"],
854 expand_if_available = "gcov_gcno_file",
855 ),
856 ],
857 ),
858 flag_set(
rosica1112b552019-07-05 06:35:15 -0700859 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700860 flag_groups = [flag_group(flags = ["--coverage"])],
861 ),
862 ],
863 requires = [feature_set(features = ["coverage"])],
864 provides = ["profile"],
865 )
866
867 archiver_flags_feature = feature(
868 name = "archiver_flags",
869 flag_sets = [
870 flag_set(
871 actions = [ACTION_NAMES.cpp_link_static_library],
872 flag_groups = [
873 flag_group(flags = ["rcsD"]),
874 flag_group(
875 flags = ["%{output_execpath}"],
876 expand_if_available = "output_execpath",
877 ),
878 ],
879 ),
880 flag_set(
881 actions = [ACTION_NAMES.cpp_link_static_library],
882 flag_groups = [
883 flag_group(
884 iterate_over = "libraries_to_link",
885 flag_groups = [
886 flag_group(
887 flags = ["%{libraries_to_link.name}"],
888 expand_if_equal = variable_with_value(
889 name = "libraries_to_link.type",
890 value = "object_file",
891 ),
892 ),
893 flag_group(
894 flags = ["%{libraries_to_link.object_files}"],
895 iterate_over = "libraries_to_link.object_files",
896 expand_if_equal = variable_with_value(
897 name = "libraries_to_link.type",
898 value = "object_file_group",
899 ),
900 ),
901 ],
902 expand_if_available = "libraries_to_link",
903 ),
904 ],
905 ),
906 ],
907 )
908
909 force_pic_flags_feature = feature(
910 name = "force_pic_flags",
911 flag_sets = [
912 flag_set(
rosica1112b552019-07-05 06:35:15 -0700913 actions = [
914 ACTION_NAMES.cpp_link_executable,
915 ACTION_NAMES.lto_index_for_executable,
916 ],
plf0ff6c092019-05-14 05:22:12 -0700917 flag_groups = [
918 flag_group(
919 flags = ["-pie"],
920 expand_if_available = "force_pic",
921 ),
922 ],
923 ),
924 ],
925 )
926
927 dependency_file_feature = feature(
928 name = "dependency_file",
929 enabled = True,
930 flag_sets = [
931 flag_set(
932 actions = [
933 ACTION_NAMES.assemble,
934 ACTION_NAMES.preprocess_assemble,
935 ACTION_NAMES.c_compile,
936 ACTION_NAMES.cpp_compile,
937 ACTION_NAMES.cpp_module_compile,
938 ACTION_NAMES.objc_compile,
939 ACTION_NAMES.objcpp_compile,
940 ACTION_NAMES.cpp_header_parsing,
941 ACTION_NAMES.clif_match,
942 ],
943 flag_groups = [
944 flag_group(
945 flags = ["-MD", "-MF", "%{dependency_file}"],
946 expand_if_available = "dependency_file",
947 ),
948 ],
949 ),
950 ],
951 )
952
rosica1112b552019-07-05 06:35:15 -0700953 dynamic_library_linker_tool_path = tool_paths
plf0ff6c092019-05-14 05:22:12 -0700954 dynamic_library_linker_tool_feature = feature(
955 name = "dynamic_library_linker_tool",
956 flag_sets = [
957 flag_set(
958 actions = [
959 ACTION_NAMES.cpp_link_dynamic_library,
960 ACTION_NAMES.cpp_link_nodeps_dynamic_library,
rosica1112b552019-07-05 06:35:15 -0700961 ACTION_NAMES.lto_index_for_dynamic_library,
962 ACTION_NAMES.lto_index_for_nodeps_dynamic_library,
plf0ff6c092019-05-14 05:22:12 -0700963 ],
964 flag_groups = [
965 flag_group(
966 flags = [" + cppLinkDynamicLibraryToolPath + "],
967 expand_if_available = "generate_interface_library",
968 ),
969 ],
970 with_features = [
971 with_feature_set(
972 features = ["supports_interface_shared_libraries"],
973 ),
974 ],
975 ),
976 ],
977 )
978
979 output_execpath_flags_feature = feature(
980 name = "output_execpath_flags",
981 flag_sets = [
982 flag_set(
rosica1112b552019-07-05 06:35:15 -0700983 actions = all_link_actions + lto_index_actions,
plf0ff6c092019-05-14 05:22:12 -0700984 flag_groups = [
985 flag_group(
986 flags = ["-o", "%{output_execpath}"],
987 expand_if_available = "output_execpath",
988 ),
989 ],
990 ),
991 ],
992 )
993
rosica96500b72019-05-21 03:25:53 -0700994 # Note that we also set --coverage for c++-link-nodeps-dynamic-library. The
995 # generated code contains references to gcov symbols, and the dynamic linker
996 # can't resolve them unless the library is linked against gcov.
997 coverage_feature = feature(
998 name = "coverage",
999 provides = ["profile"],
1000 flag_sets = [
1001 flag_set(
1002 actions = [
1003 ACTION_NAMES.preprocess_assemble,
1004 ACTION_NAMES.c_compile,
1005 ACTION_NAMES.cpp_compile,
1006 ACTION_NAMES.cpp_header_parsing,
1007 ACTION_NAMES.cpp_module_compile,
1008 ],
1009 flag_groups = ([
1010 flag_group(flags = ctx.attr.coverage_compile_flags),
1011 ] if ctx.attr.coverage_compile_flags else []),
1012 ),
1013 flag_set(
rosica1112b552019-07-05 06:35:15 -07001014 actions = all_link_actions + lto_index_actions,
rosica96500b72019-05-21 03:25:53 -07001015 flag_groups = ([
1016 flag_group(flags = ctx.attr.coverage_link_flags),
1017 ] if ctx.attr.coverage_link_flags else []),
1018 ),
1019 ],
1020 )
plf0ff6c092019-05-14 05:22:12 -07001021
rosicae2a9e4a2019-08-27 03:33:31 -07001022 thinlto_feature = feature(
1023 name = "thin_lto",
1024 flag_sets = [
1025 flag_set(
1026 actions = [
1027 ACTION_NAMES.c_compile,
1028 ACTION_NAMES.cpp_compile,
1029 ] + all_link_actions + lto_index_actions,
1030 flag_groups = [
1031 flag_group(flags = ["-flto=thin"]),
1032 flag_group(
1033 expand_if_available = "lto_indexing_bitcode_file",
1034 flags = [
1035 "-Xclang",
1036 "-fthin-link-bitcode=%{lto_indexing_bitcode_file}",
1037 ],
1038 ),
1039 ],
1040 ),
1041 flag_set(
1042 actions = [ACTION_NAMES.linkstamp_compile],
1043 flag_groups = [flag_group(flags = ["-DBUILD_LTO_TYPE=thin"])],
1044 ),
1045 flag_set(
1046 actions = lto_index_actions,
1047 flag_groups = [
1048 flag_group(flags = [
1049 "-flto=thin",
1050 "-Wl,-plugin-opt,thinlto-index-only%{thinlto_optional_params_file}",
1051 "-Wl,-plugin-opt,thinlto-emit-imports-files",
1052 "-Wl,-plugin-opt,thinlto-prefix-replace=%{thinlto_prefix_replace}",
1053 ]),
1054 flag_group(
1055 expand_if_available = "thinlto_object_suffix_replace",
1056 flags = [
1057 "-Wl,-plugin-opt,thinlto-object-suffix-replace=%{thinlto_object_suffix_replace}",
1058 ],
1059 ),
1060 flag_group(
1061 expand_if_available = "thinlto_merged_object_file",
1062 flags = [
1063 "-Wl,-plugin-opt,obj-path=%{thinlto_merged_object_file}",
1064 ],
1065 ),
1066 ],
1067 ),
1068 flag_set(
1069 actions = [ACTION_NAMES.lto_backend],
1070 flag_groups = [
1071 flag_group(flags = [
1072 "-c",
1073 "-fthinlto-index=%{thinlto_index}",
1074 "-o",
1075 "%{thinlto_output_object_file}",
1076 "-x",
1077 "ir",
1078 "%{thinlto_input_bitcode_file}",
1079 ]),
1080 ],
1081 ),
1082 ],
1083 )
1084
rosica96500b72019-05-21 03:25:53 -07001085 is_linux = ctx.attr.target_libc != "macosx"
1086
1087 # TODO(#8303): Mac crosstool should also declare every feature.
plf0ff6c092019-05-14 05:22:12 -07001088 if is_linux:
1089 features = [
1090 dependency_file_feature,
1091 random_seed_feature,
1092 pic_feature,
1093 per_object_debug_info_feature,
1094 preprocessor_defines_feature,
1095 includes_feature,
1096 include_paths_feature,
1097 fdo_instrument_feature,
1098 cs_fdo_instrument_feature,
1099 cs_fdo_optimize_feature,
rosicae2a9e4a2019-08-27 03:33:31 -07001100 thinlto_feature,
plf0ff6c092019-05-14 05:22:12 -07001101 fdo_prefetch_hints_feature,
1102 autofdo_feature,
1103 build_interface_libraries_feature,
1104 dynamic_library_linker_tool_feature,
1105 symbol_counts_feature,
1106 shared_flag_feature,
1107 linkstamps_feature,
1108 output_execpath_flags_feature,
1109 runtime_library_search_directories_feature,
1110 library_search_directories_feature,
1111 archiver_flags_feature,
plf0ff6c092019-05-14 05:22:12 -07001112 force_pic_flags_feature,
plf0ff6c092019-05-14 05:22:12 -07001113 fission_support_feature,
rosica96500b72019-05-21 03:25:53 -07001114 strip_debug_symbols_feature,
1115 coverage_feature,
plf0ff6c092019-05-14 05:22:12 -07001116 supports_pic_feature,
rosica96500b72019-05-21 03:25:53 -07001117 ] + (
1118 [
1119 supports_start_end_lib_feature,
1120 ] if ctx.attr.supports_start_end_lib else []
1121 ) + [
plf0ff6c092019-05-14 05:22:12 -07001122 default_compile_flags_feature,
1123 default_link_flags_feature,
1124 libraries_to_link_feature,
plf21cf0542019-05-20 09:01:24 -07001125 user_link_flags_feature,
1126 static_libgcc_feature,
plf0ff6c092019-05-14 05:22:12 -07001127 fdo_optimize_feature,
1128 supports_dynamic_linker_feature,
1129 dbg_feature,
1130 opt_feature,
1131 user_compile_flags_feature,
1132 sysroot_feature,
1133 unfiltered_compile_flags_feature,
rosica96500b72019-05-21 03:25:53 -07001134 ]
plf0ff6c092019-05-14 05:22:12 -07001135 else:
rosicabeaba922019-05-20 02:36:26 -07001136 features = [
plf0ff6c092019-05-14 05:22:12 -07001137 supports_pic_feature,
rosica96500b72019-05-21 03:25:53 -07001138 ] + (
1139 [
1140 supports_start_end_lib_feature,
1141 ] if ctx.attr.supports_start_end_lib else []
1142 ) + [
1143 coverage_feature,
plf0ff6c092019-05-14 05:22:12 -07001144 default_compile_flags_feature,
1145 default_link_flags_feature,
1146 fdo_optimize_feature,
1147 supports_dynamic_linker_feature,
1148 dbg_feature,
1149 opt_feature,
1150 user_compile_flags_feature,
1151 sysroot_feature,
1152 unfiltered_compile_flags_feature,
1153 ]
rosica71bc38f2019-02-04 02:39:30 -08001154
rosica71bc38f2019-02-04 02:39:30 -08001155 return cc_common.create_cc_toolchain_config_info(
1156 ctx = ctx,
1157 features = features,
1158 action_configs = action_configs,
rosica96500b72019-05-21 03:25:53 -07001159 cxx_builtin_include_directories = ctx.attr.cxx_builtin_include_directories,
1160 toolchain_identifier = ctx.attr.toolchain_identifier,
1161 host_system_name = ctx.attr.host_system_name,
1162 target_system_name = ctx.attr.target_system_name,
1163 target_cpu = ctx.attr.cpu,
1164 target_libc = ctx.attr.target_libc,
1165 compiler = ctx.attr.compiler,
1166 abi_version = ctx.attr.abi_version,
1167 abi_libc_version = ctx.attr.abi_libc_version,
rosica71bc38f2019-02-04 02:39:30 -08001168 tool_paths = tool_paths,
rosica71bc38f2019-02-04 02:39:30 -08001169 )
1170
1171cc_toolchain_config = rule(
1172 implementation = _impl,
1173 attrs = {
rosica96500b72019-05-21 03:25:53 -07001174 "cpu": attr.string(mandatory = True),
1175 "compiler": attr.string(mandatory = True),
1176 "toolchain_identifier": attr.string(mandatory = True),
1177 "host_system_name": attr.string(mandatory = True),
1178 "target_system_name": attr.string(mandatory = True),
1179 "target_libc": attr.string(mandatory = True),
1180 "abi_version": attr.string(mandatory = True),
1181 "abi_libc_version": attr.string(mandatory = True),
1182 "cxx_builtin_include_directories": attr.string_list(),
1183 "tool_paths": attr.string_dict(),
1184 "compile_flags": attr.string_list(),
1185 "dbg_compile_flags": attr.string_list(),
1186 "opt_compile_flags": attr.string_list(),
1187 "cxx_flags": attr.string_list(),
1188 "link_flags": attr.string_list(),
Marcel Hlopkoab9c1f52019-06-19 00:45:58 -07001189 "link_libs": attr.string_list(),
rosica96500b72019-05-21 03:25:53 -07001190 "opt_link_flags": attr.string_list(),
1191 "unfiltered_compile_flags": attr.string_list(),
1192 "coverage_compile_flags": attr.string_list(),
1193 "coverage_link_flags": attr.string_list(),
1194 "supports_start_end_lib": attr.bool(),
rosica71bc38f2019-02-04 02:39:30 -08001195 },
1196 provides = [CcToolchainConfigInfo],
1197)