blob: 2c498e0327399e49520f1a108e0a269aef9667c4 [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",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070054 "@crates_io//pin_project/v1:pin_project", # used by ctor macros
Googler6c3de122022-03-28 11:40:41 +000055 # Required for `Copy` trait assertions added to the generated Rust
56 # code.
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070057 "@crates_io//static_assertions/v1:static_assertions",
Googler6c3de122022-03-28 11:40:41 +000058 ],
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070059 visibility = ["//third_party/crubit:__subpackages__"],
Googler6c3de122022-03-28 11:40:41 +000060)
61
62cc_binary(
63 name = "rs_bindings_from_cc_impl",
64 srcs = ["rs_bindings_from_cc.cc"],
65 visibility = ["//visibility:public"],
66 deps = [
67 ":bazel_types",
68 ":cmdline",
69 ":ir",
70 ":ir_from_cc",
71 ":src_code_gen",
Marco Poletti6669c692022-04-07 14:42:56 -070072 "//common:file_io",
Marco Polettic61bcc42022-04-08 12:54:30 -070073 "//common:status_macros",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070074 "@absl//container:flat_hash_map",
75 "@absl//flags:parse",
76 "@absl//status",
77 "@absl//status:statusor",
78 "@absl//strings",
Googler6c3de122022-03-28 11:40:41 +000079 "@llvm///llvm:Support",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070080 "@rust//support:rust_okay_here",
Googler6c3de122022-03-28 11:40:41 +000081 ],
82)
83
84cc_library(
85 name = "bazel_types",
86 hdrs = ["bazel_types.h"],
Marco Polettic61bcc42022-04-08 12:54:30 -070087 deps = ["//common:string_type"],
Googler6c3de122022-03-28 11:40:41 +000088)
89
90cc_library(
91 name = "cmdline",
92 srcs = ["cmdline.cc"],
93 hdrs = ["cmdline.h"],
94 deps = [
95 ":bazel_types",
96 ":ir",
Marco Polettic61bcc42022-04-08 12:54:30 -070097 "//common:status_macros",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -070098 "@absl//container:flat_hash_map",
99 "@absl//flags:flag",
100 "@absl//status:statusor",
101 "@absl//strings",
Googler6c3de122022-03-28 11:40:41 +0000102 "@llvm///llvm:Support",
103 ],
104)
105
106cc_test(
107 name = "cmdline_test",
108 srcs = ["cmdline_test.cc"],
109 deps = [
110 ":bazel_types",
111 ":cmdline",
112 "//testing/base/public:gunit_main",
113 ],
114)
115
116cc_library(
Michael Forsterb3503e02022-04-25 00:24:14 -0700117 name = "decl_importer",
118 hdrs = ["decl_importer.h"],
119 visibility = ["//third_party/crubit:__subpackages__"],
120 deps = [
121 "ir",
122 ":bazel_types",
123 "//lifetime_annotations",
124 "@absl//container:flat_hash_map",
125 "@absl//status:statusor",
126 ],
127)
128
129cc_library(
Googler6c3de122022-03-28 11:40:41 +0000130 name = "frontend_action",
131 srcs = ["frontend_action.cc"],
132 hdrs = ["frontend_action.h"],
133 deps = [
134 ":ast_consumer",
135 ":importer",
136 "//lifetime_annotations",
137 "@llvm///clang:ast",
138 "@llvm///clang:frontend",
139 ],
140)
141
142cc_library(
143 name = "ast_consumer",
144 srcs = ["ast_consumer.cc"],
145 hdrs = ["ast_consumer.h"],
146 deps = [
147 ":importer",
Marco Polettic61bcc42022-04-08 12:54:30 -0700148 "//common:check",
Googler6c3de122022-03-28 11:40:41 +0000149 "@llvm///clang:ast",
150 "@llvm///clang:frontend",
151 ],
152)
153
154cc_library(
155 name = "importer",
156 srcs = ["importer.cc"],
157 hdrs = ["importer.h"],
158 deps = [
159 ":ast_convert",
160 ":bazel_types",
Michael Forsterb3503e02022-04-25 00:24:14 -0700161 ":decl_importer",
Googler6c3de122022-03-28 11:40:41 +0000162 ":ir",
Marco Polettic61bcc42022-04-08 12:54:30 -0700163 "//common:check",
164 "//common:status_macros",
Googler6c3de122022-03-28 11:40:41 +0000165 "//lifetime_annotations:type_lifetimes",
Michael Forsterb3503e02022-04-25 00:24:14 -0700166 "//rs_bindings_from_cc/importers:class_template",
Michael Forsterc0bc9262022-04-25 00:30:26 -0700167 "//rs_bindings_from_cc/importers:cxx_record",
Michael Forster4fa849d2022-04-25 00:32:59 -0700168 "//rs_bindings_from_cc/importers:enum",
Michael Forster7e4244a2022-04-25 00:39:01 -0700169 "//rs_bindings_from_cc/importers:function",
Michael Forster350d5312022-04-25 00:36:31 -0700170 "//rs_bindings_from_cc/importers:function_template",
Michael Forster284fb5a2022-04-25 00:41:14 -0700171 "//rs_bindings_from_cc/importers:namespace",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700172 "@absl//container:flat_hash_map",
173 "@absl//container:flat_hash_set",
174 "@absl//status",
175 "@absl//status:statusor",
176 "@absl//strings",
177 "@absl//strings:cord",
Googler6c3de122022-03-28 11:40:41 +0000178 "@llvm///clang:ast",
179 "@llvm///clang:basic",
180 "@llvm///clang:sema",
181 "@llvm///llvm:Support",
182 ],
183)
184
185cc_test(
186 name = "importer_test",
187 srcs = ["importer_test.cc"],
188 deps = [
189 ":bazel_types",
190 ":ir",
191 ":ir_from_cc",
192 "//testing/base/public:gunit_main",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700193 "@absl//status",
194 "@absl//status:statusor",
195 "@absl//strings",
196 "@absl//types:span",
Googler6c3de122022-03-28 11:40:41 +0000197 "@llvm///clang:ast",
198 ],
199)
200
201cc_library(
202 name = "ir",
203 srcs = ["ir.cc"],
204 hdrs = ["ir.h"],
Googler6c3de122022-03-28 11:40:41 +0000205 deps = [
206 ":bazel_types",
Marco Polettic61bcc42022-04-08 12:54:30 -0700207 "//common:check",
208 "//common:strong_int",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700209 "@absl//strings",
Michael Forsterc0bc9262022-04-25 00:30:26 -0700210 "@llvm///clang:ast",
Googler6c3de122022-03-28 11:40:41 +0000211 "@llvm///llvm:Support",
212 ],
213)
214
215rust_library(
216 name = "rs_ir",
217 srcs = ["ir.rs"],
218 crate_name = "ir",
219 deps = [
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700220 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700221 "@crates_io//itertools/v0_10:itertools",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700222 "@crates_io//proc_macro2/v1:proc_macro2",
223 "@crates_io//quote/v1:quote",
224 "@crates_io//serde/v1:serde",
225 "@crates_io//serde_json/v1:serde_json",
Googler6c3de122022-03-28 11:40:41 +0000226 ],
227)
228
229rust_test(
230 name = "rs_ir_test",
231 crate = ":rs_ir",
232)
233
234rust_library(
235 name = "ir_testing",
236 testonly = 1,
237 srcs = ["ir_testing.rs"],
238 deps = [
239 ":json_from_cc",
Googler6c3de122022-03-28 11:40:41 +0000240 ":rs_ir",
Marcel Hlopko65978eb2022-04-08 07:40:18 -0700241 "//common:rs_ffi_types",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700242 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700243 "@crates_io//itertools/v0_10:itertools",
Googler6c3de122022-03-28 11:40:41 +0000244 ],
245)
246
247cc_library(
248 name = "ir_from_cc",
249 srcs = ["ir_from_cc.cc"],
250 hdrs = ["ir_from_cc.h"],
251 deps = [
252 ":bazel_types",
253 ":frontend_action",
254 ":importer",
255 ":ir",
Marco Polettic61bcc42022-04-08 12:54:30 -0700256 "//common:check",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700257 "@absl//container:flat_hash_map",
258 "@absl//status",
259 "@absl//status:statusor",
260 "@absl//strings",
261 "@absl//types:span",
Googler6c3de122022-03-28 11:40:41 +0000262 "@llvm///clang:basic",
263 "@llvm///clang:frontend",
264 "@llvm///clang:tooling",
265 ],
266)
267
268cc_library(
269 name = "json_from_cc",
270 srcs = ["json_from_cc.cc"],
271 deps = [
272 ":bazel_types",
Googler6c3de122022-03-28 11:40:41 +0000273 ":ir",
274 ":ir_from_cc",
Marcel Hlopko65978eb2022-04-08 07:40:18 -0700275 "//common:ffi_types",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700276 "@absl//status:statusor",
Googler6c3de122022-03-28 11:40:41 +0000277 "@llvm///llvm:Support",
278 ],
279)
280
281rust_test(
282 name = "ir_from_cc_test",
283 srcs = ["ir_from_cc_test.rs"],
284 deps = [
285 ":ir_testing",
286 ":rs_ir",
287 ":token_stream_matchers",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700288 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700289 "@crates_io//itertools/v0_10:itertools",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700290 "@crates_io//quote/v1:quote",
291 "@rust//support:rust_okay_here",
Googler6c3de122022-03-28 11:40:41 +0000292 ],
293)
294
295cc_library(
296 name = "src_code_gen",
297 srcs = ["src_code_gen.cc"],
298 hdrs = ["src_code_gen.h"],
299 deps = [
Googler6c3de122022-03-28 11:40:41 +0000300 ":ir",
301 ":src_code_gen_impl", # buildcleaner: keep
Marcel Hlopko65978eb2022-04-08 07:40:18 -0700302 "//common:ffi_types",
Googler6c3de122022-03-28 11:40:41 +0000303 "@llvm///clang:format",
304 "@llvm///llvm:Support",
305 ],
306)
307
308rust_library(
309 name = "src_code_gen_impl",
310 srcs = ["src_code_gen.rs"],
311 deps = [
Googler6c3de122022-03-28 11:40:41 +0000312 ":rs_ir",
Marcel Hlopko65978eb2022-04-08 07:40:18 -0700313 "//common:rs_ffi_types",
Marcel Hlopko7f14b4c2022-04-13 00:54:45 -0700314 "//common:token_stream_printer",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700315 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700316 "@crates_io//itertools/v0_10:itertools",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700317 "@crates_io//proc_macro2/v1:proc_macro2",
318 "@crates_io//quote/v1:quote",
319 "@crates_io//serde_json/v1:serde_json",
320 "@crates_io//syn/v1:syn",
Googler6c3de122022-03-28 11:40:41 +0000321 ],
322)
323
324rust_test(
325 name = "src_code_gen_impl_test",
326 crate = ":src_code_gen_impl",
327 data = [
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700328 "@rust//toolchains/nightly:bin/rustfmt",
Googler6c3de122022-03-28 11:40:41 +0000329 "@rustfmt//:rustfmt.toml",
Googler6c3de122022-03-28 11:40:41 +0000330 ],
331 deps = [
332 ":ir_testing",
333 ":token_stream_matchers",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700334 "@crates_io//static_assertions/v1:static_assertions",
335 "@rust//support:rust_okay_here",
Googler6c3de122022-03-28 11:40:41 +0000336 ],
337)
338
339cc_library(
Googler6c3de122022-03-28 11:40:41 +0000340 name = "ast_convert",
341 srcs = ["ast_convert.cc"],
342 hdrs = ["ast_convert.h"],
Michael Forsterc0bc9262022-04-25 00:30:26 -0700343 visibility = ["//rs_bindings_from_cc:__subpackages__"],
Googler6c3de122022-03-28 11:40:41 +0000344 deps = [
345 ":ir",
Marco Polettic61bcc42022-04-08 12:54:30 -0700346 "//common:check",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700347 "@absl//functional:function_ref",
Googler6c3de122022-03-28 11:40:41 +0000348 "@llvm///clang:ast",
349 "@llvm///clang:basic",
350 ],
351)
352
353rust_library(
Googler6c3de122022-03-28 11:40:41 +0000354 name = "token_stream_matchers",
355 srcs = ["token_stream_matchers.rs"],
356 deps = [
357 ":rs_ir",
Marcel Hlopko7f14b4c2022-04-13 00:54:45 -0700358 "//common:token_stream_printer",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700359 "@crates_io//anyhow/v1:anyhow",
Lukasz Anforowicz4f6dfc62022-04-14 14:15:26 -0700360 "@crates_io//itertools/v0_10:itertools",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700361 "@crates_io//proc_macro2/v1:proc_macro2",
362 "@crates_io//quote/v1:quote",
Googler6c3de122022-03-28 11:40:41 +0000363 ],
364)
365
366rust_test(
367 name = "token_stream_matchers_test",
368 crate = ":token_stream_matchers",
369 data = [
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700370 "@rust//toolchains/nightly:bin/rustfmt",
Googler6c3de122022-03-28 11:40:41 +0000371 "@rustfmt//:rustfmt.toml",
Googler6c3de122022-03-28 11:40:41 +0000372 ],
373 deps = [
374 ":ir_testing",
Marcel Hlopko9a94fc42022-04-06 23:35:36 -0700375 "@rust//support:rust_okay_here",
Googler6c3de122022-03-28 11:40:41 +0000376 ],
377)
378
Googler6c3de122022-03-28 11:40:41 +0000379STD_HEADERS = [
380 "cstddef",
381 "cstdlib",
382 "version",
383 "limits",
384 "climits",
385 "cfloat",
386 "cstdint",
387 "new",
388 "typeinfo",
389 "source_location",
390 "exception",
391 "initializer_list",
392 "compare",
393 "csignal",
394 "csetjmp",
395 "cstdarg",
396 "string",
397 "memory",
398 "stdint.h",
399 "stddef.h",
400 "stdlib.h",
401]
402
403config_setting(
404 name = "llvm_unstable",
405 values = {
406 "crosstool_top": "@clang//:everything",
407 },
408)
409
410filegroup(
411 name = "toolchain_headers",
412 srcs = select({
413 ":llvm_unstable": ["@clang//:cc-std-headers"],
414 "//conditions:default": ["@clang//:cc-std-headers"],
415 }) + [
416 "//third_party/grte/v5_x86/release/usr/grte/v5:compile",
417 ],
Googler6c3de122022-03-28 11:40:41 +0000418)
419
420filegroup(
421 name = "builtin_headers",
422 srcs = [
423 "@llvm///clang:builtin_headers_filegroup",
424 "@llvm///compiler-rt:fuzzer_filegroup",
425 "@llvm///compiler-rt:sanitizer_filegroup",
426 ],
427 visibility = ["//visibility:public"],
428)
429
430bindings_for_toolchain_headers(
431 name = "cc_std",
432 hdrs = ":toolchain_headers",
433 public_hdrs = STD_HEADERS,
434 visibility = ["//visibility:public"],
435)