aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTeddy Wing2018-08-25 22:52:41 +0200
committerTeddy Wing2018-08-25 22:52:41 +0200
commit4fd3fd4ded73aa4ba5320de50cd6b19fdf70a8a7 (patch)
tree10b9e17c4c1f8a113fce7e71c845aadbefc3fc0e
parentcdac4ed1ce81b76e6684f778fd07c8ebdacce556 (diff)
downloaddome-key-map-4fd3fd4ded73aa4ba5320de50cd6b19fdf70a8a7.tar.bz2
Generate a partial C header for our FFI API
* Add the 'cbindgen' crate to help us auto-generate a C header for our exported FFI enums/structs/functions * Add a `build.rs` to generate the C header using cbindgen * Add a rough config for 'cbindgen' * Export everything from the `cocoa_bridge` crate to include the `KeyActionResult` struct * Commit the C header generated by 'cbindgen' Looks promising. We do, however, have some things to correct. We can't use `Option` in C, for instance, so we'll need to fix that in our `KeyActionResult`. Similarly, we need to rework the `run_key_action()` function to make it accessible as a C interface. Right now it returns an `Option`, which isn't going to work, and I'm not sure if the slice input translates. That (any maybe more) is why it doesn't get generated by 'cbindgen' into the header output file.
-rw-r--r--Cargo.toml3
-rw-r--r--build.rs18
-rw-r--r--cbindgen.toml14
-rw-r--r--dome_key_map.h22
-rw-r--r--src/lib.rs2
5 files changed, 58 insertions, 1 deletions
diff --git a/Cargo.toml b/Cargo.toml
index 23af201..dca6231 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -6,5 +6,8 @@ version = "0.0.1"
cocoa = "0.18.0"
combine = "3.4.0"
+[build-dependencies]
+cbindgen = "0.6.2"
+
[lib]
crate-type = ["staticlib"]
diff --git a/build.rs b/build.rs
new file mode 100644
index 0000000..d2a0b5d
--- /dev/null
+++ b/build.rs
@@ -0,0 +1,18 @@
+extern crate cbindgen;
+
+use cbindgen::Language;
+
+fn main() {
+ let crate_dir = env!("CARGO_MANIFEST_DIR");
+
+ let config = cbindgen::Config::from_file("cbindgen.toml")
+ .expect("Failed to read 'cbindgen.toml'");
+
+ cbindgen::Builder::new()
+ .with_crate(crate_dir)
+ // .with_language(Language::C)
+ .with_config(config)
+ .generate()
+ .expect("Unable to generate bindings")
+ .write_to_file("dome_key_map.h");
+}
diff --git a/cbindgen.toml b/cbindgen.toml
new file mode 100644
index 0000000..22e0269
--- /dev/null
+++ b/cbindgen.toml
@@ -0,0 +1,14 @@
+language = "C"
+header = "/* Test */"
+include_version = true
+
+# [parse]
+# include = ["dome-key-map"]
+
+[export]
+include = ["KeyActionResult", "HeadphoneButton"]
+# item_types = ["enums", "structs", "functions"]
+item_types = ["constants", "globals", "enums", "structs", "unions", "typedefs", "opaque", "functions"]
+
+[export.rename]
+"run_key_action" = "hello_run"
diff --git a/dome_key_map.h b/dome_key_map.h
new file mode 100644
index 0000000..473d2f0
--- /dev/null
+++ b/dome_key_map.h
@@ -0,0 +1,22 @@
+/* Test */
+
+/* Generated with cbindgen:0.6.2 */
+
+#include <stdint.h>
+#include <stdlib.h>
+#include <stdbool.h>
+
+typedef enum {
+ Play,
+ Up,
+ Down,
+} HeadphoneButton;
+
+typedef struct MapKind MapKind;
+
+typedef struct Option_CString Option_CString;
+
+typedef struct {
+ Option_CString action;
+ MapKind kind;
+} KeyActionResult;
diff --git a/src/lib.rs b/src/lib.rs
index 3127631..db113dc 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -8,4 +8,4 @@ mod parser;
use parser::{HeadphoneButton, MapGroup, MapKind};
-pub use cocoa_bridge::run_key_action;
+pub use cocoa_bridge::*;