| # Crubit Features |
| |
| <internal link> |
| |
| NOTE: b/262878759: Features are currently only used for autogenerated Rust |
| bindings of C++ targets, not C++ bindings of Rust targets. Even without |
| specifying any features, Crubit will generate full C++ bindings for Rust |
| targets. This will change soon. |
| |
| <!-- TODO(b/262878759): see above. --> |
| |
| C++/Rust interop is configured per target using "features": aspect hints which |
| are applied onto a build target in order to configure its automatically |
| generated bindings. |
| |
| Features control which capabilities Crubit has. For example, support for move |
| constructors is gated behind the `:experimental` feature. If the class is in a |
| target configured to use `:experimental`, then the constructor will receive |
| bindings, otherwise it will not. |
| |
| Features are used for gradual rollouts of new capabilities, and to allow for |
| separate build modes for un-annotated code, code which opts into C++/Rust |
| interop, and internal test code. |
| |
| ## Using Features |
| |
| To use a feature, add it to your target: |
| |
| ```python |
| # Enables the `:supported` feature on a C++ library `:example`. |
| cc_library( |
| name = "example", |
| hdrs = ["example.h"], |
| aspect_hints = ["//features:supported"], |
| ) |
| ``` |
| |
| This causes the generated bindings for that target to use all the Crubit |
| capabilities in `:supported`. |
| |
| ## Testing Features |
| |
| Crubit developers may want to temporarily enable features without respect to |
| visibility restrictions or level of support. The build flag: |
| |
| `--//rs_bindings_from_cc/bazel_support:globally_enabled_features` |
| |
| accepts a comma-separated list of unstable internal feature names (like |
| `supported`, `experimental`, or the special alias `all`) and overrides the |
| baseline feature set for all targets for the duration of the build. The flag's |
| default value is the empty list. |
| |
| ## Features |
| |
| ### <default> {#default} |
| |
| The default feature is enabled for all targets everywhere. It contains interop |
| capabilities which have minimal impositions on library owners. |
| |
| The default feature currently only enables a "dark launch" parsing and |
| processing pass. No bindings are generated. |
| |
| ### `"//features:supported"` {#supported} |
| |
| The `supported` feature enables generally-available C++/Rust interop |
| capabilities, for libraries that specifically support FFI callers. |
| |
| See <internal link> for documentation on what this includes. |
| |
| ### `"//features:experimental"` {#experimental} |
| |
| The `experimental` feature enables internal-only experimental capabilities. This |
| is used for testing of upcoming features, and is also used by pilot partners who |
| are testing those features. This also includes everything in `:supported`. |
| |
| `experimental` is visibility-restricted to only internal use and pilot partners. |