add compilation in separate directory

This commit is contained in:
2025-09-24 12:06:43 +02:00
parent d35c88e38f
commit 9f4a61a7ec
2 changed files with 25 additions and 4 deletions

View File

@@ -57,6 +57,10 @@ pub struct ArgWrite {
#[argp(description = "Path to the source Intel HEX file.")]
pub path: OsString,
#[argp(option)]
#[argp(description = "Where to run the command. Will be created if it doesn't exist.")]
pub cmd_path: Option<std::path::PathBuf>,
#[argp(option)]
#[argp(description = "Command to run before writing the file. Handy for compiling the program and running it at the same time.")]
pub cmd: Option<OsString>,
@@ -102,7 +106,7 @@ pub struct ArgMonitor {}
pub struct ArgRun {
#[argp(positional)]
#[argp(description = "Path to the source C file.")]
pub path: OsString
pub path: std::path::PathBuf
}
#[derive(FromArgs)]

View File

@@ -204,16 +204,23 @@ fn write_chip_data(args: &ArgWrite, target: &mut PhysicalTarget) -> Result<(), E
fn write_chip(args: ArgWrite, target: &mut PhysicalTarget) -> Result<(), Error> {
loop {
if let Some(cmd) = args.cmd.as_ref() {
let cmd_path = &args.cmd_path;
let mut args = shlex::bytes::split(cmd.as_encoded_bytes())
.ok_or(Error::other("Error parsing commandline arguments"))?
.into_iter()
.map(|x| unsafe { OsString::from_encoded_bytes_unchecked(x) });
if let Some(cmd_path) = cmd_path {
if !cmd_path.is_dir() {
Err(Error::other("invalid cmd path (not a dir)"))?
}
}
let Some(name) = args.next() else {
Err(Error::other("No command provided"))?
};
let out = std::process::Command::new(name)
.current_dir(cmd_path.as_ref().map(|p| p.as_path()).unwrap_or(&std::path::Path::new(".")))
.args(args)
.output()?;
@@ -257,11 +264,21 @@ fn monitor_chip(_args: ArgMonitor, target: &mut PhysicalTarget) -> Result<(), Er
}
fn run_chip(args: ArgRun, target: &mut PhysicalTarget) -> Result<(), Error> {
let path = PathBuf::from(&args.path).with_extension("ihx").into_os_string();
let cmd = Some(OsString::from(format!("sdcc \"{}\"", unsafe { String::from_utf8_unchecked(args.path.into_encoded_bytes()) })));
let parent_path = args.path.parent().unwrap().join("tulflash");
let base_file = parent_path.join(
args.path.file_name().ok_or(Error::other("invalid path to compilation source"))?);
let path = base_file.with_extension("ihx");
let sdcc_file = args.path.file_name().ok_or(Error::other("invalid path to compilation source"))?;
let cmd = Some(OsString::from(
format!("sdcc \"{}\"", sdcc_file.to_str().ok_or(Error::other("invalid path to compilation source"))?)
));
let cmd_path = Some(parent_path.clone());
std::fs::create_dir_all(parent_path)?;
std::fs::copy(args.path, &base_file)?;
write_chip(ArgWrite {
path,
path: path.into_os_string(),
cmd_path,
cmd,
start: 0,
end: 65535,