sixel-sys-static 0.3.2

FFI bindings to libsixel, static linkage
Documentation
#![allow(unused_variables)]

// extern crate bindgen;
extern crate make_cmd;
extern crate pkg_config;

use make_cmd::make;

use std::env;
use std::path::Path;
use std::process::Command;

const LIBSIXEL_DIR: &str = "libsixel";

fn main() {
    if !cfg!(feature = "static") {
        if !pkg_config::probe_library("sixel").is_ok() {
            panic!("sixel system library not found, try enabling the \"static\" feature to build and statically link a local version");
        }
        println!("cargo:rustc-link-lib=sixel");
        return;
    }

    let testing_build = false;

    let out_dir = env::var("OUT_DIR").unwrap();
    let out_dir = Path::new(&out_dir);

    println!("cargo:rustc-link-lib=static=sixel");
    println!(
        "cargo:rustc-link-search=native={}",
        out_dir.join("lib").display()
    );

    if testing_build {
        return;
    }

    let curl = has_feature("curl");
    let jpeg = has_feature("jpeg");
    let pixbuf = has_feature("pixbuf");
    let png = has_feature("png");
    let gd = has_feature("gd");
    let python_interface = has_feature("python_interface");

    let sixel_dir = Path::new(LIBSIXEL_DIR);

    {
        let mut cmd = Command::new("./configure");
        cmd.current_dir(sixel_dir)
            .arg("--prefix")
            .arg(out_dir)
            .arg("--enable-static")
            .env("CFLAGS", "-fPIE");

        if curl {
            cmd.arg("--with-libcurl");
        }
        if gd {
            cmd.arg("--with-gd");
        }
        if pixbuf {
            cmd.arg("--with-gdk-pixbuf");
        }
        if jpeg {
            cmd.arg("--with-jpeg");
        }
        if png {
            cmd.arg("--with-png");
        }
        if !python_interface {
            cmd.arg("--without-python");
        }

        cmd.status().expect("Failed to execute ./configure");

        make()
            .arg("install")
            .current_dir(sixel_dir)
            .status()
            .expect("Failed to execute make");
    }

    // generate_bindings(out_dir);
}

// fn generate_bindings(out_dir: &Path) {
//     let bindings = bindgen::Builder::default()
//         .no_unstable_rust()
//         .header("wrapper.h")
//         .hide_type("max_align_t")
//         .generate()
//         .expect("Unable to generate bindings");
//
//     bindings
//         .write_to_file(out_dir.join("bindings.rs"))
//         .expect("Couldn't write bindings");
// }

const FEATURE_PREFIX: &str = "CARGO_FEATURE_";
fn has_feature(feature: &'static str) -> bool {
    let feature = feature.to_owned().to_uppercase();
    let mut name = FEATURE_PREFIX.to_owned();
    name.push_str(&feature);
    env::var(name).is_ok()
}