aws-lc-fips-sys/builder/sys_bindgen.rs (17 lines of code) (raw):
// Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
// SPDX-License-Identifier: Apache-2.0 OR ISC
use crate::{get_rust_include_path, BindingOptions, COPYRIGHT, PRELUDE};
use bindgen::callbacks::{ItemInfo, ParseCallbacks};
use std::fmt::Debug;
use std::path::Path;
#[derive(Debug)]
struct StripPrefixCallback {
remove_prefix: Option<String>,
}
impl StripPrefixCallback {
fn new(prefix: &str) -> StripPrefixCallback {
StripPrefixCallback {
remove_prefix: Some(prefix.to_string()),
}
}
}
impl ParseCallbacks for StripPrefixCallback {
fn generated_name_override(&self, item_info: ItemInfo<'_>) -> Option<String> {
self.remove_prefix.as_ref().and_then(|s| {
let prefix = format!("{s}_");
item_info
.name
.strip_prefix(prefix.as_str())
.map(String::from)
})
}
}
fn prepare_bindings_builder(manifest_dir: &Path, options: &BindingOptions) -> bindgen::Builder {
let clang_args = crate::prepare_clang_args(manifest_dir, options);
let mut builder = bindgen::Builder::default()
.derive_copy(true)
.derive_debug(true)
.derive_default(true)
.derive_eq(true)
.allowlist_file(r".*(/|\\)openssl((/|\\)[^/\\]+)+\.h")
.allowlist_file(r".*(/|\\)rust_wrapper\.h")
.rustified_enum(r"point_conversion_form_t")
.default_macro_constant_type(bindgen::MacroTypeVariation::Signed)
.generate_comments(true)
.fit_macro_constants(false)
.size_t_is_usize(true)
.layout_tests(true)
.prepend_enum_name(true)
.formatter(bindgen::Formatter::Rustfmt)
.clang_args(clang_args)
.raw_line(COPYRIGHT)
.header(
get_rust_include_path(manifest_dir)
.join("rust_wrapper.h")
.display()
.to_string(),
)
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()));
if !options.disable_prelude {
builder = builder.raw_line(PRELUDE);
}
if options.include_ssl {
builder = builder.clang_arg("-DAWS_LC_RUST_INCLUDE_SSL");
}
if let Some(prefix) = &options.build_prefix {
let callbacks = StripPrefixCallback::new(prefix.as_str());
builder = builder.parse_callbacks(Box::new(callbacks));
}
builder
}
pub(crate) fn generate_bindings(
manifest_dir: &Path,
options: &BindingOptions,
) -> bindgen::Bindings {
prepare_bindings_builder(manifest_dir, options)
.generate()
.expect("Unable to generate bindings.")
}