Description
In https://github.com/nbigaouette/onnxruntime-rs I use bindgen in onnxruntime-sys/build.rs
to generate bindings on different platforms (macos, linux, windows).
The original C header file is https://github.com/microsoft/onnxruntime/blob/v1.5.2/include/onnxruntime/core/session/onnxruntime_c_api.h (which is quite large).
This header contains a couple of enums, for example OrtLoggingLevel
that gets wrapper as u32
: https://docs.rs/onnxruntime-sys/0.0.9/onnxruntime_sys/type.OrtLoggingLevel.html
But on Windows, I get i32
s for them (docs.rs doesn't contain windows values, yet).
Because of this I have trouble creating an API that can work both on Windows an other platforms.
Input C/C++ Header
#include "onnxruntime_c_api.h"
typedef enum OrtLoggingLevel {
ORT_LOGGING_LEVEL_VERBOSE,
ORT_LOGGING_LEVEL_INFO,
ORT_LOGGING_LEVEL_WARNING,
ORT_LOGGING_LEVEL_ERROR,
ORT_LOGGING_LEVEL_FATAL,
} OrtLoggingLevel;
Bindgen Invocation
On macOS:
$ bindgen onnxruntime-sys/wrapper.h --whitelist-type OrtLoggingLevel -- -I target/debug/build/onnxruntime-sys-4dd6b75a91cb40e3/out/onnxruntime/onnxruntime-osx-x64-1.5.2/include
On Windows:
$ bindgen onnxruntime-sys/wrapper.h --whitelist-type OrtLoggingLevel -- -I C:\cargo_target\debug\b
uild\onnxruntime-sys-6a0af3699f92fd5c\out\onnxruntime\onnxruntime-win-x64-1.5.2\include
Actual Results
On macOS:
/* automatically generated by rust-bindgen 0.55.1 */
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_VERBOSE: OrtLoggingLevel = 0;
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_INFO: OrtLoggingLevel = 1;
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_WARNING: OrtLoggingLevel = 2;
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_ERROR: OrtLoggingLevel = 3;
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_FATAL: OrtLoggingLevel = 4;
pub type OrtLoggingLevel = ::std::os::raw::c_uint;
On Windows:
/* automatically generated by rust-bindgen 0.55.1 */
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_VERBOSE: OrtLoggingLevel = 0;
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_INFO: OrtLoggingLevel = 1;
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_WARNING: OrtLoggingLevel = 2;
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_ERROR: OrtLoggingLevel = 3;
pub const OrtLoggingLevel_ORT_LOGGING_LEVEL_FATAL: OrtLoggingLevel = 4;
pub type OrtLoggingLevel = ::std::os::raw::c_int;
Using --rustified-enum="*"
I get:
❯ bindgen onnxruntime-sys/wrapper.h --rustified-enum="*" --whitelist-type OrtLoggingLevel -- -I target/debug/build/onnxruntime-sys-4dd6b75a91cb40e3/out/onnxruntime/onnxruntime-osx-x64-1.5.2/include
/* automatically generated by rust-bindgen 0.55.1 */
#[repr(u32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum OrtLoggingLevel {
ORT_LOGGING_LEVEL_VERBOSE = 0,
ORT_LOGGING_LEVEL_INFO = 1,
ORT_LOGGING_LEVEL_WARNING = 2,
ORT_LOGGING_LEVEL_ERROR = 3,
ORT_LOGGING_LEVEL_FATAL = 4,
}
PS Microsoft.PowerShell.Core\FileSystem::\\VBOXSVR\onnxruntime> bindgen onnxruntime-sys/wrapper.h --rustified-enum="*" --whitelist-type OrtLoggingLevel -- -I C:
\cargo_target\debug\build\onnxruntime-sys-6a0af3699f92fd5c\out\onnxruntime\onnxruntime-win-x64-1.5.2\include
/* automatically generated by rust-bindgen 0.55.1 */
#[repr(i32)]
#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)]
pub enum OrtLoggingLevel {
ORT_LOGGING_LEVEL_VERBOSE = 0,
ORT_LOGGING_LEVEL_INFO = 1,
ORT_LOGGING_LEVEL_WARNING = 2,
ORT_LOGGING_LEVEL_ERROR = 3,
ORT_LOGGING_LEVEL_FATAL = 4,
}
Expected Results
Note how macOS gives me a std::os::raw::c_uint
and Windows gives me a std::os::raw::c_int
(or #[repr(u32)]
vs #[repr(i32)]
) for the enum representation.
Why does bindgen generates different code on macOS/Linux and Windows? Can I tell bindgen to use std::os::raw::c_int
everywhere? Or i64
, or whatever else?
Thank you!