Hi all,
I've been trying to use cargo
programmatically to clean the project in the current directory without removing build artefacts of dependencies, then compile it. Unfortunately, it looks like I can't do both at the same time:
extern crate cargo;
use cargo::ops::{CompileOptions, CleanOptions, Packages, CompileFilter, MessageFormat, CompileMode};
use cargo::core::Workspace;
use cargo::core::shell::Verbosity;
use cargo::util::config::Config;
use std::env::current_dir;
fn main() {
let rustc_opts = {
let mut opts = vec!("--emit", "asm", "-C", "debuginfo=2");
opts
}.iter().map(|s| (*s).into()).collect::<Vec<String>>();
let conf = {
let mut conf = Config::default().unwrap();
conf.shell().set_verbosity(Verbosity::Verbose);
conf
};
let ws = Workspace::new(¤t_dir().unwrap().join("Cargo.toml"), &conf).unwrap();
cargo::ops::clean(&ws, &CleanOptions {
spec: &["NAME OF PROJECT FROM CARGO.TOML HERE".into()],
target: None,
config: &conf,
release: false
}).unwrap();
let compilation = cargo::ops::compile(&ws, &CompileOptions {
config: &conf,
jobs: None,
target: None,
features: &[],
all_features: false,
no_default_features: false,
spec: Packages::All,
release: false,
filter: CompileFilter::Default { required_features_filterable: true },
mode: CompileMode::Build,
message_format: MessageFormat::Human,
target_rustdoc_args: None,
target_rustc_args: Some(&rustc_opts)
}).expect("it crashes here");
}
Cleaning the project without compiling it works, as does compiling without cleaning. The error is
'couldn't get the path to cargo executable', Os { code: 2, kind: NotFound, message: "No such file or directory" }
I've tried a few permutations of settings, workspaces, etc, but there's a lot of surface area to cover. It also fails if I try to clean the entire project as well (spec: &[]
in CleanOptions). Am I missing something here?