1
+ use std:: collections:: HashSet ;
1
2
use std:: env;
2
3
use std:: path:: PathBuf ;
3
4
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
+
4
49
fn main ( ) {
5
50
// Tell cargo to look for shared libraries in the specified directory
6
51
println ! ( "cargo:rustc-link-search=/usr/local/cplex/lib/x86-64_linux/static_pic" ) ;
@@ -19,6 +64,93 @@ fn main() {
19
64
// Tell cargo to invalidate the built crate whenever any of the
20
65
// included header files changed.
21
66
. 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" )
22
154
// Finish the builder and generate the bindings.
23
155
. generate ( )
24
156
// Unwrap the Result and panic on failure.
0 commit comments