Skip to content

Commit 38e7bcf

Browse files
committed
Use cargo_metadata in cargo-miri
1 parent a719c05 commit 38e7bcf

File tree

3 files changed

+73
-48
lines changed

3 files changed

+73
-48
lines changed

cargo-miri/Cargo.lock

Lines changed: 55 additions & 20 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

cargo-miri/Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ doctest = false # and no doc tests
1717
directories = "3"
1818
rustc_version = "0.4"
1919
serde_json = "1.0.40"
20+
cargo_metadata = "0.15.0"
2021

2122
# A noop dependency that changes in the Rust repository, it's a bit of a hack.
2223
# See the `src/tools/rustc-workspace-hack/README.md` file in `rust-lang/rust`

cargo-miri/bin.rs

Lines changed: 17 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ use std::process::{self, Command};
1616

1717
use rustc_version::VersionMeta;
1818
use serde::{Deserialize, Serialize};
19+
use cargo_metadata::{MetadataCommand, Metadata};
1920

2021
use version::*;
2122

@@ -582,41 +583,29 @@ path = "lib.rs"
582583
}
583584
}
584585

585-
#[derive(Deserialize)]
586-
struct Metadata {
587-
target_directory: PathBuf,
588-
workspace_members: Vec<String>,
589-
}
590-
591586
fn get_cargo_metadata() -> Metadata {
592-
let mut cmd = cargo();
593-
// `-Zunstable-options` is required by `--config`.
594-
cmd.args(["metadata", "--no-deps", "--format-version=1", "-Zunstable-options"]);
595587
// The `build.target-dir` config can be passed by `--config` flags, so forward them to
596588
// `cargo metadata`.
589+
let mut additional_options = Vec::new();
590+
// `-Zunstable-options` is required by `--config`.
591+
additional_options.push("-Zunstable-options".to_string());
592+
597593
let config_flag = "--config";
598594
for arg in ArgSplitFlagValue::new(
599595
env::args().skip(3), // skip the program name, "miri" and "run" / "test"
600596
config_flag,
601-
)
602-
// Only look at `Ok`
603-
.flatten()
604-
{
605-
cmd.arg(config_flag).arg(arg);
606-
}
607-
let mut child = cmd
608-
.stdin(process::Stdio::null())
609-
.stdout(process::Stdio::piped())
610-
.spawn()
611-
.expect("failed ro run `cargo metadata`");
612-
// Check this `Result` after `status.success()` is checked, so we don't print the error
613-
// to stderr if `cargo metadata` is also printing to stderr.
614-
let metadata: Result<Metadata, _> = serde_json::from_reader(child.stdout.take().unwrap());
615-
let status = child.wait().expect("failed to wait for `cargo metadata` to exit");
616-
if !status.success() {
617-
std::process::exit(status.code().unwrap_or(-1));
597+
).flatten() { // Only look at `Ok`
598+
additional_options.push(config_flag.to_string());
599+
additional_options.push(arg);
618600
}
619-
metadata.unwrap_or_else(|e| show_error(format!("invalid `cargo metadata` output: {}", e)))
601+
602+
let metadata = MetadataCommand::new()
603+
.no_deps()
604+
.other_options(additional_options)
605+
.exec()
606+
.unwrap();
607+
608+
metadata
620609
}
621610

622611
/// Pulls all the crates in this workspace from the cargo metadata.
@@ -627,7 +616,7 @@ fn local_crates(metadata: &Metadata) -> String {
627616
assert!(!metadata.workspace_members.is_empty());
628617
let mut local_crates = String::new();
629618
for member in &metadata.workspace_members {
630-
let name = member.split(' ').next().unwrap();
619+
let name = member.repr.split(' ').next().unwrap();
631620
let name = name.replace('-', "_");
632621
local_crates.push_str(&name);
633622
local_crates.push(',');

0 commit comments

Comments
 (0)