-
Notifications
You must be signed in to change notification settings - Fork 349
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
create a miri-pass test that allows us to run miri for arbitrary targets #27
Changes from 1 commit
82dc95c
506f2de
9cceef0
06d1780
6a5f737
af36ec9
b6fca73
453a22a
2ed6f1c
f01be91
60f2bb9
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -21,4 +21,4 @@ log = "0.3.6" | |
log_settings = "0.1.1" | ||
|
||
[dev-dependencies] | ||
compiletest_rs = "0.1.1" | ||
compiletest_rs = "0.2" |
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,43 +1,73 @@ | ||
extern crate compiletest_rs as compiletest; | ||
|
||
use std::path::PathBuf; | ||
use std::path::{PathBuf, Path}; | ||
use std::io::Write; | ||
|
||
fn run_mode(mode: &'static str) { | ||
fn run_mode(dir: &'static str, mode: &'static str, sysroot: &str) { | ||
// Disable rustc's new error fomatting. It breaks these tests. | ||
std::env::remove_var("RUST_NEW_ERROR_FORMAT"); | ||
|
||
// Taken from https://github.com/Manishearth/rust-clippy/pull/911. | ||
let home = option_env!("RUSTUP_HOME").or(option_env!("MULTIRUST_HOME")); | ||
let toolchain = option_env!("RUSTUP_TOOLCHAIN").or(option_env!("MULTIRUST_TOOLCHAIN")); | ||
let sysroot = match (home, toolchain) { | ||
(Some(home), Some(toolchain)) => format!("{}/toolchains/{}", home, toolchain), | ||
_ => option_env!("RUST_SYSROOT") | ||
.expect("need to specify RUST_SYSROOT env var or use rustup or multirust") | ||
.to_owned(), | ||
}; | ||
let flags = format!("--sysroot {} -Dwarnings", sysroot); | ||
|
||
// FIXME: read directories in sysroot/lib/rustlib and generate the test targets from that | ||
let targets = &["x86_64-unknown-linux-gnu", "i686-unknown-linux-gnu"]; | ||
|
||
for &target in targets { | ||
use std::io::Write; | ||
let stderr = std::io::stderr(); | ||
write!(stderr.lock(), "running tests for target {}", target).unwrap(); | ||
for_all_targets(sysroot, |target| { | ||
let mut config = compiletest::default_config(); | ||
config.host_rustcflags = Some(flags.clone()); | ||
config.mode = mode.parse().expect("Invalid mode"); | ||
config.run_lib_path = format!("{}/lib/rustlib/{}/lib", sysroot, target); | ||
config.run_lib_path = Path::new(sysroot).join("lib").join("rustlib").join(&target).join("lib"); | ||
config.rustc_path = "target/debug/miri".into(); | ||
config.src_base = PathBuf::from(format!("tests/{}", mode)); | ||
config.src_base = PathBuf::from(format!("tests/{}", dir)); | ||
config.target = target.to_owned(); | ||
config.target_rustcflags = Some(flags.clone()); | ||
compiletest::run_tests(&config); | ||
}); | ||
} | ||
|
||
fn for_all_targets<F: Fn(String)>(sysroot: &str, f: F) { | ||
for target in std::fs::read_dir(format!("{}/lib/rustlib/", sysroot)).unwrap() { | ||
let target = target.unwrap(); | ||
if !target.metadata().unwrap().is_dir() { | ||
continue; | ||
} | ||
let target = target.path().iter().rev().next().unwrap().to_str().unwrap().to_owned(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. You can use let target = target.file_name().into_string().unwrap(); There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. makes sense |
||
if target == "etc" { | ||
continue; | ||
} | ||
let stderr = std::io::stderr(); | ||
writeln!(stderr.lock(), "running tests for target {}", target).unwrap(); | ||
f(target); | ||
} | ||
} | ||
|
||
#[test] | ||
fn compile_test() { | ||
run_mode("compile-fail"); | ||
run_mode("run-pass"); | ||
// Taken from https://github.com/Manishearth/rust-clippy/pull/911. | ||
let home = option_env!("RUSTUP_HOME").or(option_env!("MULTIRUST_HOME")); | ||
let toolchain = option_env!("RUSTUP_TOOLCHAIN").or(option_env!("MULTIRUST_TOOLCHAIN")); | ||
let sysroot = match (home, toolchain) { | ||
(Some(home), Some(toolchain)) => format!("{}/toolchains/{}", home, toolchain), | ||
_ => option_env!("RUST_SYSROOT") | ||
.expect("need to specify RUST_SYSROOT env var or use rustup or multirust") | ||
.to_owned(), | ||
}; | ||
run_mode("compile-fail", "compile-fail", &sysroot); | ||
for_all_targets(&sysroot, |target| { | ||
for file in std::fs::read_dir("tests/run-pass").unwrap() { | ||
let file = file.unwrap(); | ||
if !file.metadata().unwrap().is_file() { | ||
continue; | ||
} | ||
let file = file.path(); | ||
let stderr = std::io::stderr(); | ||
writeln!(stderr.lock(), "test [miri-pass] {}", file.to_str().unwrap()).unwrap(); | ||
let mut cmd = std::process::Command::new("target/debug/miri"); | ||
cmd.arg(file); | ||
cmd.arg(format!("--sysroot={}", sysroot)); | ||
cmd.arg("-Dwarnings"); | ||
cmd.arg(format!("-target={}", target)); | ||
let libs = Path::new(&sysroot).join("lib"); | ||
let sysroot = libs.join("rustlib").join(&target).join("lib"); | ||
let paths = std::env::join_paths(&[libs, sysroot]).unwrap(); | ||
cmd.env(compiletest::procsrv::dylib_env_var(), paths); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It seems like this |
||
} | ||
let stderr = std::io::stderr(); | ||
writeln!(stderr.lock(), "").unwrap(); | ||
}) | ||
} |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this needs an
export
if you do it as a separate command. This probably explains the Travis failure on this PR.