x86_64.rs 1.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344
  1. use std::{collections::HashSet, path::PathBuf};
  2. use cc::Build;
  3. use crate::{constant::ARCH_DIR_X86_64, utils::FileUtils};
  4. use super::CFilesArch;
  5. pub(super) struct X86_64CFilesArch;
  6. impl CFilesArch for X86_64CFilesArch {
  7. fn setup_defines(&self, c: &mut cc::Build) {
  8. c.define("__x86_64__", None);
  9. }
  10. fn setup_global_include_dir(&self, include_dirs: &mut HashSet<PathBuf>) {
  11. include_dirs.insert("src/arch/x86_64/include".into());
  12. }
  13. fn setup_files(&self, _c: &mut Build, files: &mut HashSet<PathBuf>) {
  14. const DIRS: [&str; 4] = ["driver/apic", "init", "asm", "interrupt"];
  15. DIRS.iter().for_each(|dir| {
  16. FileUtils::list_all_files(&arch_path(dir), Some("c"), true)
  17. .into_iter()
  18. .for_each(|f| {
  19. files.insert(f);
  20. });
  21. });
  22. // setup asm files
  23. files.insert(PathBuf::from("src/arch/x86_64/asm/head.S"));
  24. files.insert(PathBuf::from("src/arch/x86_64/asm/entry.S"));
  25. files.insert(PathBuf::from("src/arch/x86_64/asm/apu_boot.S"));
  26. }
  27. fn setup_global_flags(&self, c: &mut Build) {
  28. c.asm_flag("-m64");
  29. c.flag("-mcmodel=large").flag("-m64");
  30. }
  31. }
  32. fn arch_path(relative_path: &str) -> PathBuf {
  33. PathBuf::from(format!("{}/{}", ARCH_DIR_X86_64, relative_path))
  34. }