blob: 9c82e83a32156d98b9a04238ffa9b341d09a3859 [file] [log] [blame] [view] [edit]
# 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.