prototyper.rs 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. use std::{
  2. env,
  3. process::{Command, ExitStatus},
  4. };
  5. use clap::Args;
  6. use crate::utils::cargo;
  7. use crate::utils::CmdOptional;
  8. #[derive(Debug, Args, Clone)]
  9. pub struct PrototyperArg {
  10. #[clap(long, short = 'f')]
  11. pub features: Vec<String>,
  12. #[clap(long, env = "PROTOTYPER_FDT_PATH")]
  13. pub fdt: Option<String>,
  14. #[clap(long, env = "PROTOTYPER_PAYLOAD_PATH")]
  15. pub payload: Option<String>,
  16. }
  17. #[must_use]
  18. pub fn run(arg: &PrototyperArg) -> Option<ExitStatus> {
  19. let arch = "riscv64imac-unknown-none-elf";
  20. let fdt = arg.fdt.clone();
  21. let payload = arg.payload.clone();
  22. cargo::Cargo::new("build")
  23. .package("rustsbi-prototyper")
  24. .target(arch)
  25. .unstable("build-std", ["core"])
  26. .env("RUSTFLAGS", "-C relocation-model=pie -C link-arg=-pie")
  27. .features(&arg.features)
  28. .optional(arg.fdt.is_some(), |cargo| {
  29. export_env!("PROTOTYPER_FDT_PATH" ?= fdt.unwrap());
  30. cargo.features(["fdt".to_string()])
  31. })
  32. .optional(payload.is_some(), |cargo| {
  33. export_env!("PROTOTYPER_PAYLOAD_PATH" ?= payload.unwrap());
  34. cargo.features(["payload".to_string()])
  35. })
  36. .release()
  37. .status()
  38. .ok()?;
  39. Command::new("rust-objcopy")
  40. .args(["-O", "binary"])
  41. .arg("--binary-architecture=riscv64")
  42. .arg(
  43. env::current_dir()
  44. .unwrap()
  45. .join("target")
  46. .join(arch.to_string())
  47. .join("release")
  48. .join("rustsbi-prototyper"),
  49. )
  50. .arg(
  51. env::current_dir()
  52. .unwrap()
  53. .join("target")
  54. .join(arch.to_string())
  55. .join("release")
  56. .join("rustsbi-prototyper.bin"),
  57. )
  58. .status()
  59. .ok()
  60. }