Re: [PATCH 3/3] rust: generate bindings via cbindgen
- From
Ezekiel Newren <ezekielnewren@gmail.com>
- Date
- Oct 23, 2025, 18:00 UTC
- Message-ID
- <CAH=ZcbADTLvTioBf+LYQej1G0biZM8s3-iJG+BZjnpxj+8NjsA@mail.gmail.com>
- In-Reply-To
- <20251023-b4-pks-rust-cbindgen-v1-3-c19b61b03127@pks.im>
On Thu, Oct 23, 2025 at 1:17 AM Patrick Steinhardt <ps@pks.im> wrote:
Show 7 quoted lines
> +C_BINDINGS = c-bindings.h > + > +GENERATED_H += $(C_BINDINGS) > + > +$(C_BINDINGS): cbindgen.toml $(RUST_SOURCES) > + $(QUIET_CBINDGEN)cbindgen --output $@ > +
My preference is to store all generated header files from cbindgen under interop/ that way we don't pollute the root of Git. It also makes ignoring generated header files easier (if we choose to) since we'd only need to specify `/interop/` in .gitignore. For platforms that can't compile Rust how are they going to build C if they depend on those generated headers?
Show 13 quoted lines
> diff --git a/cbindgen.toml b/cbindgen.toml > new file mode 100644 > index 00000000000..ba4b2d63672 > --- /dev/null > +++ b/cbindgen.toml > @@ -0,0 +1,7 @@ > +language = "C" > + > +# Don't include standard C headers. These are managed by "git-compat-util.h". > +no_includes = true > + > +# Use plain structs instead of using typedefs. > +style = "tag"
This is what my cbindgen.toml file looked like. ``` sys_includes = ["git-compat-util.h"]
autogen_warning = "/* Warning, this file is autogenerated by cbindgen. Don't modify this manually. */"
language = "C" no_includes = true usize_is_size_t = true style = "tag" tab_width = 4
[parse] parse_deps = false ``` tab_width is the number of spaces, there is no option to use a tab character in cbindgen.
Show 20 quoted lines
> diff --git a/ci/install-dependencies.sh b/ci/install-dependencies.sh
> index b7b3cf35edf..3bce6f47f87 100755
> --- a/ci/install-dependencies.sh
> +++ b/ci/install-dependencies.sh
> @@ -37,7 +37,7 @@ fedora-*|almalinux-*)
> MESON_DEPS="meson ninja";;
> esac
> dnf -yq update >/dev/null &&
> - dnf -yq install shadow-utils sudo make pkg-config gcc findutils diffutils perl python3 gawk gettext zlib-devel expat-devel openssl-devel curl-devel pcre2-devel $MESON_DEPS cargo >/dev/null
> + dnf -yq install shadow-utils sudo make pkg-config gcc findutils diffutils perl python3 gawk gettext zlib-devel expat-devel openssl-devel curl-devel pcre2-devel $MESON_DEPS cargo cbindgen >/dev/null
> ;;
> ubuntu-*|i386/debian-*|debian-*)
> # Required so that apt doesn't wait for user input on certain packages.
> @@ -64,7 +64,7 @@ ubuntu-*|i386/debian-*|debian-*)
> make libssl-dev libcurl4-openssl-dev libexpat-dev wget sudo default-jre \
> tcl tk gettext zlib1g-dev perl-modules liberror-perl libauthen-sasl-perl \
> libemail-valid-perl libio-pty-perl libio-socket-ssl-perl libnet-smtp-ssl-perl libdbd-sqlite3-perl libcgi-pm-perl \
> - libsecret-1-dev libpcre2-dev meson ninja-build pkg-config cargo \
> + libsecret-1-dev libpcre2-dev meson ninja-build pkg-config cargo cbindgen \
> ${CC_PACKAGE:-${CC:-gcc}} $PYTHON_PACKAGEcbindgen is a Rust crate and it should be specified in the Cargo.toml under [build-dependencies] block. Also I think that we should convert from using a Cargo crate to using a Cargo workspace, so that we can generate multiple header files (1 per crate) rather than a monolithic generated header. This is because cbindgen operates at the granularity of a crate.