llvm_build_utils 0.3.0

Ever wanted to build “native” assembly stuff in your cargo build scripts… something gcc crate cannot quite handle yet? Welcome to llvm_build_utils which provides a convenient API to pack your .ll or .bc files into a ready to use archive full of machine code! It doesn’t even need an installation of LLVM*!
extern crate llvm_build_utils;

use llvm_build_utils::*;

#[test]
fn test_build() {
    build_archive_kind(ArchiveKind::Gnu, "libtest.a", &[("tests/test.ll", BuildOptions {
        triple: String::from("x86_64-unknown-linux-gnu"),
        ..BuildOptions::default()
    }), ("tests/test.ll", BuildOptions {
        triple: String::from("i386-unknown-linux-gnu"),
        ..BuildOptions::default()
    })]).unwrap().print();
}

#[test]
fn test_bytecode_build() {
    build_archive_kind(ArchiveKind::Gnu, "libtestbc.a", &[("tests/test.bc", BuildOptions {
        triple: String::from("x86_64-unknown-linux-gnu"),
        ..BuildOptions::default()
    })]).unwrap().print();
}

#[test]
fn test_cpu_attr() {
    build_archive_kind(ArchiveKind::Gnu, "librand.a", &[("tests/rdrand.ll", BuildOptions {
        triple: String::from("x86_64-unknown-linux-gnu"),
        cpu: String::from("x86-64"),
        attr: String::from("+rdrnd"),
        ..BuildOptions::default()
    }), ("tests/rdseed.ll", BuildOptions {
        triple: String::from("x86_64-unknown-linux-gnu"),
        cpu: String::from("x86-64"),
        attr: String::from("+rdseed"),
        ..BuildOptions::default()
    })]).unwrap().print();
}

#[test]
fn allow_dynamic_dispatch() {
    use std::path::*;
    let pb = PathBuf::from("libtest.a");
    let t1 = Path::new("tests/test.ll");
    build_archive_kind(ArchiveKind::Gnu, &pb as &AsRef<Path>,
    &[(&t1 as &AsRef<Path>, BuildOptions {
        triple: String::from("x86_64-unknown-linux-gnu"),
        ..BuildOptions::default()
    }), (&"tests/test.ll" as &AsRef<Path>, BuildOptions {
        triple: String::from("i386-unknown-linux-gnu"),
        ..BuildOptions::default()
    })]).unwrap().print();
}

#[test]
fn test_optimisation() {
    build_archive_kind(ArchiveKind::Gnu, "librandopt.a", &[("tests/rdrand.ll", BuildOptions {
        triple: String::from("x86_64-unknown-linux-gnu"),
        cpu: String::from("x86-64"),
        attr: String::from("+rdrnd"),
        opt: Optimisation::O3,
        ..BuildOptions::default()
    })]).unwrap().print();
}

#[test]
fn test_wrong_things_fail_1() {
    println!("{}",
    build_archive_kind(ArchiveKind::Gnu, "fail.a", &[("tests/does_not_exist_for_sure.ll",
                     BuildOptions::default())]).err().unwrap());
}

#[test]
fn test_wrong_things_fail_2() {
    println!("{}",
    build_archive_kind(ArchiveKind::Gnu, "/", &[("tests/test.ll",
                     BuildOptions::default())]).err().unwrap());
}

#[test]
fn test_wrong_things_fail_3() {
    println!("{}",
    build_archive_kind(ArchiveKind::Gnu, "banana.a/", &[("tests/test.ll",
                     BuildOptions::default())]).err().unwrap());
}

#[test]
fn test_wrong_things_fail_4() {
    println!("{}",
    build_archive_kind(ArchiveKind::Gnu, "test.a", &[("tests/test.ll", BuildOptions {
        triple: String::from("some weird triple this is"),
        ..BuildOptions::default()
    })]).err().unwrap());
}

#[test]
fn test_wrong_things_fail_5() {
    println!("{}",
    build_archive_kind(ArchiveKind::Gnu, "libtest", &[("tests/test.ll", BuildOptions {
        triple: String::from("some weird triple this is"),
        ..BuildOptions::default()
    })]).err().unwrap());
}