Skip to content

Commit b6eb2cd

Browse files
committed
cargo miri: support foreign targets
1 parent c84c152 commit b6eb2cd

File tree

2 files changed

+18
-6
lines changed

2 files changed

+18
-6
lines changed

Cargo.toml

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@ required-features = ["rustc_tests"]
3636
byteorder = { version = "1.1", features = ["i128"]}
3737
cargo_metadata = { version = "0.6", optional = true }
3838
directories = { version = "1.0", optional = true }
39+
rustc_version = { version = "0.2.3", optional = true }
3940
env_logger = "0.5"
4041
log = "0.4"
4142

@@ -44,7 +45,7 @@ vergen = "3"
4445

4546
[features]
4647
default = ["cargo_miri"]
47-
cargo_miri = ["cargo_metadata", "directories"]
48+
cargo_miri = ["cargo_metadata", "directories", "rustc_version"]
4849
rustc_tests = []
4950

5051
[dev-dependencies]

src/bin/cargo-miri.rs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -190,17 +190,28 @@ path = "lib.rs"
190190
"#).unwrap();
191191
File::create(dir.join("lib.rs")).unwrap();
192192
// Run xargo
193-
if !Command::new("xargo").arg("build").arg("-q")
193+
let target = get_arg_flag_value("--target");
194+
let mut command = Command::new("xargo");
195+
command.arg("build").arg("-q")
194196
.current_dir(&dir)
195197
.env("RUSTFLAGS", miri::miri_default_args().join(" "))
196-
.env("XARGO_HOME", dir.to_str().unwrap())
197-
.status().unwrap().success()
198+
.env("XARGO_HOME", dir.to_str().unwrap());
199+
if let Some(ref target) = target {
200+
command.arg("--target").arg(&target);
201+
}
202+
if !command.status().unwrap().success()
198203
{
199204
show_error(format!("Failed to run xargo"));
200205
}
201206

202-
// That should be it!
203-
let sysroot = dir.join("HOST");
207+
// That should be it! But we need to figure out where xargo built stuff.
208+
// Unfortunately, it puts things into a different directory when the
209+
// architecture matches the host.
210+
let is_host = match target {
211+
None => true,
212+
Some(target) => target == rustc_version::version_meta().unwrap().host,
213+
};
214+
let sysroot = if is_host { dir.join("HOST") } else { PathBuf::from(dir) };
204215
std::env::set_var("MIRI_SYSROOT", &sysroot);
205216
if !ask_user {
206217
println!("A libstd for miri is now available in `{}`", sysroot.display());

0 commit comments

Comments
 (0)