提交 105255a2 authored 作者: Serhij S's avatar Serhij S

cargo args

上级 30b62297
......@@ -1038,6 +1038,7 @@ dependencies = [
"roboplc",
"serde",
"serde_json",
"shlex",
"toml",
"ureq",
"ureq_multipart",
......@@ -1270,6 +1271,12 @@ dependencies = [
"lazy_static",
]
[[package]]
name = "shlex"
version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fda2ff0d084019ba4d7c6f371c95d8fd75ce3524c3cb8fb653a3023f6323e64"
[[package]]
name = "signal-hook"
version = "0.3.17"
......
......@@ -20,6 +20,7 @@ prettytable-rs = "0.10.0"
roboplc = "0.1.27"
serde = { version = "1.0.197", features = ["derive"] }
serde_json = "1.0.115"
shlex = "1.3.0"
toml = "0.8.12"
ureq = { version = "2.9.6", features = ["json", "native-certs", "native-tls"] }
ureq_multipart = "1.1.1"
......
......@@ -89,6 +89,8 @@ struct FlashCommand {
cargo: Option<PathBuf>,
#[clap(long, help = "Override remote cargo target")]
cargo_target: Option<String>,
#[clap(long, help = "Extra cargo arguments")]
cargo_args: Option<String>,
#[clap(long, help = "Do not compile a Rust project, use a file instead")]
file: Option<PathBuf>,
#[clap(long, help = "Force flash (automatically put remote in CONFIG mode)")]
......@@ -266,21 +268,38 @@ fn flash(
let Some(name) = find_name_and_chdir() else {
return Err("Could not find Cargo.toml/binary name".into());
};
let mut cargo_args = None;
if let Some(args) = opts.cargo_args {
cargo_args.replace(args);
} else if let Some(ref value) = robo_toml {
cargo_args = value
.get("build")
.and_then(|v| v.get("cargo-args"))
.map(|v| v.as_str().unwrap().to_owned());
}
let binary_name = Path::new("target")
.join(&cargo_target)
.join("release")
.join(name);
let mut args: Vec<String> = vec![
"build".into(),
"--release".into(),
"--target".into(),
cargo_target.clone(),
];
if let Some(extra) = cargo_args {
args.extend(shlex::split(&extra).expect("Invalid cargo args"));
}
println!("Remote: {}", url.yellow());
println!("Cargo: {}", cargo.display().to_string().yellow());
println!(
"Cargo command line: {} {}",
cargo.display().to_string().yellow(),
args.join(" ").yellow()
);
println!("Cargo target: {}", cargo_target.yellow());
println!("Binary: {}", binary_name.display().to_string().yellow());
println!("Compiling...");
let result = std::process::Command::new(cargo)
.arg("build")
.arg("--release")
.arg("--target")
.arg(cargo_target)
.status()?;
let result = std::process::Command::new(cargo).args(args).status()?;
if !result.success() {
return Err("Compilation failed".into());
}
......
Markdown 格式
0%
您添加了 0 到此讨论。请谨慎行事。
请先完成此评论的编辑!
注册 或者 后发表评论