Skip to main content

yara_src/
lib.rs

1use std::env;
2use std::path::PathBuf;
3
4pub fn build() {
5    let basedir = PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("yara");
6
7    let mut cc = cc::Build::new();
8
9    cc
10        .include(basedir.join("libyara"))
11        .include(basedir.join("libyara/include"))
12
13        .file(basedir.join("libyara/ahocorasick.c"))
14        .file(basedir.join("libyara/arena.c"))
15        .file(basedir.join("libyara/atoms.c"))
16        .file(basedir.join("libyara/bitmask.c"))
17        .file(basedir.join("libyara/compiler.c"))
18        .file(basedir.join("libyara/endian.c"))
19        .file(basedir.join("libyara/exec.c"))
20        .file(basedir.join("libyara/exefiles.c"))
21        .file(basedir.join("libyara/filemap.c"))
22        .file(basedir.join("libyara/grammar.c"))
23        .file(basedir.join("libyara/hash.c"))
24        .file(basedir.join("libyara/hex_grammar.c"))
25        .file(basedir.join("libyara/hex_lexer.c"))
26        .file(basedir.join("libyara/lexer.c"))
27        .file(basedir.join("libyara/libyara.c"))
28        .file(basedir.join("libyara/mem.c"))
29        .file(basedir.join("libyara/object.c"))
30        .file(basedir.join("libyara/parser.c"))
31        .file(basedir.join("libyara/proc.c"))
32        .file(basedir.join("libyara/re.c"))
33        .file(basedir.join("libyara/re_grammar.c"))
34        .file(basedir.join("libyara/re_lexer.c"))
35        .file(basedir.join("libyara/rules.c"))
36        .file(basedir.join("libyara/scan.c"))
37        .file(basedir.join("libyara/scanner.c"))
38        .file(basedir.join("libyara/sizedstr.c"))
39        .file(basedir.join("libyara/stack.c"))
40        .file(basedir.join("libyara/stopwatch.c"))
41        .file(basedir.join("libyara/stream.c"))
42        .file(basedir.join("libyara/strutils.c"))
43        .file(basedir.join("libyara/threading.c"))
44
45        .file(basedir.join("libyara/modules.c"))
46        .file(basedir.join("libyara/modules/elf.c"))
47        .file(basedir.join("libyara/modules/math.c"))
48        .file(basedir.join("libyara/modules/pe.c"))
49        .file(basedir.join("libyara/modules/pe_utils.c"))
50        .file(basedir.join("libyara/modules/tests.c"))
51        .file(basedir.join("libyara/modules/time.c"))
52
53        .define("DEX_MODULE", "")
54        .file(basedir.join("libyara/modules/dex.c"))
55
56        .define("DOTNET_MODULE", "")
57        .file(basedir.join("libyara/modules/dotnet.c"))
58
59        .define("MACHO_MODULE", "")
60        .file(basedir.join("libyara/modules/macho.c"));
61
62    // Use correct proc functions
63    if cfg!(windows) {
64        cc
65            .file(basedir.join("libyara/proc/windows.c"))
66            .define("USE_WINDOWS_PROC", "");
67    } else if cfg!(linux) {
68        cc
69            .file(basedir.join("libyara/proc/linux.c"))
70            .define("USE_LINUX_PROC", "");
71    } else if cfg!(darwin) {
72        cc
73            .file(basedir.join("libyara/proc/mach.c"))
74            .define("USE_MACH_PROC", "");
75    } else {
76        cc
77            .file(basedir.join("libyara/proc/none.c"))
78            .define("USE_NO_PROC", "");
79    }
80
81    if cfg!(windows) {
82        cc.define("NDEBUG", "1");
83    }
84    else {
85        cc.define("POSIX", "");
86    }
87
88    // Unfortunately, YARA compilation produces lots of warnings
89    cc.warnings(false);
90
91    cc.compile("yara");
92}
93
94fn include_dir() -> PathBuf {
95    PathBuf::from(env!("CARGO_MANIFEST_DIR")).join("yara/libyara/include")
96}
97
98fn lib_dir() -> PathBuf {
99    std::env::var("OUT_DIR").unwrap().into()
100}
101
102pub fn set_env() {
103    env::set_var("LIBYARA_STATIC", "1");
104    env::set_var("YARA_INCLUDE_DIR", include_dir());
105    env::set_var("YARA_LIBRARY_PATH", lib_dir());
106}
107
108pub fn print_cargo_metadata() {
109    println!("cargo:rustc-link-search=native={}", lib_dir().display());
110    println!("cargo:rustc-link-lib=static=yara");
111    println!("cargo:include={}", include_dir().display());
112    println!("cargo:lib={}", lib_dir().display());
113}