Browse Source

Don't generate <sys/...> bindings

Also fix some minor clippy lints + document the helper script a bit
more.
pull/10/head
Ian Chamberlain 2 years ago
parent
commit
e26d01f782
No known key found for this signature in database
GPG Key ID: AE5484D09405AA60
  1. 1
      bindgen-citro3d/Cargo.toml
  2. 18
      bindgen-citro3d/src/main.rs
  3. 2
      citro3d-sys/build.rs
  4. 201
      citro3d-sys/src/bindings.rs

1
bindgen-citro3d/Cargo.toml

@ -2,6 +2,7 @@ @@ -2,6 +2,7 @@
name = "bindgen-citro3d"
version = "0.1.0"
edition = "2021"
description = "Helper tool to generate citro3d-sys bindings."
[dependencies]
bindgen = "0.62.0"

18
bindgen-citro3d/src/main.rs

@ -1,3 +1,7 @@ @@ -1,3 +1,7 @@
//! This is meant to be run as a "script" to generate bindings to `citro3d`.
//! We use this instead of `bindgen-cli` to enable the use of [`CustomCallbacks`]
//! with [`bindgen`] as a library for finer grained control of the bindings.
use std::iter::FromIterator;
use std::path::PathBuf;
@ -8,7 +12,7 @@ fn main() { @@ -8,7 +12,7 @@ fn main() {
let devkitpro = std::env::var("DEVKITPRO").expect("DEVKITPRO not set in environment");
let devkitarm = std::env::var("DEVKITARM").expect("DEVKITARM not set in environment");
let include_path = PathBuf::from(devkitpro).join(PathBuf::from_iter(["libctru", "include"]));
let include_path = PathBuf::from_iter([devkitpro.as_str(), "libctru", "include"]);
let header = include_path.join("tex3ds.h");
let sysroot = PathBuf::from(devkitarm).join("arm-none-eabi");
@ -25,13 +29,13 @@ fn main() { @@ -25,13 +29,13 @@ fn main() {
.fit_macro_constants(true)
.raw_line("use ctru_sys::*;")
.must_use_type("Result")
// TODO functions,types,vars
.blocklist_type("u(8|16|32|64)")
.opaque_type("(GPU|GFX)_.*")
.opaque_type("float24Uniform_s")
.blocklist_file(".*/3ds/.*[.]h")
.allowlist_file(".*/c3d/.*[.]h")
.allowlist_file(".*/tex3ds[.]h")
.blocklist_file(".*/3ds/.*[.]h")
.blocklist_file(".*/sys/.*[.]h")
.clang_args([
"--target=arm-none-eabi",
"--sysroot",
@ -57,6 +61,14 @@ fn main() { @@ -57,6 +61,14 @@ fn main() {
.expect("failed to write bindings");
}
/// Custom callback struct to allow us to mark some "known good types" as
/// [`Copy`], which in turn allows using Rust `union` instead of bindgen union
/// types. See
/// <https://rust-lang.github.io/rust-bindgen/using-unions.html#which-union-type-will-bindgen-generate>
/// for more info.
///
/// We do the same for [`Debug`] just for the convenience of derived Debug impls
/// on some `citro3d` types.
#[derive(Debug)]
struct CustomCallbacks;

2
citro3d-sys/build.rs

@ -6,7 +6,7 @@ fn main() { @@ -6,7 +6,7 @@ fn main() {
println!("cargo:rerun-if-changed=build.rs");
println!("cargo:rerun-if-env-changed=DEVKITPRO");
println!("cargo:rustc-link-search=native={}/libctru/lib", dkp_path);
println!("cargo:rustc-link-search=native={dkp_path}/libctru/lib");
println!(
"cargo:rustc-link-lib=static={}",
match debug_symbols.as_str() {

201
citro3d-sys/src/bindings.rs

@ -92,210 +92,9 @@ pub const C3D_DEFAULT_CMDBUF_SIZE: u32 = 262144; @@ -92,210 +92,9 @@ pub const C3D_DEFAULT_CMDBUF_SIZE: u32 = 262144;
pub const C3DF_LightEnv_IsCP_Any: u32 = 66846720;
pub const C3DF_LightEnv_LutDirtyAll: u32 = 4227858432;
pub type __int64_t = ::libc::c_longlong;
pub type _LOCK_T = i32;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __lock_t {
pub lock: _LOCK_T,
pub thread_tag: u32,
pub counter: u32,
}
pub type _LOCK_RECURSIVE_T = __lock_t;
pub type _off_t = __int64_t;
pub type _fpos_t = __int64_t;
pub type wint_t = ::libc::c_int;
#[repr(C)]
#[derive(Copy, Clone)]
pub struct _mbstate_t {
pub __count: ::libc::c_int,
pub __value: _mbstate_t__bindgen_ty_1,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union _mbstate_t__bindgen_ty_1 {
pub __wch: wint_t,
pub __wchb: [::libc::c_uchar; 4usize],
}
pub type __ULong = ::libc::c_ulong;
pub type _flock_t = _LOCK_RECURSIVE_T;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __locale_t {
_unused: [u8; 0],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct _Bigint {
pub _next: *mut _Bigint,
pub _k: ::libc::c_int,
pub _maxwds: ::libc::c_int,
pub _sign: ::libc::c_int,
pub _wds: ::libc::c_int,
pub _x: [__ULong; 1usize],
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __tm {
pub __tm_sec: ::libc::c_int,
pub __tm_min: ::libc::c_int,
pub __tm_hour: ::libc::c_int,
pub __tm_mday: ::libc::c_int,
pub __tm_mon: ::libc::c_int,
pub __tm_year: ::libc::c_int,
pub __tm_wday: ::libc::c_int,
pub __tm_yday: ::libc::c_int,
pub __tm_isdst: ::libc::c_int,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct _on_exit_args {
pub _fnargs: [*mut ::libc::c_void; 32usize],
pub _dso_handle: [*mut ::libc::c_void; 32usize],
pub _fntypes: __ULong,
pub _is_cxa: __ULong,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct _atexit {
pub _next: *mut _atexit,
pub _ind: ::libc::c_int,
pub _fns: [::core::option::Option<unsafe extern "C" fn()>; 32usize],
pub _on_exit_args: _on_exit_args,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct __sbuf {
pub _base: *mut ::libc::c_uchar,
pub _size: ::libc::c_int,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct __sFILE {
pub _p: *mut ::libc::c_uchar,
pub _r: ::libc::c_int,
pub _w: ::libc::c_int,
pub _flags: ::libc::c_short,
pub _file: ::libc::c_short,
pub _bf: __sbuf,
pub _lbfsize: ::libc::c_int,
pub _cookie: *mut ::libc::c_void,
pub _read: ::core::option::Option<
unsafe extern "C" fn(
arg1: *mut _reent,
arg2: *mut ::libc::c_void,
arg3: *mut ::libc::c_char,
arg4: ::libc::c_int,
) -> ::libc::c_int,
>,
pub _write: ::core::option::Option<
unsafe extern "C" fn(
arg1: *mut _reent,
arg2: *mut ::libc::c_void,
arg3: *const ::libc::c_char,
arg4: ::libc::c_int,
) -> ::libc::c_int,
>,
pub _seek: ::core::option::Option<
unsafe extern "C" fn(
arg1: *mut _reent,
arg2: *mut ::libc::c_void,
arg3: _fpos_t,
arg4: ::libc::c_int,
) -> _fpos_t,
>,
pub _close: ::core::option::Option<
unsafe extern "C" fn(arg1: *mut _reent, arg2: *mut ::libc::c_void) -> ::libc::c_int,
>,
pub _ub: __sbuf,
pub _up: *mut ::libc::c_uchar,
pub _ur: ::libc::c_int,
pub _ubuf: [::libc::c_uchar; 3usize],
pub _nbuf: [::libc::c_uchar; 1usize],
pub _lb: __sbuf,
pub _blksize: ::libc::c_int,
pub _offset: _off_t,
pub _data: *mut _reent,
pub _lock: _flock_t,
pub _mbstate: _mbstate_t,
pub _flags2: ::libc::c_int,
}
pub type __FILE = __sFILE;
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct _glue {
pub _next: *mut _glue,
pub _niobs: ::libc::c_int,
pub _iobs: *mut __FILE,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct _rand48 {
pub _seed: [::libc::c_ushort; 3usize],
pub _mult: [::libc::c_ushort; 3usize],
pub _add: ::libc::c_ushort,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct _reent {
pub _errno: ::libc::c_int,
pub _stdin: *mut __FILE,
pub _stdout: *mut __FILE,
pub _stderr: *mut __FILE,
pub _inc: ::libc::c_int,
pub _emergency: [::libc::c_char; 25usize],
pub _unspecified_locale_info: ::libc::c_int,
pub _locale: *mut __locale_t,
pub __sdidinit: ::libc::c_int,
pub __cleanup: ::core::option::Option<unsafe extern "C" fn(arg1: *mut _reent)>,
pub _result: *mut _Bigint,
pub _result_k: ::libc::c_int,
pub _p5s: *mut _Bigint,
pub _freelist: *mut *mut _Bigint,
pub _cvtlen: ::libc::c_int,
pub _cvtbuf: *mut ::libc::c_char,
pub _new: _reent__bindgen_ty_1,
pub _atexit: *mut _atexit,
pub _atexit0: _atexit,
pub _sig_func: *mut ::core::option::Option<unsafe extern "C" fn(arg1: ::libc::c_int)>,
pub __sglue: _glue,
pub __sf: [__FILE; 3usize],
pub deviceData: *mut ::libc::c_void,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub union _reent__bindgen_ty_1 {
pub _reent: _reent__bindgen_ty_1__bindgen_ty_1,
pub _unused: _reent__bindgen_ty_1__bindgen_ty_2,
}
#[repr(C)]
#[derive(Copy, Clone)]
pub struct _reent__bindgen_ty_1__bindgen_ty_1 {
pub _unused_rand: ::libc::c_uint,
pub _strtok_last: *mut ::libc::c_char,
pub _asctime_buf: [::libc::c_char; 26usize],
pub _localtime_buf: __tm,
pub _gamma_signgam: ::libc::c_int,
pub _rand_next: ::libc::c_ulonglong,
pub _r48: _rand48,
pub _mblen_state: _mbstate_t,
pub _mbtowc_state: _mbstate_t,
pub _wctomb_state: _mbstate_t,
pub _l64a_buf: [::libc::c_char; 8usize],
pub _signal_buf: [::libc::c_char; 24usize],
pub _getdate_err: ::libc::c_int,
pub _mbrlen_state: _mbstate_t,
pub _mbrtowc_state: _mbstate_t,
pub _mbsrtowcs_state: _mbstate_t,
pub _wcrtomb_state: _mbstate_t,
pub _wcsrtombs_state: _mbstate_t,
pub _h_errno: ::libc::c_int,
}
#[repr(C)]
#[derive(Debug, Copy, Clone)]
pub struct _reent__bindgen_ty_1__bindgen_ty_2 {
pub _nextf: [*mut ::libc::c_uchar; 30usize],
pub _nmalloc: [::libc::c_uint; 30usize],
}
pub type C3D_IVec = u32_;
#[doc = " @struct C3D_FVec"]
#[doc = " @brief Float vector"]

Loading…
Cancel
Save