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 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 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}