cc_toolchain_linking.bzl 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287
  1. # Part of the Carbon Language project, under the Apache License v2.0 with LLVM
  2. # Exceptions. See /LICENSE for license information.
  3. # SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  4. """Definitions of linking related features used in a `cc_toolchain_config`."""
  5. load("@rules_cc//cc:action_names.bzl", "ACTION_NAMES")
  6. load(
  7. "@rules_cc//cc:cc_toolchain_config_lib.bzl",
  8. "feature",
  9. "flag_group",
  10. "flag_set",
  11. "variable_with_value",
  12. )
  13. load(
  14. ":cc_toolchain_actions.bzl",
  15. "all_link_actions",
  16. )
  17. default_link_libraries_feature = feature(
  18. name = "default_link_libraries",
  19. enabled = True,
  20. flag_sets = [flag_set(
  21. actions = all_link_actions,
  22. flag_groups = [
  23. flag_group(
  24. expand_if_available = "linkstamp_paths",
  25. flags = ["%{linkstamp_paths}"],
  26. iterate_over = "linkstamp_paths",
  27. ),
  28. flag_group(
  29. expand_if_available = "libraries_to_link",
  30. flag_groups = [
  31. flag_group(
  32. expand_if_equal = variable_with_value(
  33. name = "libraries_to_link.type",
  34. value = "object_file_group",
  35. ),
  36. flags = ["-Wl,--start-lib"],
  37. ),
  38. flag_group(
  39. expand_if_true = "libraries_to_link.is_whole_archive",
  40. flags = ["-Wl,-whole-archive"],
  41. ),
  42. flag_group(
  43. expand_if_equal = variable_with_value(
  44. name = "libraries_to_link.type",
  45. value = "object_file_group",
  46. ),
  47. flags = ["%{libraries_to_link.object_files}"],
  48. iterate_over = "libraries_to_link.object_files",
  49. ),
  50. flag_group(
  51. expand_if_equal = variable_with_value(
  52. name = "libraries_to_link.type",
  53. value = "object_file",
  54. ),
  55. flags = ["%{libraries_to_link.name}"],
  56. ),
  57. flag_group(
  58. expand_if_equal = variable_with_value(
  59. name = "libraries_to_link.type",
  60. value = "interface_library",
  61. ),
  62. flags = ["%{libraries_to_link.name}"],
  63. ),
  64. flag_group(
  65. expand_if_equal = variable_with_value(
  66. name = "libraries_to_link.type",
  67. value = "static_library",
  68. ),
  69. flags = ["%{libraries_to_link.name}"],
  70. ),
  71. flag_group(
  72. expand_if_equal = variable_with_value(
  73. name = "libraries_to_link.type",
  74. value = "dynamic_library",
  75. ),
  76. flags = ["-l%{libraries_to_link.name}"],
  77. ),
  78. flag_group(
  79. expand_if_equal = variable_with_value(
  80. name = "libraries_to_link.type",
  81. value = "versioned_dynamic_library",
  82. ),
  83. flags = ["-l:%{libraries_to_link.name}"],
  84. ),
  85. flag_group(
  86. expand_if_true = "libraries_to_link.is_whole_archive",
  87. flags = ["-Wl,-no-whole-archive"],
  88. ),
  89. flag_group(
  90. expand_if_equal = variable_with_value(
  91. name = "libraries_to_link.type",
  92. value = "object_file_group",
  93. ),
  94. flags = ["-Wl,--end-lib"],
  95. ),
  96. ],
  97. iterate_over = "libraries_to_link",
  98. ),
  99. # Note that the params file comes at the end, after the
  100. # libraries to link above.
  101. flag_group(
  102. expand_if_available = "linker_param_file",
  103. flags = ["@%{linker_param_file}"],
  104. ),
  105. ],
  106. )],
  107. )
  108. macos_link_libraries_feature = feature(
  109. name = "macos_link_libraries",
  110. enabled = True,
  111. flag_sets = [flag_set(
  112. actions = all_link_actions,
  113. flag_groups = [
  114. flag_group(
  115. expand_if_available = "linkstamp_paths",
  116. flags = ["%{linkstamp_paths}"],
  117. iterate_over = "linkstamp_paths",
  118. ),
  119. flag_group(
  120. expand_if_available = "libraries_to_link",
  121. flag_groups = [
  122. flag_group(
  123. expand_if_equal = variable_with_value(
  124. name = "libraries_to_link.type",
  125. value = "object_file_group",
  126. ),
  127. flags = ["-Wl,--start-lib"],
  128. ),
  129. flag_group(
  130. expand_if_equal = variable_with_value(
  131. name = "libraries_to_link.type",
  132. value = "object_file_group",
  133. ),
  134. flag_groups = [
  135. flag_group(
  136. expand_if_false = "libraries_to_link.is_whole_archive",
  137. flags = ["%{libraries_to_link.object_files}"],
  138. ),
  139. flag_group(
  140. expand_if_true = "libraries_to_link.is_whole_archive",
  141. flags = ["-Wl,-force_load,%{libraries_to_link.object_files}"],
  142. ),
  143. ],
  144. iterate_over = "libraries_to_link.object_files",
  145. ),
  146. flag_group(
  147. expand_if_equal = variable_with_value(
  148. name = "libraries_to_link.type",
  149. value = "object_file",
  150. ),
  151. flag_groups = [
  152. flag_group(
  153. expand_if_false = "libraries_to_link.is_whole_archive",
  154. flags = ["%{libraries_to_link.name}"],
  155. ),
  156. flag_group(
  157. expand_if_true = "libraries_to_link.is_whole_archive",
  158. flags = ["-Wl,-force_load,%{libraries_to_link.name}"],
  159. ),
  160. ],
  161. ),
  162. flag_group(
  163. expand_if_equal = variable_with_value(
  164. name = "libraries_to_link.type",
  165. value = "interface_library",
  166. ),
  167. flag_groups = [
  168. flag_group(
  169. expand_if_false = "libraries_to_link.is_whole_archive",
  170. flags = ["%{libraries_to_link.name}"],
  171. ),
  172. flag_group(
  173. expand_if_true = "libraries_to_link.is_whole_archive",
  174. flags = ["-Wl,-force_load,%{libraries_to_link.name}"],
  175. ),
  176. ],
  177. ),
  178. flag_group(
  179. expand_if_equal = variable_with_value(
  180. name = "libraries_to_link.type",
  181. value = "static_library",
  182. ),
  183. flag_groups = [
  184. flag_group(
  185. expand_if_false = "libraries_to_link.is_whole_archive",
  186. flags = ["%{libraries_to_link.name}"],
  187. ),
  188. flag_group(
  189. expand_if_true = "libraries_to_link.is_whole_archive",
  190. flags = ["-Wl,-force_load,%{libraries_to_link.name}"],
  191. ),
  192. ],
  193. ),
  194. flag_group(
  195. expand_if_equal = variable_with_value(
  196. name = "libraries_to_link.type",
  197. value = "dynamic_library",
  198. ),
  199. flags = ["-l%{libraries_to_link.name}"],
  200. ),
  201. flag_group(
  202. expand_if_equal = variable_with_value(
  203. name = "libraries_to_link.type",
  204. value = "versioned_dynamic_library",
  205. ),
  206. flags = ["-l:%{libraries_to_link.name}"],
  207. ),
  208. flag_group(
  209. expand_if_true = "libraries_to_link.is_whole_archive",
  210. flag_groups = [
  211. flag_group(
  212. expand_if_false = "macos_flags",
  213. flags = ["-Wl,-no-whole-archive"],
  214. ),
  215. ],
  216. ),
  217. flag_group(
  218. expand_if_equal = variable_with_value(
  219. name = "libraries_to_link.type",
  220. value = "object_file_group",
  221. ),
  222. flags = ["-Wl,--end-lib"],
  223. ),
  224. ],
  225. iterate_over = "libraries_to_link",
  226. ),
  227. # Note that the params file comes at the end, after the
  228. # libraries to link above.
  229. flag_group(
  230. expand_if_available = "linker_param_file",
  231. flags = ["@%{linker_param_file}"],
  232. ),
  233. ],
  234. )],
  235. )
  236. # Archive actions have an entirely independent set of flags and don't
  237. # interact with either compiler or link actions.
  238. default_archiver_flags_feature = feature(
  239. name = "default_archiver_flags",
  240. enabled = True,
  241. flag_sets = [flag_set(
  242. actions = [ACTION_NAMES.cpp_link_static_library],
  243. flag_groups = [
  244. flag_group(flags = ["rcsD"]),
  245. flag_group(
  246. expand_if_available = "output_execpath",
  247. flags = ["%{output_execpath}"],
  248. ),
  249. flag_group(
  250. expand_if_available = "libraries_to_link",
  251. flag_groups = [
  252. flag_group(
  253. expand_if_equal = variable_with_value(
  254. name = "libraries_to_link.type",
  255. value = "object_file",
  256. ),
  257. flags = ["%{libraries_to_link.name}"],
  258. ),
  259. flag_group(
  260. expand_if_equal = variable_with_value(
  261. name = "libraries_to_link.type",
  262. value = "object_file_group",
  263. ),
  264. flags = ["%{libraries_to_link.object_files}"],
  265. iterate_over = "libraries_to_link.object_files",
  266. ),
  267. ],
  268. iterate_over = "libraries_to_link",
  269. ),
  270. flag_group(
  271. expand_if_available = "linker_param_file",
  272. flags = ["@%{linker_param_file}"],
  273. ),
  274. ],
  275. )],
  276. )
  277. # Note that the order of features is significant in this list and determines the
  278. # relative order of flags from the features listed.
  279. linking_features = [
  280. default_archiver_flags_feature,
  281. ]