Exclude va_list and functions using it from the bundled bindings file

This commit is contained in:
Thom Chiovoloni 2020-04-10 01:38:55 -07:00
parent 156fa9fcf2
commit 288aa961a7
3 changed files with 42 additions and 26 deletions

View File

@ -325,6 +325,18 @@ mod bindings {
} }
} }
// Are we generating the bundled bindings? Used to avoid emitting things
// that would be problematic in bundled builds. This env var is set by
// `upgrade.sh`.
fn generating_bundled_bindings() -> bool {
// Hacky way to know if we're generating the bundled bindings
println!("cargo:rerun-if-env-changed=LIBSQLITE3_SYS_BUNDLING");
match std::env::var("LIBSQLITE3_SYS_BUNDLING") {
Ok(v) if v != "0" => true,
_ => false,
}
}
pub fn write_to_out_dir(header: HeaderLocation, out_path: &Path) { pub fn write_to_out_dir(header: HeaderLocation, out_path: &Path) {
let header: String = header.into(); let header: String = header.into();
let mut output = Vec::new(); let mut output = Vec::new();
@ -343,6 +355,35 @@ mod bindings {
bindings = bindings.clang_arg("-DSQLITE_ENABLE_SESSION"); bindings = bindings.clang_arg("-DSQLITE_ENABLE_SESSION");
} }
// When cross compiling unless effort is taken to fix the issue, bindgen
// will find the wrong headers. There's only one header included by the
// amalgamated `sqlite.h`: `stdarg.h`.
//
// Thankfully, there's almost no case where rust code needs to use
// functions taking `va_list` (It's nearly impossible to get a `va_list`
// in Rust unless you get passed it by C code for some reason).
//
// Arguably, we should never be including these, but we include them for
// the cases where they aren't totally broken...
let target_arch = std::env::var("TARGET").unwrap();
let host_arch = std::env::var("HOST").unwrap();
let is_cross_compiling = target_arch != host_arch;
// Note that when generating the bundled file, we're essentially always
// cross compiling.
if generating_bundled_bindings() || is_cross_compiling {
// Get rid of va_list, as it's not
bindings = bindings
.blacklist_function("sqlite3_vmprintf")
.blacklist_function("sqlite3_vsnprintf")
.blacklist_function("sqlite3_str_vappendf")
.blacklist_type("va_list")
.blacklist_type("__builtin_va_list")
.blacklist_type("__gnuc_va_list")
.blacklist_type("__va_list_tag")
.blacklist_item("__GNUC_VA_LIST");
}
bindings bindings
.generate() .generate()
.unwrap_or_else(|_| panic!("could not run bindgen on header {}", header)) .unwrap_or_else(|_| panic!("could not run bindgen on header {}", header))

View File

@ -1,6 +1,5 @@
/* automatically generated by rust-bindgen */ /* automatically generated by rust-bindgen */
pub const __GNUC_VA_LIST: i32 = 1;
pub const SQLITE_VERSION: &'static [u8; 7usize] = b"3.31.0\0"; pub const SQLITE_VERSION: &'static [u8; 7usize] = b"3.31.0\0";
pub const SQLITE_VERSION_NUMBER: i32 = 3031000; pub const SQLITE_VERSION_NUMBER: i32 = 3031000;
pub const SQLITE_SOURCE_ID: &'static [u8; 85usize] = pub const SQLITE_SOURCE_ID: &'static [u8; 85usize] =
@ -437,8 +436,6 @@ pub const FTS5_TOKENIZE_PREFIX: i32 = 2;
pub const FTS5_TOKENIZE_DOCUMENT: i32 = 4; pub const FTS5_TOKENIZE_DOCUMENT: i32 = 4;
pub const FTS5_TOKENIZE_AUX: i32 = 8; pub const FTS5_TOKENIZE_AUX: i32 = 8;
pub const FTS5_TOKEN_COLOCATED: i32 = 1; pub const FTS5_TOKEN_COLOCATED: i32 = 1;
pub type va_list = __builtin_va_list;
pub type __gnuc_va_list = __builtin_va_list;
extern "C" { extern "C" {
pub static mut sqlite3_version: [::std::os::raw::c_char; 0usize]; pub static mut sqlite3_version: [::std::os::raw::c_char; 0usize];
} }
@ -1411,12 +1408,6 @@ extern "C" {
pub fn sqlite3_mprintf(arg1: *const ::std::os::raw::c_char, ...) pub fn sqlite3_mprintf(arg1: *const ::std::os::raw::c_char, ...)
-> *mut ::std::os::raw::c_char; -> *mut ::std::os::raw::c_char;
} }
extern "C" {
pub fn sqlite3_vmprintf(
arg1: *const ::std::os::raw::c_char,
arg2: va_list,
) -> *mut ::std::os::raw::c_char;
}
extern "C" { extern "C" {
pub fn sqlite3_snprintf( pub fn sqlite3_snprintf(
arg1: ::std::os::raw::c_int, arg1: ::std::os::raw::c_int,
@ -1425,14 +1416,6 @@ extern "C" {
... ...
) -> *mut ::std::os::raw::c_char; ) -> *mut ::std::os::raw::c_char;
} }
extern "C" {
pub fn sqlite3_vsnprintf(
arg1: ::std::os::raw::c_int,
arg2: *mut ::std::os::raw::c_char,
arg3: *const ::std::os::raw::c_char,
arg4: va_list,
) -> *mut ::std::os::raw::c_char;
}
extern "C" { extern "C" {
pub fn sqlite3_malloc(arg1: ::std::os::raw::c_int) -> *mut ::std::os::raw::c_void; pub fn sqlite3_malloc(arg1: ::std::os::raw::c_int) -> *mut ::std::os::raw::c_void;
} }
@ -3617,13 +3600,6 @@ extern "C" {
extern "C" { extern "C" {
pub fn sqlite3_str_appendf(arg1: *mut sqlite3_str, zFormat: *const ::std::os::raw::c_char, ...); pub fn sqlite3_str_appendf(arg1: *mut sqlite3_str, zFormat: *const ::std::os::raw::c_char, ...);
} }
extern "C" {
pub fn sqlite3_str_vappendf(
arg1: *mut sqlite3_str,
zFormat: *const ::std::os::raw::c_char,
arg2: va_list,
);
}
extern "C" { extern "C" {
pub fn sqlite3_str_append( pub fn sqlite3_str_append(
arg1: *mut sqlite3_str, arg1: *mut sqlite3_str,
@ -5217,4 +5193,3 @@ fn bindgen_test_layout_fts5_api() {
) )
); );
} }
pub type __builtin_va_list = *mut ::std::os::raw::c_char;

View File

@ -17,7 +17,7 @@ export SQLITE3_INCLUDE_DIR=$SQLITE3_LIB_DIR
cargo update cargo update
# Just to make sure there is only one bindgen.rs file in target dir # Just to make sure there is only one bindgen.rs file in target dir
find $SCRIPT_DIR/../target -type f -name bindgen.rs -exec rm {} \; find $SCRIPT_DIR/../target -type f -name bindgen.rs -exec rm {} \;
cargo build --features "buildtime_bindgen" --no-default-features env LIBSQLITE3_SYS_BUNDLING=1 cargo build --features "buildtime_bindgen" --no-default-features
find $SCRIPT_DIR/../target -type f -name bindgen.rs -exec cp {} $SQLITE3_LIB_DIR/bindgen_bundled_version.rs \; find $SCRIPT_DIR/../target -type f -name bindgen.rs -exec cp {} $SQLITE3_LIB_DIR/bindgen_bundled_version.rs \;
# Sanity check # Sanity check
cd $SCRIPT_DIR/.. cd $SCRIPT_DIR/..