[](This file is part of bindgen-wrapper. It is subject to the license terms in the COPYRIGHT file found in the top-level directory of this distribution and at https://raw.githubusercontent.com/lemonrock/bindgen-wrapper/master/COPYRIGHT. No part of bindgen-wrapper, including this file, may be copied, modified, propagated, or distributed except according to the terms contained in the COPYRIGHT file.) [](Copyright © 2016 The developers of bindgen-wrapper. See the COPYRIGHT file in the top-level directory of this distribution and at https://raw.githubusercontent.com/lemonrock/bindgen-wrapper/master/COPYRIGHT.)
This small git module makes it easier to generate FFI bindings for rust using bindgen. is intended to be used as a git submodule inside a -sys
module, to make it easier to work with bindgen on Mac OS X and with more complex FFI wrappers. It installs all required dependencies using cargo
, and, on Mac OS X, brew
(Homebrew), except for Rust, cargo
and brew
itself. As a final step, after generating the bindings, it checks they compile.
It checks for any essential dependencies by looking in the PATH
; a standard Mac OS X PATH
with an additional to find binaries installed by cargo should be sufficient.
As an example, check out bearssl-sys on GitHub.
We try to automatically install these, but this is brittle at the moment. In the future, we may use a custom .cargo location.
- bindgen
- rustfmt-nightly
At the terminal, do the following:-
# my-crate-repo should already contain a `.git` folder or file
cd my-crate-repo
mkdir -m 0755 -p tools
git submodule add https://github.com/lemonrock/bindgen-wrapper.git tools/bindgen-wrapper
git submodule update --init --recursive
ln -s tools/bindgen-wrapper/bindgen-wrapper
cd -
To use bindgen-wrapper
we need to create some files.
At the terminal, do the following:-
# my-crate-repo should already contain a `.git` folder or file
cd my-crate-repo
mkdir -m 0755 bindgen-wrapper.conf.d
# Place any header (*.h) files in here that add to or replace ones shipped by your library
mkdir -m 0755 bindgen-wrapper.conf.d/header-overrides
# Rust code snippet prepended to bindgen output. Add crate-level attributes, copyright statements, etc, here
touch bindgen-wrapper.conf.d/preamble.rs
# Rust code snippet interjected between `use` statements and remainder of generated code. Place additional `use` statements here
touch bindgen-wrapper.conf.d/post-includes.rs
# General configuation (does not need to executable)
touch bindgen-wrapper.conf.d/configuration.sh
See bearssl-sys and libfabric for examples of configuration.sh
. As a minimum, you should define rootIncludeFileName
and link
. link
is a space-separated list of lib names (on Unix systems, omit any lib
prefix, eg libmbedtls
is mbedtls
). The functions preprocess_before_headersFolderPath
, postprocess_after_generation
, postprocess_after_rustfmt
and final_chance_to_tweak
default to empty. The statement bindgen_wrapper_addTacFallbackIfNotPresent
is only necessary if either postprocess_after_generation
or postprocess_after_rustfmt
need to use the tac
binary. The values macosXHomebrewPackageName
and alpineLinuxPackageName
(if known) can be set to a space-separated list of packages to install as prerequisites, perhaps containing header files. headersFolderPath
can be used to specify a repository-local relative location for headers. To do actions before headersFolderPath
is used, insert code in preprocess_before_headersFolderPath
. This can rely on the packages in macosXHomebrewPackageName
or alpineLinuxPackageName
having been installed. The variable clangAdditionalArguments
can be set to pass additional switches to clang via bindgen.
The following read-only variables are available to configuration.sh
:-
homeFolder
- the root of the git repository, ietools/bindgen/../..
.configurationFolderPath
- the parent folder containingconfiguration.sh
outputFolderPath
- the location of eventual rust code (typically$homeFolder/src
). Only populated and useful infinal_chance_to_tweak
. Contains files such aslib.rs
,enums/<someEnumName>.rs
, etc. See libfabric for examples.
These values may not be absolute. Do not cd
inside configuration.sh
. The [mbedtls-sys] configuration.sh
uses homeFolder
to find a local copy of the mbedtls source code included as a git submodule.
The file constant.types
allows for remapping of constants defined using #define
in C to sensible values in Rust. The file suppress-debug-warnings
lists structs to suppress debug warnings for.
- This wrapper is untested on anything but Mac OS X El Capitan, but with modification, should work on Alpine Linux, Debian-derivatives and Red Hat derivatives
sed
is somewhat broken on Mac OS X, and we try to work around it.