1 use std::path::PathBuf; 2 3 use cc::Build; 4 5 use crate::utils::cargo_handler::CargoHandler; 6 7 use self::arch::current_cfiles_arch; 8 9 mod arch; 10 11 /// 构建项目的c文件 12 pub struct CFilesBuilder; 13 14 impl CFilesBuilder { 15 pub fn build() { 16 let mut c = cc::Build::new(); 17 Self::setup_global_flags(&mut c); 18 Self::setup_defines(&mut c); 19 Self::setup_global_include_dir(&mut c); 20 Self::setup_files(&mut c); 21 c.compile("dragonos_kernel_cfiles"); 22 } 23 24 fn setup_global_flags(c: &mut Build) { 25 c.flag("-mcmodel=large") 26 .flag("-fno-builtin") 27 .flag("-nostdlib") 28 .flag("-fno-stack-protector") 29 .flag("-fno-pie") 30 .flag("-Wno-expansion-to-defined") 31 .flag("-Wno-unused-parameter") 32 .flag("-m64") 33 .flag("-O1"); 34 } 35 36 fn setup_defines(c: &mut Build) { 37 if let Ok(k) = std::env::var("EMULATOR") { 38 c.define("EMULATOR", Some(k.as_str())); 39 } else { 40 c.define("EMULATOR", "__NO_EMULATION__"); 41 } 42 43 current_cfiles_arch().setup_defines(c); 44 } 45 46 fn setup_global_include_dir(c: &mut Build) { 47 c.include("src/include"); 48 c.include("src"); 49 c.include("."); 50 51 current_cfiles_arch().setup_global_include_dir(c); 52 } 53 54 /// 设置需要编译的文件 55 fn setup_files(c: &mut Build) { 56 let mut files: Vec<PathBuf> = Vec::new(); 57 58 current_cfiles_arch().setup_files(c, &mut files); 59 60 Self::set_rerun_if_files_changed(&files); 61 c.files(files.as_slice()); 62 } 63 64 /// 设置Cargo对文件更改的监听 65 fn set_rerun_if_files_changed(files: &Vec<PathBuf>) { 66 CargoHandler::emit_rerun_if_files_changed(files.as_slice()); 67 } 68 } 69