From 70b5431888d6eb036e6e20bdfd82a45a787e9d32 Mon Sep 17 00:00:00 2001 From: qinghon Date: Tue, 22 Apr 2025 23:36:39 +0800 Subject: [PATCH 1/2] support manual setup constants int type by name prefix And allowed we have known defined constants --- openssl-sys/Cargo.toml | 2 ++ openssl-sys/build/run_bindgen.rs | 44 +++++++++++++++++++++++++++++--- 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/openssl-sys/Cargo.toml b/openssl-sys/Cargo.toml index a38da8468..0f5f2058d 100644 --- a/openssl-sys/Cargo.toml +++ b/openssl-sys/Cargo.toml @@ -31,6 +31,8 @@ cc = "1.0.61" openssl-src = { version = "300.2.0", optional = true, features = ["legacy"] } pkg-config = "0.3.9" vcpkg = "0.2.8" +regex = "1" +once_cell = "1" # We don't actually use metadeps for annoying reasons but this is still here for tooling [package.metadata.pkg-config] diff --git a/openssl-sys/build/run_bindgen.rs b/openssl-sys/build/run_bindgen.rs index cc0efd8b5..7d767d057 100644 --- a/openssl-sys/build/run_bindgen.rs +++ b/openssl-sys/build/run_bindgen.rs @@ -7,6 +7,10 @@ use std::path::PathBuf; #[cfg(not(feature = "bindgen"))] use std::process; use std::{env, fs}; +#[cfg(feature = "bindgen")] +use once_cell::sync::OnceCell; +#[cfg(feature = "bindgen")] +use bindgen::callbacks::IntKind; const INCLUDES: &str = " #include @@ -74,10 +78,33 @@ const INCLUDES: &str = " #endif "; + +#[cfg(feature = "bindgen")] +static MACRO_PREFIX_KIND: OnceCell> = OnceCell::new(); + +#[cfg(feature = "bindgen")] +fn setup_prefix_kind() { + let kinds = vec![ + (regex::Regex::new(r"^OPENSSL_INIT_.+").unwrap(), IntKind::U64), + (regex::Regex::new(r"^(SSL_CTRL|CRYPTO_EX_INDEX|NID|EVP|X509_FILETYPE|SSL_FILETYPE|SSL3_AD|TLS1_AD)_.+").unwrap(), IntKind::Int), + (regex::Regex::new(r"^SSL_VERIFY_.+").unwrap(), IntKind::Int), + (regex::Regex::new(r"^OPENSSL_VERSION").unwrap(), IntKind::Int), + ]; + let _ = MACRO_PREFIX_KIND.get_or_init(|| kinds); +} +#[cfg(feature = "bindgen")] +fn match_prefix_kine(name: &str) -> Option { + let kinds = MACRO_PREFIX_KIND.get()?; + + kinds.iter() + .find(|&(re, _)| re.is_match(name)) + .map(|(_, kind)| *kind) +} + #[cfg(feature = "bindgen")] pub fn run(include_dirs: &[PathBuf]) { let out_dir = PathBuf::from(env::var_os("OUT_DIR").unwrap()); - + setup_prefix_kind(); let mut builder = bindgen::builder() .parse_callbacks(Box::new(OpensslCallbacks)) .rust_target(RustTarget::Stable_1_47) @@ -350,8 +377,19 @@ struct OpensslCallbacks; #[cfg(feature = "bindgen")] impl ParseCallbacks for OpensslCallbacks { // for now we'll continue hand-writing constants - fn will_parse_macro(&self, _name: &str) -> MacroParsingBehavior { - MacroParsingBehavior::Ignore + fn will_parse_macro(&self, name: &str) -> MacroParsingBehavior { + if let Some(_) = match_prefix_kine(name) { + MacroParsingBehavior::Default + }else { + MacroParsingBehavior::Ignore + } + } + fn int_macro(&self, name: &str, _value: i64) -> Option { + if let Some(kind) = match_prefix_kine(name) { + return Some(kind) + } + // auto + None } fn item_name(&self, original_item_name: &str) -> Option { From 352dcd9f58337e82316232d2074d3838b6fb4a78 Mon Sep 17 00:00:00 2001 From: qinghon Date: Tue, 22 Apr 2025 23:40:45 +0800 Subject: [PATCH 2/2] fix rustfmt --- openssl-sys/build/run_bindgen.rs | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/openssl-sys/build/run_bindgen.rs b/openssl-sys/build/run_bindgen.rs index 7d767d057..6ab39ac41 100644 --- a/openssl-sys/build/run_bindgen.rs +++ b/openssl-sys/build/run_bindgen.rs @@ -1,16 +1,16 @@ #[cfg(feature = "bindgen")] +use bindgen::callbacks::IntKind; +#[cfg(feature = "bindgen")] use bindgen::callbacks::{MacroParsingBehavior, ParseCallbacks}; #[cfg(feature = "bindgen")] use bindgen::{MacroTypeVariation, RustTarget}; +#[cfg(feature = "bindgen")] +use once_cell::sync::OnceCell; use std::io::Write; use std::path::PathBuf; #[cfg(not(feature = "bindgen"))] use std::process; use std::{env, fs}; -#[cfg(feature = "bindgen")] -use once_cell::sync::OnceCell; -#[cfg(feature = "bindgen")] -use bindgen::callbacks::IntKind; const INCLUDES: &str = " #include @@ -78,7 +78,6 @@ const INCLUDES: &str = " #endif "; - #[cfg(feature = "bindgen")] static MACRO_PREFIX_KIND: OnceCell> = OnceCell::new(); @@ -96,7 +95,8 @@ fn setup_prefix_kind() { fn match_prefix_kine(name: &str) -> Option { let kinds = MACRO_PREFIX_KIND.get()?; - kinds.iter() + kinds + .iter() .find(|&(re, _)| re.is_match(name)) .map(|(_, kind)| *kind) } @@ -380,13 +380,13 @@ impl ParseCallbacks for OpensslCallbacks { fn will_parse_macro(&self, name: &str) -> MacroParsingBehavior { if let Some(_) = match_prefix_kine(name) { MacroParsingBehavior::Default - }else { + } else { MacroParsingBehavior::Ignore } } fn int_macro(&self, name: &str, _value: i64) -> Option { if let Some(kind) = match_prefix_kine(name) { - return Some(kind) + return Some(kind); } // auto None