Skip to content

Commit e79776f

Browse files
author
Matteo Biggio
committed
Ignore macros/define with colliding names and long double functions
See: * rust-lang/rust-bindgen#687 * rust-lang/rust-bindgen#1549
1 parent 401c38b commit e79776f

File tree

1 file changed

+132
-0
lines changed

1 file changed

+132
-0
lines changed

build.rs

Lines changed: 132 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,51 @@
1+
use std::collections::HashSet;
12
use std::env;
23
use std::path::PathBuf;
34

5+
use bindgen::callbacks::{MacroParsingBehavior, ParseCallbacks};
6+
7+
const IGNORE_MACROS: [&str; 20] = [
8+
"FE_DIVBYZERO",
9+
"FE_DOWNWARD",
10+
"FE_INEXACT",
11+
"FE_INVALID",
12+
"FE_OVERFLOW",
13+
"FE_TONEAREST",
14+
"FE_TOWARDZERO",
15+
"FE_UNDERFLOW",
16+
"FE_UPWARD",
17+
"FP_INFINITE",
18+
"FP_INT_DOWNWARD",
19+
"FP_INT_TONEAREST",
20+
"FP_INT_TONEARESTFROMZERO",
21+
"FP_INT_TOWARDZERO",
22+
"FP_INT_UPWARD",
23+
"FP_NAN",
24+
"FP_NORMAL",
25+
"FP_SUBNORMAL",
26+
"FP_ZERO",
27+
"IPPORT_RESERVED",
28+
];
29+
30+
#[derive(Debug)]
31+
struct IgnoreMacros(HashSet<String>);
32+
33+
impl ParseCallbacks for IgnoreMacros {
34+
fn will_parse_macro(&self, name: &str) -> MacroParsingBehavior {
35+
if self.0.contains(name) {
36+
MacroParsingBehavior::Ignore
37+
} else {
38+
MacroParsingBehavior::Default
39+
}
40+
}
41+
}
42+
43+
impl IgnoreMacros {
44+
fn new() -> Self {
45+
Self(IGNORE_MACROS.into_iter().map(|s| s.to_owned()).collect())
46+
}
47+
}
48+
449
fn main() {
550
// Tell cargo to look for shared libraries in the specified directory
651
println!("cargo:rustc-link-search=/usr/local/cplex/lib/x86-64_linux/static_pic");
@@ -19,6 +64,93 @@ fn main() {
1964
// Tell cargo to invalidate the built crate whenever any of the
2065
// included header files changed.
2166
.parse_callbacks(Box::new(bindgen::CargoCallbacks::new()))
67+
// See https://github.com/rust-lang/rust-bindgen/issues/687
68+
.parse_callbacks(Box::new(IgnoreMacros::new()))
69+
// Rust doesn't support long double, and bindgen can't skip it
70+
// https://github.com/rust-lang/rust-bindgen/issues/1549
71+
.blocklist_function("__fpclassifyl")
72+
.blocklist_function("__infl")
73+
.blocklist_function(".*acoshl")
74+
.blocklist_function(".*acosl")
75+
.blocklist_function(".*asinhl")
76+
.blocklist_function(".*asinl")
77+
.blocklist_function(".*atan2l")
78+
.blocklist_function(".*atanhl")
79+
.blocklist_function(".*atanl")
80+
.blocklist_function(".*cbrtl")
81+
.blocklist_function(".*ceill")
82+
.blocklist_function(".*copysignl")
83+
.blocklist_function(".*coshl")
84+
.blocklist_function(".*cosl")
85+
.blocklist_function(".*dreml")
86+
.blocklist_function(".*erfcl")
87+
.blocklist_function(".*erfl")
88+
.blocklist_function(".*exp2l")
89+
.blocklist_function(".*expl")
90+
.blocklist_function(".*expm1l")
91+
.blocklist_function(".*fabsl")
92+
.blocklist_function(".*fdiml")
93+
.blocklist_function(".*floorl")
94+
.blocklist_function(".*finitel")
95+
.blocklist_function(".*fmal")
96+
.blocklist_function(".*fmaxl")
97+
.blocklist_function(".*fminl")
98+
.blocklist_function(".*fmodl")
99+
.blocklist_function(".*frexpl")
100+
.blocklist_function(".*gammal")
101+
.blocklist_function(".*hypotl")
102+
.blocklist_function(".*ilogbl")
103+
.blocklist_function(".*j0l")
104+
.blocklist_function(".*j1l")
105+
.blocklist_function(".*jnl")
106+
.blocklist_function(".*ldexpl")
107+
.blocklist_function(".*lgammal")
108+
.blocklist_function(".*lgammal_r")
109+
.blocklist_function(".*llrintl")
110+
.blocklist_function(".*llroundl")
111+
.blocklist_function(".*iseqsigl")
112+
.blocklist_function(".*issignalingl")
113+
.blocklist_function(".*isinfl")
114+
.blocklist_function(".*log10l")
115+
.blocklist_function(".*log1pl")
116+
.blocklist_function(".*log2l")
117+
.blocklist_function(".*logbl")
118+
.blocklist_function(".*logl")
119+
.blocklist_function(".*lrintl")
120+
.blocklist_function(".*lroundl")
121+
.blocklist_function(".*modfl")
122+
.blocklist_function(".*nanl")
123+
.blocklist_function(".*nearbyintl")
124+
.blocklist_function(".*nextafterl")
125+
.blocklist_function(".*nexttoward")
126+
.blocklist_function(".*nexttowardf")
127+
.blocklist_function(".*nexttowardl")
128+
.blocklist_function(".*powl")
129+
.blocklist_function(".*qecvt")
130+
.blocklist_function(".*qecvt_r")
131+
.blocklist_function(".*qfcvt")
132+
.blocklist_function(".*qfcvt_r")
133+
.blocklist_function(".*qgcvt")
134+
.blocklist_function(".*remainderl")
135+
.blocklist_function(".*remquol")
136+
.blocklist_function(".*rintl")
137+
.blocklist_function(".*roundl")
138+
.blocklist_function(".*scalbl")
139+
.blocklist_function(".*scalblnl")
140+
.blocklist_function(".*scalbnl")
141+
.blocklist_function(".*signbitl")
142+
.blocklist_function(".*significandl")
143+
.blocklist_function(".*sinhl")
144+
.blocklist_function(".*sinl")
145+
.blocklist_function(".*sqrtl")
146+
.blocklist_function(".*strtold")
147+
.blocklist_function(".*tanhl")
148+
.blocklist_function(".*tanl")
149+
.blocklist_function(".*tgammal")
150+
.blocklist_function(".*truncl")
151+
.blocklist_function(".*y0l")
152+
.blocklist_function(".*y1l")
153+
.blocklist_function(".*ynl")
22154
// Finish the builder and generate the bindings.
23155
.generate()
24156
// Unwrap the Result and panic on failure.

0 commit comments

Comments
 (0)