extern crate bindgen;
extern crate cc;
use cc::Build;
use std::env::{var, var_os};
use std::path::PathBuf;
struct Flags(Vec<(&'static str, &'static str)>);
fn main() {
let mut flags = Flags::new();
flags.add("FF_CODE_PAGE", "850");
flags.add("FF_LFN_UNICODE", "2");
flags.add(
"FF_FS_READONLY",
var_os("CARGO_FEATURE_READONLY").map_or_else(|| "0", |_| "1"),
);
flags.add(
"FF_USE_MKFS",
var_os("CARGO_FEATURE_MKFS").map_or_else(|| "0", |_| "1"),
);
flags.add(
"FF_USE_LFN",
var_os("CARGO_FEATURE_LFN").map_or_else(|| "0", |_| "1"),
);
flags.add(
"FF_USE_TRIM",
var_os("CARGO_FEATURE_TRIM").map_or_else(|| "0", |_| "1"),
);
Build::new()
.file("fatfs/ff.c")
.flag("-nodefaultlibs")
.flag("-fno-strict-aliasing")
.define_flags(&flags)
.compile("fatfs");
let bindings = bindgen::builder()
.header("wrapper.h")
.define_flags(&flags)
.use_core()
.ctypes_prefix("::drone_ctypes")
.rustified_enum("DRESULT")
.rustified_enum("FRESULT")
.generate()
.expect("Unable to generate bindings");
let out_path = PathBuf::from(var("OUT_DIR").unwrap());
bindings
.write_to_file(out_path.join("bindings.rs"))
.expect("Couldn't write bindings!");
}
impl Flags {
fn new() -> Self {
Flags(Vec::new())
}
fn add(&mut self, name: &'static str, value: &'static str) {
self.0.push((name, value));
}
}
trait CcExt {
fn define_flags(&mut self, flags: &Flags) -> &mut Self;
}
impl CcExt for Build {
fn define_flags(&mut self, flags: &Flags) -> &mut Self {
for &(name, value) in &flags.0 {
self.define(name, value);
}
self
}
}
trait BindgenExt {
fn define_flags(self, flags: &Flags) -> Self;
}
impl BindgenExt for bindgen::Builder {
fn define_flags(mut self, flags: &Flags) -> Self {
for &(name, value) in &flags.0 {
self = self.clang_arg(format!("-D{}={}", name, value));
}
self
}
}