Library and CLI for generating code for the Rust implementation of the MAVLink UAV messaging protocol.
mavlink-bindgen
can be used to create MAVLink bindings for Rust. This is used from build.rs
in the mavlink crate to create bindings from the standard MAVLink dialects in https://github.com/mavlink/mavlink.
mavlink-bindgen
can be used as a code generator from build.rs
as done is the mavlink
crate for a custom MAVLink dialect or as a CLI tool to generate rust binding from XML dialect definitions. The generated code will depend on the mavlink-core crate in both use cases. Each dialect generated will be locked behind a feature flag of the same name, that must be enabled when using the generated code.
Build the binary using cargo with cli
feature enabled:
cd mavlink-bindgen
cargo build --features cli
Alternatively you can build and install mavlink-bindgen
to your locally installed crates:
cargo install mavlink-bindgen --features cli
To generate code using the resulting binary:
mavlink-bindgen --format-generated-code message_definitions mavlink_dialects
The full command line options are shown below.
Usage: mavlink-bindgen [OPTIONS] <DEFINITIONS_DIR> <DESTINATION_DIR>
Arguments:
<DEFINITIONS_DIR> Path to the directory containing the MAVLink dialect definitions
<DESTINATION_DIR> Path to the directory where the code is generated into, must already exist
Options:
--format-generated-code format code generated code
--emit-cargo-build-messages prints cargo build message indicating when the code has to be rebuild
-h, --help Print help
The output dir will contain a mod.rs
file with each dialect in its own file locked behind a feature flag.
Add to your Cargo.toml:
mavlink-bindgen = "0.13.1"
Add a build/main.rs
or build.rs
to your project if it does not already exist. Then add the following to the main
function to generate the code:
let out_dir = env::var("OUT_DIR").unwrap();
let result = match mavlink_bindgen::generate(definitions_dir, out_dir) {
Ok(r) => r,
Err(e) => {
eprintln!("{e}");
return ExitCode::FAILURE;
}
};
If the generated code should be formated use
mavlink_bindgen::format_generated_code(&result);
To tell cargo when to regenerate code from the definitions use:
mavlink_bindgen::emit_cargo_build_messages(&result);
Finally include the generated code into the lib.rs
or main.rs
:
#![cfg_attr(not(feature = "std"), no_std)]
// include generate definitions
include!(concat!(env!("OUT_DIR"), "/mod.rs"));
pub use mavlink_core::*;
Since each dialect is locked behind a feature flag these need to be enabled for the dialects to become available when using the generated code.
This approach is used by the mavlink
crate see its build script for an example.