127 lines
4.0 KiB
Rust
127 lines
4.0 KiB
Rust
extern crate ctest;
|
|
|
|
use std::env;
|
|
|
|
fn main() {
|
|
let mut cfg = ctest::TestGenerator::new();
|
|
let target = env::var("TARGET").unwrap();
|
|
|
|
cfg.include("../openssl-sys/deps/boringssl/src/include");
|
|
|
|
// Needed to get OpenSSL to correctly undef symbols that are already on
|
|
// Windows like X509_NAME
|
|
if target.contains("windows") {
|
|
cfg.header("windows.h");
|
|
|
|
// weird "different 'const' qualifiers" error on Windows, maybe a cl.exe
|
|
// thing?
|
|
if target.contains("msvc") {
|
|
cfg.flag("/wd4090");
|
|
}
|
|
|
|
// https://github.com/sfackler/rust-openssl/issues/889
|
|
cfg.define("WIN32_LEAN_AND_MEAN", None);
|
|
}
|
|
|
|
let mut cfgs = vec![];
|
|
|
|
cfgs.push("ossl101");
|
|
cfgs.push("ossl102");
|
|
cfgs.push("ossl102f");
|
|
cfgs.push("ossl102h");
|
|
cfgs.push("ossl110");
|
|
cfgs.push("ossl110f");
|
|
|
|
for c in cfgs {
|
|
cfg.cfg(c, None);
|
|
}
|
|
|
|
cfg.header("openssl/dh.h")
|
|
.header("openssl/ossl_typ.h")
|
|
.header("openssl/stack.h")
|
|
.header("openssl/x509.h")
|
|
.header("openssl/bio.h")
|
|
.header("openssl/x509v3.h")
|
|
.header("openssl/safestack.h")
|
|
.header("openssl/hmac.h")
|
|
.header("openssl/ssl.h")
|
|
.header("openssl/err.h")
|
|
.header("openssl/rand.h")
|
|
.header("openssl/pkcs12.h")
|
|
.header("openssl/bn.h")
|
|
.header("openssl/aes.h")
|
|
.header("openssl/evp.h")
|
|
.header("openssl/x509_vfy.h");
|
|
|
|
#[allow(clippy::if_same_then_else)]
|
|
cfg.type_name(|s, is_struct, _is_union| {
|
|
// Add some `*` on some callback parameters to get function pointer to
|
|
// typecheck in C, especially on MSVC.
|
|
if s == "PasswordCallback" {
|
|
"pem_password_cb*".to_string()
|
|
} else if s == "bio_info_cb" {
|
|
"bio_info_cb*".to_string()
|
|
} else if s == "_STACK" {
|
|
"struct stack_st".to_string()
|
|
// This logic should really be cleaned up
|
|
} else if is_struct
|
|
&& s != "point_conversion_form_t"
|
|
&& s.chars().next().unwrap().is_lowercase()
|
|
{
|
|
format!("struct {}", s)
|
|
} else if s.starts_with("stack_st_") {
|
|
format!("struct {}", s)
|
|
} else {
|
|
s.to_string()
|
|
}
|
|
});
|
|
cfg.skip_type(|s| {
|
|
// function pointers are declared without a `*` in openssl so their
|
|
// sizeof is 1 which isn't what we want.
|
|
s == "PasswordCallback"
|
|
|| s == "pem_password_cb"
|
|
|| s == "bio_info_cb"
|
|
|| s.starts_with("CRYPTO_EX_")
|
|
});
|
|
cfg.skip_struct(|s| {
|
|
s == "ProbeResult" || s == "X509_OBJECT_data" // inline union
|
|
});
|
|
cfg.skip_fn(move |s| {
|
|
s == "CRYPTO_memcmp" || // uses volatile
|
|
|
|
// Skip some functions with function pointers on windows, not entirely
|
|
// sure how to get them to work out...
|
|
(target.contains("windows") && {
|
|
s.starts_with("PEM_read_bio_") ||
|
|
(s.starts_with("PEM_write_bio_") && s.ends_with("PrivateKey")) ||
|
|
s == "d2i_PKCS8PrivateKey_bio" ||
|
|
s == "SSL_get_ex_new_index" ||
|
|
s == "SSL_CTX_get_ex_new_index" ||
|
|
s == "CRYPTO_get_ex_new_index"
|
|
})
|
|
});
|
|
cfg.skip_field_type(|s, field| {
|
|
(s == "EVP_PKEY" && field == "pkey") || // union
|
|
(s == "GENERAL_NAME" && field == "d") || // union
|
|
(s == "X509_OBJECT" && field == "data") // union
|
|
});
|
|
cfg.skip_signededness(|s| {
|
|
s.ends_with("_cb")
|
|
|| s.ends_with("_CB")
|
|
|| s.ends_with("_cb_fn")
|
|
|| s.starts_with("CRYPTO_")
|
|
|| s == "PasswordCallback"
|
|
|| s.ends_with("_cb_func")
|
|
|| s.ends_with("_cb_ex")
|
|
});
|
|
cfg.field_name(|_s, field| {
|
|
if field == "type_" {
|
|
"type".to_string()
|
|
} else {
|
|
field.to_string()
|
|
}
|
|
});
|
|
cfg.fn_cname(|rust, link_name| link_name.unwrap_or(rust).to_string());
|
|
cfg.generate("../openssl-sys/src/lib.rs", "all.rs");
|
|
}
|