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("CМодуль ядра собранule to OUT_DIR");
println!("cargo:warning=Cmod builded: {}", out_ko.display());
}
}
}
|