cc_toolchain_linking.bzl 13 KB

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