1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
use std::env;
use std::path::PathBuf;

pub fn build() {
    let basedir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("yara");

    let mut cc = cc::Build::new();

    cc
        .include(basedir.join("libyara"))
        .include(basedir.join("libyara/include"))

        .file(basedir.join("libyara/ahocorasick.c"))
        .file(basedir.join("libyara/arena.c"))
        .file(basedir.join("libyara/atoms.c"))
        .file(basedir.join("libyara/bitmask.c"))
        .file(basedir.join("libyara/compiler.c"))
        .file(basedir.join("libyara/endian.c"))
        .file(basedir.join("libyara/exec.c"))
        .file(basedir.join("libyara/exefiles.c"))
        .file(basedir.join("libyara/filemap.c"))
        .file(basedir.join("libyara/grammar.c"))
        .file(basedir.join("libyara/hash.c"))
        .file(basedir.join("libyara/hex_grammar.c"))
        .file(basedir.join("libyara/hex_lexer.c"))
        .file(basedir.join("libyara/lexer.c"))
        .file(basedir.join("libyara/libyara.c"))
        .file(basedir.join("libyara/mem.c"))
        .file(basedir.join("libyara/object.c"))
        .file(basedir.join("libyara/parser.c"))
        .file(basedir.join("libyara/proc.c"))
        .file(basedir.join("libyara/re.c"))
        .file(basedir.join("libyara/re_grammar.c"))
        .file(basedir.join("libyara/re_lexer.c"))
        .file(basedir.join("libyara/rules.c"))
        .file(basedir.join("libyara/scan.c"))
        .file(basedir.join("libyara/scanner.c"))
        .file(basedir.join("libyara/sizedstr.c"))
        .file(basedir.join("libyara/stack.c"))
        .file(basedir.join("libyara/stopwatch.c"))
        .file(basedir.join("libyara/stream.c"))
        .file(basedir.join("libyara/strutils.c"))
        .file(basedir.join("libyara/threading.c"))

        .file(basedir.join("libyara/modules.c"))
        .file(basedir.join("libyara/modules/elf.c"))
        .file(basedir.join("libyara/modules/math.c"))
        .file(basedir.join("libyara/modules/pe.c"))
        .file(basedir.join("libyara/modules/pe_utils.c"))
        .file(basedir.join("libyara/modules/tests.c"))
        .file(basedir.join("libyara/modules/time.c"))

        .define("DEX_MODULE", "")
        .file(basedir.join("libyara/modules/dex.c"))

        .define("DOTNET_MODULE", "")
        .file(basedir.join("libyara/modules/dotnet.c"))

        .define("MACHO_MODULE", "")
        .file(basedir.join("libyara/modules/macho.c"));

    // Use correct proc functions
    if cfg!(windows) {
        cc
            .file(basedir.join("libyara/proc/windows.c"))
            .define("USE_WINDOWS_PROC", "");
    } else if cfg!(linux) {
        cc
            .file(basedir.join("libyara/proc/linux.c"))
            .define("USE_LINUX_PROC", "");
    } else if cfg!(darwin) {
        cc
            .file(basedir.join("libyara/proc/mach.c"))
            .define("USE_MACH_PROC", "");
    } else {
        cc
            .file(basedir.join("libyara/proc/none.c"))
            .define("USE_NO_PROC", "");
    }

    if cfg!(windows) {
        cc.define("NDEBUG", "1");
    }
    else {
        cc.define("POSIX", "");
    }

    // Unfortunately, YARA compilation produces lots of warnings
    cc.warnings(false);

    cc.compile("yara");
}

fn include_dir() -> PathBuf {
    PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("yara/libyara/include")
}

fn lib_dir() -> PathBuf {
    std::env::var("OUT_DIR").unwrap().into()
}

pub fn set_env() {
    env::set_var("LIBYARA_STATIC", "1");
    env::set_var("YARA_INCLUDE_DIR", include_dir());
    env::set_var("YARA_LIBRARY_PATH", lib_dir());
}

pub fn print_cargo_metadata() {
    println!("cargo:rustc-link-search=native={}", lib_dir().display());
    println!("cargo:rustc-link-lib=static=yara");
    println!("cargo:include={}", include_dir().display());
    println!("cargo:lib={}", lib_dir().display());
}