blob: 39ae2ef7cc9a7b0231cefaa400b6920aa192f8c9 [file] [log] [blame] [view]
# rs_bindings_from_cc
Disclaimer: This project is experimental, under heavy development, and should
not be used yet.
`:rs_bindings_from_cc` parses C++ headers and generates:
* a Rust source file with bindings for the C++ API
* a C++ source file with the implementation of the bindings
For convenience, `:test_wrapper` is a shell script that passes all Clang command
line flags from the current Bazel C++ toolchain:
```
bazel run //rs_bindings_from_cc:test_wrapper -- --public_headers=hello_world.h
```
or:
```
bazel build //rs_bindings_from_cc:test_wrapper
bazel-bin/rs_bindings_from_cc/test_wrapper --public_headers=hello_world.h
```
## Testing
If possible follow these recommendations:
* Unit tests for
[`src_code_gen`](rs_bindings_from_cc/src_code_gen.rs)
should:
* be written in Rust
* have snippets of C++ as input
* use
[`assert_cc_matches!/assert_rs_matches!/assert_cc_not_matches!/assert_rs_not_matches!`](rs_bindings_from_cc/token_stream_matchers.rs)
macros
* Unit tests for the
[`importer`](rs_bindings_from_cc/importer.h)
should:
* be written in Rust
([`ir_from_cc_test.rs`](rs_bindings_from_cc/ir_from_cc_test.rs))
so they cover both AST logic and IR serialization/deserialization, but
C++ tests (thanks to its nice matchers) are also OK at the moment
([`importer_test.cc`](rs_bindings_from_cc/importer_test.cc))
* have snippets of C++ as input
* make assertions on the content of the IR
* Write tests for the command line interface of interop tools in
[`rs_bindings_from_cc_test.sh`](rs_bindings_from_cc/test/rs_bindings_from_cc_test.sh).
* Write golden file tests (comparing both the C++ and Rust generated source
code against the checked-in files) in
[`test/golden`](rs_bindings_from_cc/test/golden/).
* Run
[`rs_bindings_from_cc/test/golden/update.sh`](rs_bindings_from_cc/test/golden/update.sh)
to regenerate checked-in files.
* Write full executable end-to-end tests (verifying that interop tools and
Bazel rules generate outputs that can be built and executed) as small
projects with a `rust_test` or `cc_test` on top in subpackages of `test`.
To run individual rust tests with `bazel test` (like `bazel test --test_filter=<test>` for gtest cases), give the test function name as `--test_arg=<test>`.
To get Rust backtraces for `rs_bindings_from_cc` when running end-to-end tests,
use `bazel test --action_env=RUST_BACKTRACE=1` to run the tests.
## Debugging
If you want to build the tool specially, for example using sanitizers, use the
script at `rs_bindings_from_cc/generate_bindings_for_target_with_tool_flags.sh`, for example:
```
rs_bindings_from_cc/generate_bindings_for_target_with_tool_flags.sh \
//base \
--config=asan
```
If you want to build the tool specially and use it for generating bindings from
a golden file, use the `<header basename>_rs_test` target. For `types.h` the
command would be:
```
rs_bindings_from_cc/generate_bindings_for_target_with_tool_flags.sh \
//rs_bindings_from_cc/test/golden:types_rs_test \
--config=asan
```
If you want to see the Clang AST dump of some file (generated files work too), run:
```
bazel build --per_file_copt=<PATH_TO_FILE>@-Xclang,-ast-dump,-fno-color-diagnostics <TARGET> > /tmp/output_file
```
## Contributing
Chat room (internal): https://chat.google.com/room/AAAAImO--WA
20% starter projects list (internal): b/hotlists/3645339