Skip to content

Commit 97d9bcc

Browse files
committed
mbedtls-sys: generate code with a recent version of bindgen
This patch lets us compile mbedtls-sys with recent clang versions.
1 parent 2343470 commit 97d9bcc

File tree

2 files changed

+82
-37
lines changed

2 files changed

+82
-37
lines changed

mbedtls-sys/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ libc = { version = "0.2.0", optional = true }
2121
libz-sys = { version = "1.0.0", optional = true }
2222

2323
[build-dependencies]
24-
bindgen = "0.19.0"
24+
bindgen = "0.51.0"
2525
cmake = "0.1.17"
2626

2727
[features]

mbedtls-sys/build/bindgen.rs

Lines changed: 81 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -6,22 +6,60 @@
66
* option. This file may not be copied, modified, or distributed except
77
* according to those terms. */
88

9-
use bindgen;
10-
119
use std::fs::File;
12-
use std::io::{stderr, Write};
10+
use std::io::Write;
11+
12+
use bindgen;
13+
use bindgen::callbacks::IntKind;
1314

1415
use crate::headers;
1516

1617
#[derive(Debug)]
17-
struct StderrLogger;
18+
struct ParseCallback;
1819

19-
impl bindgen::Logger for StderrLogger {
20-
fn error(&self, msg: &str) {
21-
let _ = writeln!(stderr(), "Bindgen ERROR: {}", msg);
20+
impl bindgen::callbacks::ParseCallbacks for ParseCallback {
21+
fn int_macro(&self, name: &str, _value: i64) -> Option<IntKind> {
22+
if name.contains("MBEDTLS_") {
23+
Some(IntKind::I32)
24+
} else {
25+
None
26+
}
27+
}
28+
fn enum_variant_name(
29+
&self,
30+
_enum_name: Option<&str>,
31+
original_variant_name: &str,
32+
_variant_value: bindgen::callbacks::EnumVariantValue,
33+
) -> Option<String> {
34+
if original_variant_name.starts_with("MBEDTLS_") {
35+
Some(
36+
original_variant_name
37+
.trim_start_matches("MBEDTLS_")
38+
.to_string(),
39+
)
40+
} else {
41+
None
42+
}
2243
}
23-
fn warn(&self, msg: &str) {
24-
let _ = writeln!(stderr(), "Bindgen WARNING: {}", msg);
44+
45+
fn item_name(&self, original_item_name: &str) -> Option<String> {
46+
if original_item_name.eq("mbedtls_time_t") {
47+
Some(original_item_name.to_string())
48+
} else if original_item_name.starts_with("mbedtls_") {
49+
Some(
50+
original_item_name
51+
.trim_start_matches("mbedtls_")
52+
.to_string(),
53+
)
54+
} else if original_item_name.starts_with("MBEDTLS_") {
55+
Some(
56+
original_item_name
57+
.trim_start_matches("MBEDTLS_")
58+
.to_string(),
59+
)
60+
} else {
61+
None
62+
}
2563
}
2664
}
2765

@@ -33,49 +71,56 @@ impl super::BuildConfig {
3371
Ok(for h in headers::enabled_ordered() {
3472
writeln!(f, "#include <mbedtls/{}>", h)?;
3573
})
36-
}).expect("bindgen-input.h I/O error");
74+
})
75+
.expect("bindgen-input.h I/O error");
3776

3877
let include = self.mbedtls_src.join("include");
3978

40-
let logger = StderrLogger;
41-
let mut bindgen = bindgen::Builder::new(header.into_os_string().into_string().unwrap());
42-
let bindings = bindgen
43-
.log(&logger)
79+
let bindings = bindgen::Builder::default()
80+
.header(header.into_os_string().into_string().unwrap())
4481
.clang_arg("-Dmbedtls_t_udbl=mbedtls_t_udbl;") // bindgen can't handle unused uint128
4582
.clang_arg(format!(
4683
"-DMBEDTLS_CONFIG_FILE=<{}>",
4784
self.config_h.to_str().expect("config.h UTF-8 error")
48-
)).clang_arg(format!(
85+
))
86+
.clang_arg(format!(
4987
"-I{}",
5088
include.to_str().expect("include/ UTF-8 error")
51-
)).match_pat(include.to_str().expect("include/ UTF-8 error"))
52-
.match_pat(self.config_h.to_str().expect("config.h UTF-8 error"))
53-
.use_core(true)
89+
))
90+
.use_core()
5491
.derive_debug(false) // buggy :(
55-
.ctypes_prefix(vec!["types".to_owned(), "raw_types".to_owned()])
56-
.remove_prefix("mbedtls_")
57-
.rust_enums(false)
58-
.convert_macros(true)
59-
.macro_int_types(
60-
vec![
61-
"sint",
62-
"sint",
63-
"sint",
64-
"slonglong",
65-
"sint",
66-
"sint",
67-
"sint",
68-
"slonglong",
69-
].into_iter(),
70-
).generate()
92+
.parse_callbacks(Box::new(ParseCallback))
93+
.ctypes_prefix("crate::types::raw_types")
94+
.blacklist_function("strtold")
95+
.blacklist_function("qecvt_r")
96+
.blacklist_function("qecvt")
97+
.blacklist_function("qfcvt_r")
98+
.blacklist_function("qgcvt")
99+
.blacklist_function("qfcvt")
100+
.opaque_type("std::*")
101+
.opaque_type("time_t")
102+
.generate_comments(false)
103+
.prepend_enum_name(false)
104+
.generate()
71105
.expect("bindgen error");
72106

73107
let bindings_rs = self.out_dir.join("bindings.rs");
74108
File::create(&bindings_rs)
75109
.and_then(|mut f| {
110+
f.write_all(br#"
111+
#![allow(nonstandard_style)]
112+
#![allow(unused_imports)]
113+
"#)?;
114+
76115
bindings.write(Box::new(&mut f))?;
77-
f.write_all(b"use crate::types::*;\n") // for FILE, time_t, etc.
78-
}).expect("bindings.rs I/O error");
116+
117+
f.write_all(br#"
118+
// for FILE, time_t, etc.
119+
use crate::types::*;
120+
"#)
121+
122+
})
123+
.expect("bindings.rs I/O error");
79124

80125
let mod_bindings = self.out_dir.join("mod-bindings.rs");
81126
File::create(&mod_bindings)

0 commit comments

Comments
 (0)