blob: b0800259eba38ea232b4d58c5b56a41d8158e6d2 [file] [log] [blame]
Googler6c3de122022-03-28 11:40:41 +00001"""Generates Rust bindings from C++ headers."""
2
3load(
4 "//rs_bindings_from_cc/bazel_support:deps_for_bindings.bzl",
5 "deps_for_bindings",
6)
7load(
8 "//rs_bindings_from_cc/bazel_support:with_cc_toolchain_flags.bzl",
9 "with_cc_toolchain_flags",
10)
11load(
12 "//rs_bindings_from_cc/bazel_support:rust_bindings_from_cc_binary.bzl",
13 "rust_bindings_from_cc_binary",
14)
15load(
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070016 "@rules_rust//rust:defs.bzl",
Googler6c3de122022-03-28 11:40:41 +000017 "rust_library",
18 "rust_test",
19)
20load(
21 "//rs_bindings_from_cc/bazel_support:toolchain_headers.bzl",
22 "bindings_for_toolchain_headers",
23)
24
25licenses(["notice"])
26
27with_cc_toolchain_flags(
28 name = "test_wrapper",
29 binary = ":rs_bindings_from_cc",
30 extra_args = [
31 "--rs_out=/tmp/rs_api.rs",
32 "--cc_out=/tmp/rs_api_impl.cc",
33 "--ir_out=/tmp/ir.json",
34 ],
35)
36
37rust_bindings_from_cc_binary(
38 name = "rs_bindings_from_cc",
39 binary = ":rs_bindings_from_cc_impl",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070040 visibility = ["//third_party/crubit:__subpackages__"],
Googler6c3de122022-03-28 11:40:41 +000041)
42
43deps_for_bindings(
44 name = "deps_for_bindings",
45 deps_for_generated_cc_file = [
46 "//rs_bindings_from_cc/support:rs_api_impl_support",
47 ],
48 deps_for_generated_rs_file = [
49 # Required for struct layout assertions added to the generated
50 # Rust code.
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070051 "@crates_io//memoffset/v0_6:memoffset_unstable_const",
Googler6c3de122022-03-28 11:40:41 +000052 "//rs_bindings_from_cc/support:ctor",
Devin Jeanpierre27450132022-04-11 13:52:01 -070053 "//rs_bindings_from_cc/support:forward_declare",
Devin Jeanpierreb368e682022-05-03 02:23:44 -070054 "//rs_bindings_from_cc/support:oops",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070055 "@crates_io//pin_project/v1:pin_project", # used by ctor macros
Googler6c3de122022-03-28 11:40:41 +000056 # Required for `Copy` trait assertions added to the generated Rust
57 # code.
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070058 "@crates_io//static_assertions/v1:static_assertions",
Googler6c3de122022-03-28 11:40:41 +000059 ],
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070060 visibility = ["//third_party/crubit:__subpackages__"],
Googler6c3de122022-03-28 11:40:41 +000061)
62
63cc_binary(
64 name = "rs_bindings_from_cc_impl",
65 srcs = ["rs_bindings_from_cc.cc"],
66 visibility = ["//visibility:public"],
67 deps = [
68 ":bazel_types",
Googler0611ea72022-05-04 07:03:07 -070069 ":cc_ir",
Googler6c3de122022-03-28 11:40:41 +000070 ":cmdline",
Googler6c3de122022-03-28 11:40:41 +000071 ":ir_from_cc",
72 ":src_code_gen",
Marco Poletti6669c692022-04-07 14:42:56 -070073 "//common:file_io",
Marco Polettic61bcc42022-04-08 12:54:30 -070074 "//common:status_macros",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070075 "@absl//container:flat_hash_map",
76 "@absl//flags:parse",
77 "@absl//status",
78 "@absl//status:statusor",
79 "@absl//strings",
Googler6c3de122022-03-28 11:40:41 +000080 "@llvm///llvm:Support",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070081 "@rust//support:rust_okay_here",
Googler6c3de122022-03-28 11:40:41 +000082 ],
83)
84
85cc_library(
86 name = "bazel_types",
87 hdrs = ["bazel_types.h"],
Marco Polettic61bcc42022-04-08 12:54:30 -070088 deps = ["//common:string_type"],
Googler6c3de122022-03-28 11:40:41 +000089)
90
91cc_library(
92 name = "cmdline",
93 srcs = ["cmdline.cc"],
94 hdrs = ["cmdline.h"],
95 deps = [
96 ":bazel_types",
Googler0611ea72022-05-04 07:03:07 -070097 ":cc_ir",
Marco Polettic61bcc42022-04-08 12:54:30 -070098 "//common:status_macros",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070099 "@absl//container:flat_hash_map",
100 "@absl//flags:flag",
101 "@absl//status:statusor",
102 "@absl//strings",
Googler6c3de122022-03-28 11:40:41 +0000103 "@llvm///llvm:Support",
104 ],
105)
106
107cc_test(
108 name = "cmdline_test",
109 srcs = ["cmdline_test.cc"],
110 deps = [
111 ":bazel_types",
112 ":cmdline",
113 "//testing/base/public:gunit_main",
114 ],
115)
116
117cc_library(
Michael Forsterb3503e02022-04-25 00:24:14 -0700118 name = "decl_importer",
119 hdrs = ["decl_importer.h"],
120 visibility = ["//third_party/crubit:__subpackages__"],
121 deps = [
Googler0611ea72022-05-04 07:03:07 -0700122 "cc_ir",
Michael Forsterb3503e02022-04-25 00:24:14 -0700123 ":bazel_types",
124 "//lifetime_annotations",
125 "@absl//container:flat_hash_map",
126 "@absl//status:statusor",
127 ],
128)
129
130cc_library(
Googler6c3de122022-03-28 11:40:41 +0000131 name = "frontend_action",
132 srcs = ["frontend_action.cc"],
133 hdrs = ["frontend_action.h"],
134 deps = [
135 ":ast_consumer",
136 ":importer",
137 "//lifetime_annotations",
138 "@llvm///clang:ast",
139 "@llvm///clang:frontend",
140 ],
141)
142
143cc_library(
144 name = "ast_consumer",
145 srcs = ["ast_consumer.cc"],
146 hdrs = ["ast_consumer.h"],
147 deps = [
148 ":importer",
Marco Polettic61bcc42022-04-08 12:54:30 -0700149 "//common:check",
Googler6c3de122022-03-28 11:40:41 +0000150 "@llvm///clang:ast",
151 "@llvm///clang:frontend",
152 ],
153)
154
155cc_library(
156 name = "importer",
157 srcs = ["importer.cc"],
158 hdrs = ["importer.h"],
159 deps = [
160 ":ast_convert",
161 ":bazel_types",
Googler0611ea72022-05-04 07:03:07 -0700162 ":cc_ir",
Michael Forsterb3503e02022-04-25 00:24:14 -0700163 ":decl_importer",
Marco Polettic61bcc42022-04-08 12:54:30 -0700164 "//common:check",
165 "//common:status_macros",
Googler6c3de122022-03-28 11:40:41 +0000166 "//lifetime_annotations:type_lifetimes",
Michael Forsterb3503e02022-04-25 00:24:14 -0700167 "//rs_bindings_from_cc/importers:class_template",
Michael Forsterc0bc9262022-04-25 00:30:26 -0700168 "//rs_bindings_from_cc/importers:cxx_record",
Michael Forster4fa849d2022-04-25 00:32:59 -0700169 "//rs_bindings_from_cc/importers:enum",
Michael Forster7e4244a2022-04-25 00:39:01 -0700170 "//rs_bindings_from_cc/importers:function",
Michael Forster350d5312022-04-25 00:36:31 -0700171 "//rs_bindings_from_cc/importers:function_template",
Michael Forster284fb5a2022-04-25 00:41:14 -0700172 "//rs_bindings_from_cc/importers:namespace",
Michael Forsterc60df1e2022-04-25 00:55:44 -0700173 "//rs_bindings_from_cc/importers:typedef_name",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700174 "@absl//container:flat_hash_map",
175 "@absl//container:flat_hash_set",
176 "@absl//status",
177 "@absl//status:statusor",
178 "@absl//strings",
179 "@absl//strings:cord",
Googler6c3de122022-03-28 11:40:41 +0000180 "@llvm///clang:ast",
181 "@llvm///clang:basic",
182 "@llvm///clang:sema",
183 "@llvm///llvm:Support",
184 ],
185)
186
187cc_test(
188 name = "importer_test",
189 srcs = ["importer_test.cc"],
190 deps = [
191 ":bazel_types",
Googler0611ea72022-05-04 07:03:07 -0700192 ":cc_ir",
Googler6c3de122022-03-28 11:40:41 +0000193 ":ir_from_cc",
194 "//testing/base/public:gunit_main",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700195 "@absl//status",
196 "@absl//status:statusor",
197 "@absl//strings",
198 "@absl//types:span",
Googler6c3de122022-03-28 11:40:41 +0000199 "@llvm///clang:ast",
200 ],
201)
202
203cc_library(
Googler0611ea72022-05-04 07:03:07 -0700204 name = "cc_ir",
Googler6c3de122022-03-28 11:40:41 +0000205 srcs = ["ir.cc"],
206 hdrs = ["ir.h"],
Googler6c3de122022-03-28 11:40:41 +0000207 deps = [
208 ":bazel_types",
Marco Polettic61bcc42022-04-08 12:54:30 -0700209 "//common:check",
210 "//common:strong_int",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700211 "@absl//strings",
Michael Forsterc0bc9262022-04-25 00:30:26 -0700212 "@llvm///clang:ast",
Googler6c3de122022-03-28 11:40:41 +0000213 "@llvm///llvm:Support",
214 ],
215)
216
217rust_library(
Googler0611ea72022-05-04 07:03:07 -0700218 name = "ir",
Googler6c3de122022-03-28 11:40:41 +0000219 srcs = ["ir.rs"],
Googler6c3de122022-03-28 11:40:41 +0000220 deps = [
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700221 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700222 "@crates_io//itertools/v0_10:itertools",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700223 "@crates_io//proc_macro2/v1:proc_macro2",
224 "@crates_io//quote/v1:quote",
225 "@crates_io//serde/v1:serde",
226 "@crates_io//serde_json/v1:serde_json",
Googler6c3de122022-03-28 11:40:41 +0000227 ],
228)
229
230rust_test(
231 name = "rs_ir_test",
Googler0611ea72022-05-04 07:03:07 -0700232 crate = ":ir",
Googler6c3de122022-03-28 11:40:41 +0000233)
234
235rust_library(
236 name = "ir_testing",
237 testonly = 1,
238 srcs = ["ir_testing.rs"],
239 deps = [
Googler0611ea72022-05-04 07:03:07 -0700240 ":ir",
Googler6c3de122022-03-28 11:40:41 +0000241 ":json_from_cc",
Googler0611ea72022-05-04 07:03:07 -0700242 "//common:ffi_types",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700243 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700244 "@crates_io//itertools/v0_10:itertools",
Googler6c3de122022-03-28 11:40:41 +0000245 ],
246)
247
248cc_library(
249 name = "ir_from_cc",
250 srcs = ["ir_from_cc.cc"],
251 hdrs = ["ir_from_cc.h"],
252 deps = [
253 ":bazel_types",
Googler0611ea72022-05-04 07:03:07 -0700254 ":cc_ir",
Googler6c3de122022-03-28 11:40:41 +0000255 ":frontend_action",
256 ":importer",
Marco Polettic61bcc42022-04-08 12:54:30 -0700257 "//common:check",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700258 "@absl//container:flat_hash_map",
259 "@absl//status",
260 "@absl//status:statusor",
261 "@absl//strings",
262 "@absl//types:span",
Googler6c3de122022-03-28 11:40:41 +0000263 "@llvm///clang:basic",
264 "@llvm///clang:frontend",
265 "@llvm///clang:tooling",
266 ],
267)
268
269cc_library(
270 name = "json_from_cc",
271 srcs = ["json_from_cc.cc"],
272 deps = [
273 ":bazel_types",
Googler0611ea72022-05-04 07:03:07 -0700274 ":cc_ir",
Googler6c3de122022-03-28 11:40:41 +0000275 ":ir_from_cc",
Googler0611ea72022-05-04 07:03:07 -0700276 "//common:cc_ffi_types",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700277 "@absl//status:statusor",
Googler6c3de122022-03-28 11:40:41 +0000278 "@llvm///llvm:Support",
279 ],
280)
281
282rust_test(
283 name = "ir_from_cc_test",
284 srcs = ["ir_from_cc_test.rs"],
285 deps = [
Googler0611ea72022-05-04 07:03:07 -0700286 ":ir",
Googler6c3de122022-03-28 11:40:41 +0000287 ":ir_testing",
Googler6c3de122022-03-28 11:40:41 +0000288 ":token_stream_matchers",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700289 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700290 "@crates_io//itertools/v0_10:itertools",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700291 "@crates_io//quote/v1:quote",
292 "@rust//support:rust_okay_here",
Googler6c3de122022-03-28 11:40:41 +0000293 ],
294)
295
296cc_library(
297 name = "src_code_gen",
298 srcs = ["src_code_gen.cc"],
299 hdrs = ["src_code_gen.h"],
300 deps = [
Googler0611ea72022-05-04 07:03:07 -0700301 ":cc_ir",
Googler6c3de122022-03-28 11:40:41 +0000302 ":src_code_gen_impl", # buildcleaner: keep
Googler0611ea72022-05-04 07:03:07 -0700303 "//common:cc_ffi_types",
Googler6c3de122022-03-28 11:40:41 +0000304 "@llvm///clang:format",
305 "@llvm///llvm:Support",
306 ],
307)
308
309rust_library(
310 name = "src_code_gen_impl",
311 srcs = ["src_code_gen.rs"],
312 deps = [
Googler0611ea72022-05-04 07:03:07 -0700313 ":ir",
314 "//common:ffi_types",
Marcel Hlopko7f14b4c2022-04-13 00:54:45 -0700315 "//common:token_stream_printer",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700316 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700317 "@crates_io//itertools/v0_10:itertools",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700318 "@crates_io//proc_macro2/v1:proc_macro2",
319 "@crates_io//quote/v1:quote",
320 "@crates_io//serde_json/v1:serde_json",
321 "@crates_io//syn/v1:syn",
Googler6c3de122022-03-28 11:40:41 +0000322 ],
323)
324
325rust_test(
326 name = "src_code_gen_impl_test",
327 crate = ":src_code_gen_impl",
328 data = [
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700329 "@rust//toolchains/nightly:bin/rustfmt",
Googler6c3de122022-03-28 11:40:41 +0000330 "@rustfmt//:rustfmt.toml",
Googler6c3de122022-03-28 11:40:41 +0000331 ],
332 deps = [
333 ":ir_testing",
334 ":token_stream_matchers",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700335 "@crates_io//static_assertions/v1:static_assertions",
336 "@rust//support:rust_okay_here",
Googler6c3de122022-03-28 11:40:41 +0000337 ],
338)
339
340cc_library(
Googler6c3de122022-03-28 11:40:41 +0000341 name = "ast_convert",
342 srcs = ["ast_convert.cc"],
343 hdrs = ["ast_convert.h"],
Michael Forsterc0bc9262022-04-25 00:30:26 -0700344 visibility = ["//rs_bindings_from_cc:__subpackages__"],
Googler6c3de122022-03-28 11:40:41 +0000345 deps = [
Googler0611ea72022-05-04 07:03:07 -0700346 ":cc_ir",
Marco Polettic61bcc42022-04-08 12:54:30 -0700347 "//common:check",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700348 "@absl//functional:function_ref",
Googler6c3de122022-03-28 11:40:41 +0000349 "@llvm///clang:ast",
350 "@llvm///clang:basic",
351 ],
352)
353
354rust_library(
Googler6c3de122022-03-28 11:40:41 +0000355 name = "token_stream_matchers",
356 srcs = ["token_stream_matchers.rs"],
357 deps = [
Googler0611ea72022-05-04 07:03:07 -0700358 ":ir",
Marcel Hlopko7f14b4c2022-04-13 00:54:45 -0700359 "//common:token_stream_printer",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700360 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700361 "@crates_io//itertools/v0_10:itertools",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700362 "@crates_io//proc_macro2/v1:proc_macro2",
363 "@crates_io//quote/v1:quote",
Googler6c3de122022-03-28 11:40:41 +0000364 ],
365)
366
367rust_test(
368 name = "token_stream_matchers_test",
369 crate = ":token_stream_matchers",
370 data = [
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700371 "@rust//toolchains/nightly:bin/rustfmt",
Googler6c3de122022-03-28 11:40:41 +0000372 "@rustfmt//:rustfmt.toml",
Googler6c3de122022-03-28 11:40:41 +0000373 ],
374 deps = [
375 ":ir_testing",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700376 "@rust//support:rust_okay_here",
Googler6c3de122022-03-28 11:40:41 +0000377 ],
378)
379
Googler6c3de122022-03-28 11:40:41 +0000380STD_HEADERS = [
381 "cstddef",
382 "cstdlib",
383 "version",
384 "limits",
385 "climits",
386 "cfloat",
387 "cstdint",
388 "new",
389 "typeinfo",
390 "source_location",
391 "exception",
392 "initializer_list",
393 "compare",
394 "csignal",
395 "csetjmp",
396 "cstdarg",
397 "string",
398 "memory",
399 "stdint.h",
400 "stddef.h",
401 "stdlib.h",
402]
403
404config_setting(
405 name = "llvm_unstable",
406 values = {
407 "crosstool_top": "@clang//:everything",
408 },
409)
410
411filegroup(
412 name = "toolchain_headers",
413 srcs = select({
414 ":llvm_unstable": ["@clang//:cc-std-headers"],
415 "//conditions:default": ["@clang//:cc-std-headers"],
416 }) + [
417 "//third_party/grte/v5_x86/release/usr/grte/v5:compile",
418 ],
Googler6c3de122022-03-28 11:40:41 +0000419)
420
421filegroup(
422 name = "builtin_headers",
423 srcs = [
424 "@llvm///clang:builtin_headers_filegroup",
425 "@llvm///compiler-rt:fuzzer_filegroup",
426 "@llvm///compiler-rt:sanitizer_filegroup",
427 ],
428 visibility = ["//visibility:public"],
429)
430
431bindings_for_toolchain_headers(
432 name = "cc_std",
433 hdrs = ":toolchain_headers",
434 public_hdrs = STD_HEADERS,
435 visibility = ["//visibility:public"],
436)