]> git.lizzy.rs Git - rust.git/commitdiff
create a miri-pass test that allows us to run miri for arbitrary targets
authorOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Wed, 15 Jun 2016 11:18:35 +0000 (13:18 +0200)
committerOliver Schneider <git-spam-no-reply9815368754983@oli-obk.de>
Wed, 15 Jun 2016 14:01:00 +0000 (16:01 +0200)
.travis.yml
Cargo.lock
Cargo.toml
src/bin/miri.rs
tests/compiletest.rs

index d56ca04817e13f17f9fd3cd7da896870e8217c4f..8f88f6636504a01e9a4c28f2b8ef39bd2ea0a3a6 100644 (file)
@@ -9,9 +9,10 @@ before_script:
   pip install 'travis-cargo<0.2' --user &&
   export PATH=$HOME/.local/bin:$PATH
 script:
-- |
-  travis-cargo build &&
-  env RUST_SYSROOT=$HOME/rust travis-cargo test
+- set -e
+- travis-cargo build
+- RUST_SYSROOT=$HOME/rust
+- travis-cargo test
 notifications:
   email:
     on_success: never
index 240a2144807dae9f8defff19cc6f271ad863f33f..d0b785a061fbb821312dd464b6c5507ff8d6af84 100644 (file)
@@ -3,7 +3,7 @@ name = "miri"
 version = "0.1.0"
 dependencies = [
  "byteorder 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
- "compiletest_rs 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
+ "compiletest_rs 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)",
  "env_logger 0.3.3 (registry+https://github.com/rust-lang/crates.io-index)",
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
  "log_settings 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
@@ -24,10 +24,11 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
 
 [[package]]
 name = "compiletest_rs"
-version = "0.1.3"
+version = "0.2.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 dependencies = [
  "log 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)",
+ "rustc-serialize 0.3.19 (registry+https://github.com/rust-lang/crates.io-index)",
 ]
 
 [[package]]
@@ -96,6 +97,11 @@ name = "regex-syntax"
 version = "0.3.3"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 
+[[package]]
+name = "rustc-serialize"
+version = "0.3.19"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+
 [[package]]
 name = "thread-id"
 version = "2.0.0"
index 5a8211230fa86d8b003a365b648d100f90653285..fea568e244d43dfdb2448b75c049bfb9da6bfa3a 100644 (file)
@@ -21,4 +21,4 @@ log = "0.3.6"
 log_settings = "0.1.1"
 
 [dev-dependencies]
-compiletest_rs = "0.1.1"
+compiletest_rs = "0.2"
index 8ec691dbbbc2777d84e633e8def353702e8195a5..ac5bf495f4874df435d6a74cfb624c654341b0c1 100644 (file)
@@ -17,7 +17,7 @@
     Frame,
 };
 use rustc::session::Session;
-use rustc_driver::{driver, CompilerCalls};
+use rustc_driver::{driver, CompilerCalls, Compilation};
 use rustc::ty::{TyCtxt, subst};
 use rustc::hir::def_id::DefId;
 
@@ -31,6 +31,7 @@ fn build_controller(
     ) -> driver::CompileController<'a> {
         let mut control = driver::CompileController::basic();
 
+        control.after_analysis.stop = Compilation::Stop;
         control.after_analysis.callback = Box::new(|state| {
             state.session.abort_if_errors();
 
@@ -70,6 +71,7 @@ fn build_controller(
                     }
                 }
             }
+            state.session.abort_if_errors();
         });
 
         control
index 7ce9636fc05f07037bf28cb353dcc19fd3621136..01cc8ccdb00568a2565cc1e7fbfdd8c014567886 100644 (file)
@@ -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();
+        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);
+        }
+        let stderr = std::io::stderr();
+        writeln!(stderr.lock(), "").unwrap();
+    })
 }