Skip to content
Snippets Groups Projects
  • gnzlbg's avatar
    a17a91cd
    Fix build on all platforms · a17a91cd
    gnzlbg authored
    This PR fixes the build on all platforms and all Rust version down to the
    minimum Rust version supported by libc: Rust 1.13.0.
    
    The `build.rs` is extended with logic to detect the newer Rust features used by
    `libc` since Rust 1.13.0:
    
    * Rust 1.19.0: `untagged_unions`. APIs using untagged unions are gated on
      `cfg(libc_unions)` and not available on older Rust versions.
    
    * Rust 1.25.0: `repr(align)`. Because `repr(align)` cannot be parsed by older
      Rust versions, all uses of `repr(align)` are split into `align.rs` and
      `no_align.rs` modules, which are gated on the `cfg(libc_align)` at the top
      level. These modules sometimes contain macros that are expanded at the top
      level to avoid privacy issues (`pub(crate)` is not available in older Rust
      versions). Closes #1242 .
    
    * Rust : `const` `mem::size_of`. These uses are worked around with hardcoded
      constants on older Rust versions.
    
    Also, `repr(packed)` structs cannot automatically `derive()` some traits like
    `Debug`. These have been moved into `s_no_extra_traits!` and the lint of missing
    `Debug` implementations on public items is silenced for these. We can manually
    implement the `extra_traits` for these in a follow up PR. This is tracked
    in #1243. Also, `extra_traits` does not enable `align` manually anymore.
    
    Since `f64::to_bits` is not available in older Rust versions, its usage
    has been replaced with a `transmute` to an `u64` which is what that method
    does under the hood.
    
    Closes #1232 .
    a17a91cd
    History
    Fix build on all platforms
    gnzlbg authored
    This PR fixes the build on all platforms and all Rust version down to the
    minimum Rust version supported by libc: Rust 1.13.0.
    
    The `build.rs` is extended with logic to detect the newer Rust features used by
    `libc` since Rust 1.13.0:
    
    * Rust 1.19.0: `untagged_unions`. APIs using untagged unions are gated on
      `cfg(libc_unions)` and not available on older Rust versions.
    
    * Rust 1.25.0: `repr(align)`. Because `repr(align)` cannot be parsed by older
      Rust versions, all uses of `repr(align)` are split into `align.rs` and
      `no_align.rs` modules, which are gated on the `cfg(libc_align)` at the top
      level. These modules sometimes contain macros that are expanded at the top
      level to avoid privacy issues (`pub(crate)` is not available in older Rust
      versions). Closes #1242 .
    
    * Rust : `const` `mem::size_of`. These uses are worked around with hardcoded
      constants on older Rust versions.
    
    Also, `repr(packed)` structs cannot automatically `derive()` some traits like
    `Debug`. These have been moved into `s_no_extra_traits!` and the lint of missing
    `Debug` implementations on public items is silenced for these. We can manually
    implement the `extra_traits` for these in a follow up PR. This is tracked
    in #1243. Also, `extra_traits` does not enable `align` manually anymore.
    
    Since `f64::to_bits` is not available in older Rust versions, its usage
    has been replaced with a `transmute` to an `u64` which is what that method
    does under the hood.
    
    Closes #1232 .
switch.rs 1.43 KiB
//! Switch C type definitions

pub type int8_t = i8;
pub type int16_t = i16;
pub type int32_t = i32;
pub type int64_t = i64;
pub type uint8_t = u8;
pub type uint16_t = u16;
pub type uint32_t = u32;
pub type uint64_t = u64;

pub type c_schar = i8;
pub type c_uchar = u8;
pub type c_short = i16;
pub type c_ushort = u16;
pub type c_int = i32;
pub type c_uint = u32;
pub type c_float = f32;
pub type c_double = f64;
pub type c_longlong = i64;
pub type c_ulonglong = u64;
pub type intmax_t = i64;
pub type uintmax_t = u64;

pub type size_t = usize;
pub type ptrdiff_t = isize;
pub type intptr_t = isize;
pub type uintptr_t = usize;
pub type ssize_t = isize;

pub type off_t = i64;
pub type c_char = u8;
pub type c_long = i64;
pub type c_ulong = u64;
pub type wchar_t = u32;

pub const INT_MIN: c_int = -2147483648;
pub const INT_MAX: c_int = 2147483647;

cfg_if! {
    if #[cfg(libc_core_cvoid)] {
        pub use ::ffi::c_void;
    } else {
        // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help
        // enable more optimization opportunities around it recognizing things
        // like malloc/free.
        #[repr(u8)]
        #[allow(missing_copy_implementations)]
        #[allow(missing_debug_implementations)]
        pub enum c_void {
            // Two dummy variants so the #[repr] attribute can be used.
            #[doc(hidden)]
            __variant1,
            #[doc(hidden)]
            __variant2,
        }
    }
}