cc_toolchain_linking.bzl 13 KB

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