Skip to content
File

Blob: build/wd_rust_binary.bzl

2.4 KB
1load("@rules_rust//rust:defs.bzl", "rust_binary", "rust_test")
2load("@workerd//:build/wd_rust_crate.bzl", "rust_cxx_bridge")
3 
4def wd_rust_binary(
5 name,
6 deps = [],
7 proc_macro_deps = [],
8 data = [],
9 rustc_env = {},
10 visibility = None,
11 tags = [],
12 cxx_bridge_src = None,
13 cxx_bridge_deps = [],
14 test_size = "small"):
15 """Define rust binary.
16 
17 Args:
18 name: crate name.
19 deps: crate dependencies: rust crates or c/c++ libraries.
20 visibility: crate visibility.
21 data: additional data files.
22 proc_macro_deps: proc_macro dependencies.
23 rustc_env: additional rustc environment variables,
24 tags: rule tags
25 """
26 srcs = native.glob(["**/*.rs"])
27 crate_name = name.replace("-", "_")
28 
29 if cxx_bridge_src:
30 hdrs = native.glob(["**/*.h"], allow_empty = True)
31 
32 rust_cxx_bridge(
33 name = name + "@cxx",
34 src = cxx_bridge_src,
35 hdrs = hdrs,
36 include_prefix = "workerd/rust/" + name,
37 strip_include_prefix = "",
38 # Not applying visibility here – if you import the cxxbridge header, you will likely
39 # also need the rust library itself to avoid linker errors.
40 deps = cxx_bridge_deps + [
41 "@workerd-cxx//:core",
42 ],
43 )
44 
45 deps.append("@workerd-cxx//:cxx")
46 deps.append(name + "@cxx")
47 
48 rust_binary(
49 name = name,
50 crate_name = crate_name,
51 srcs = srcs,
52 rustc_env = rustc_env,
53 deps = deps,
54 visibility = visibility,
55 data = data,
56 proc_macro_deps = proc_macro_deps,
57 target_compatible_with = select({
58 "@//build/config:no_build": ["@platforms//:incompatible"],
59 "//conditions:default": [],
60 }),
61 )
62 
63 rust_test(
64 name = name + "_test",
65 crate = ":" + name,
66 env = {
67 "RUST_BACKTRACE": "1",
68 # rust test runner captures stderr by default, which makes debugging tests very hard
69 "RUST_TEST_NOCAPTURE": "1",
70 # our tests are usually very heavy and do not support concurrent invocation
71 "RUST_TEST_THREADS": "1",
72 },
73 target_compatible_with = select({
74 "@//build/config:no_build": ["@platforms//:incompatible"],
75 "//conditions:default": [],
76 }),
77 size = test_size,
78 tags = ["no-coverage"],
79 )