From 57499cf8b3add216dde930df626ab7828364eff9 Mon Sep 17 00:00:00 2001 From: James Wainwright Date: Tue, 16 Jul 2024 11:20:26 +0100 Subject: [PATCH] Add shared-header bindgen example --- examples/bindgen/BUILD.bazel | 21 ++++++++++++++- examples/bindgen/shared.rs | 4 +++ examples/bindgen/shared/BUILD.bazel | 36 +++++++++++++++++++++++++ examples/bindgen/shared/greeting.h | 6 +++++ examples/bindgen/shared/hello.c | 6 +++++ examples/bindgen/shared/hello.h | 6 +++++ examples/bindgen/shared/hello.rs | 6 +++++ examples/bindgen/{main.rs => simple.rs} | 0 8 files changed, 84 insertions(+), 1 deletion(-) create mode 100644 examples/bindgen/shared.rs create mode 100644 examples/bindgen/shared/BUILD.bazel create mode 100644 examples/bindgen/shared/greeting.h create mode 100644 examples/bindgen/shared/hello.c create mode 100644 examples/bindgen/shared/hello.h create mode 100644 examples/bindgen/shared/hello.rs rename examples/bindgen/{main.rs => simple.rs} (100%) diff --git a/examples/bindgen/BUILD.bazel b/examples/bindgen/BUILD.bazel index 400fd0c0fa..d2202151ca 100644 --- a/examples/bindgen/BUILD.bazel +++ b/examples/bindgen/BUILD.bazel @@ -14,7 +14,7 @@ rust_bindgen_library( rust_binary( name = "simple_example", - srcs = ["main.rs"], + srcs = ["simple.rs"], deps = [":simple_bindgen"], ) @@ -22,3 +22,22 @@ rust_test( name = "simple_test", crate = ":simple_example", ) + +rust_bindgen_library( + name = "hello_c_bindgen", + bindgen_flags = [ + "--allowlist-function=hello", + ], + cc_lib = "//bindgen/shared:hello_c", + crate_name = "hello_c", + header = "//bindgen/shared:hello.h", +) + +rust_binary( + name = "shared_example", + srcs = ["shared.rs"], + deps = [ + ":hello_c_bindgen", + "//bindgen/shared:hello_rs", + ], +) diff --git a/examples/bindgen/shared.rs b/examples/bindgen/shared.rs new file mode 100644 index 0000000000..784a42aeb5 --- /dev/null +++ b/examples/bindgen/shared.rs @@ -0,0 +1,4 @@ +fn main() { + hello_rs::hello(); + unsafe { hello_c::hello() }; +} diff --git a/examples/bindgen/shared/BUILD.bazel b/examples/bindgen/shared/BUILD.bazel new file mode 100644 index 0000000000..f7b471b660 --- /dev/null +++ b/examples/bindgen/shared/BUILD.bazel @@ -0,0 +1,36 @@ +load("@rules_cc//cc:defs.bzl", "cc_library") +load("@rules_rust//bindgen:defs.bzl", "rust_bindgen") +load("@rules_rust//rust:defs.bzl", "rust_library") + +package(default_visibility = ["//bindgen:__pkg__"]) + +cc_library( + name = "greeting", + hdrs = ["greeting.h"], +) + +rust_bindgen( + name = "greeting_bindgen", + bindgen_flags = [ + "--allowlist-var=GREETING", + "--generate-cstr", + ], + cc_lib = ":greeting", + header = "greeting.h", +) + +rust_library( + name = "hello_rs", + srcs = [ + "hello.rs", + ":greeting_bindgen", + ], + crate_root = "hello.rs", +) + +cc_library( + name = "hello_c", + srcs = ["hello.c"], + hdrs = ["hello.h"], + deps = [":greeting"], +) diff --git a/examples/bindgen/shared/greeting.h b/examples/bindgen/shared/greeting.h new file mode 100644 index 0000000000..7cfaf8f0fb --- /dev/null +++ b/examples/bindgen/shared/greeting.h @@ -0,0 +1,6 @@ +#ifndef __FFI_H_INCLUDE__ +#define __FFI_H_INCLUDE__ + +#define GREETING "Hello" + +#endif // __FFI_H_INCLUDE__ diff --git a/examples/bindgen/shared/hello.c b/examples/bindgen/shared/hello.c new file mode 100644 index 0000000000..0614aa7ae0 --- /dev/null +++ b/examples/bindgen/shared/hello.c @@ -0,0 +1,6 @@ +#include +#include "greeting.h" + +void hello(void) { + printf("%s from C!\n", GREETING); +} diff --git a/examples/bindgen/shared/hello.h b/examples/bindgen/shared/hello.h new file mode 100644 index 0000000000..2ed0544293 --- /dev/null +++ b/examples/bindgen/shared/hello.h @@ -0,0 +1,6 @@ +#ifndef HELLO_H_INCLUDE__ +#define HELLO_H_INCLUDE__ + +void hello(void); + +#endif // HELLO_H_INCLUDE__ diff --git a/examples/bindgen/shared/hello.rs b/examples/bindgen/shared/hello.rs new file mode 100644 index 0000000000..2090f88fc1 --- /dev/null +++ b/examples/bindgen/shared/hello.rs @@ -0,0 +1,6 @@ +mod greeting_bindgen; + +pub fn hello() { + let greeting = greeting_bindgen::GREETING.to_str().unwrap(); + println!("{greeting} from Rust!"); +} diff --git a/examples/bindgen/main.rs b/examples/bindgen/simple.rs similarity index 100% rename from examples/bindgen/main.rs rename to examples/bindgen/simple.rs