| # Code Formatting |
| |
| `bindgen` uses `rustfmt` to format the emitted bindings. This section describes |
| how to adjust the `rustfmt` behavior when being used from `bindgen`. |
| |
| ## Passing a `rustfmt.toml` configuration file |
| |
| `rustfmt` should automatically use any `rustfmt.toml` file that is present in |
| the directory from where `bindgen` will be run. If you want to use a |
| configuration file that has a different name or that is in a different |
| directory you can use the `--rustfmt-configuration-file` flag or the |
| [`Builder::rustfmt_configuration_file`](https://docs.rs/bindgen/latest/bindgen/struct.Builder.html#method.rustfmt_configuration_file) |
| method. |
| |
| ## Using a nightly release of `rustfmt` |
| |
| If the `rustfmt` command does not correspond to a nightly release of `rustfmt` |
| but you have `rustup` available, you can use `nightly` by following these |
| steps: |
| |
| ### When using `bindgen` as a CLI application |
| |
| Use `rustup run` to run `bindgen`: |
| |
| ```bash |
| $ rustup run nightly bindgen [ARGS] |
| ``` |
| |
| ### When using `bindgen` as a library |
| |
| Take the output of the following command: |
| ```bash |
| $ rustup which rustfmt --toolchain=nightly |
| ``` |
| and pass it to |
| [`Builder::with_rustfmt`](https://docs.rs/bindgen/latest/bindgen/struct.Builder.html#method.with_rustfmt): |
| |
| ```rust,ignore |
| use bindgen::Builder; |
| use std::process::Command; |
| |
| fn main() { |
| let output = Command::new("rustup") |
| .args(["which", "rustfmt", "--toolchain", "nightly"]) |
| .output() |
| .expect("Could not spawn `rustup` command"); |
| |
| assert!( |
| output.status.success(), |
| "Unsuccessful status code when running `rustup`: {:?}", |
| output |
| ); |
| |
| let rustfmt_path = |
| String::from_utf8(output.stdout).expect("The `rustfmt` path is not valid `utf-8`"); |
| |
| let bindings = Builder::default() |
| .header("path/to/input.h") |
| .with_rustfmt(rustfmt_path) |
| .generate() |
| .expect("Could not generate bindings"); |
| |
| bindings |
| .write_to_file("path/to/output.rs") |
| .expect("Could not write bindings"); |
| } |
| ``` |
| |
| These two methods also apply to any other toolchain available in your system. |
| |
| ## Using `prettyplease` |
| |
| The [`prettyplease`](https://github.com/dtolnay/prettyplease) crate is a |
| minimal formatter for generated code. To format bindings using `prettyplease` |
| you have to invoke `bindgen` with either the `--formatter=prettyplease` flag or |
| the `bindgen::Builder::formatter(bindgen::Formatter::Prettyplease)`. One of |
| its advantages is that `prettyplease` can be used in minimal environments where |
| the Rust toolchain is not installed. |
| |
| ## How can I normalize `#[doc]` attributes? |
| |
| `bindgen` emits all the documentation using `#[doc]` attributes by default. If |
| you want to use the more user-friendly `///` syntax, you have two options: |
| |
| ### Use `rustfmt` |
| |
| `rustfmt` can be configured to normalize documentation. To do so, you have to |
| create a `rustfmt.toml` file with the following contents: |
| |
| ```toml |
| normalize_doc_attributes = true |
| ``` |
| |
| Then, you have set up `bindgen` so it passes this file to `rustfmt`. Given that |
| the `normalize_doc_attributes` option is |
| [unstable](https://github.com/rust-lang/rustfmt/issues/3351), you also have to |
| set up bindgen to use a `nightly` release of `rustfmt`. |
| |
| |
| ### Use `prettyplease` |
| |
| `prettyplease` normalizes documentation without any additional configuration. |
| Then you just have to tell `bindgen` to use `prettyplease` as the code |
| formatter. |