about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--src/cargo/cargo.rs20
1 files changed, 17 insertions, 3 deletions
diff --git a/src/cargo/cargo.rs b/src/cargo/cargo.rs
index 57a63052ee8..8484c9a7265 100644
--- a/src/cargo/cargo.rs
+++ b/src/cargo/cargo.rs
@@ -436,8 +436,8 @@ fn test_one_crate(_c: cargo, _path: str, cf: str, _p: pkg) {
     let buildpath = fs::connect(_path, "/test");
     need_dir(buildpath);
     #debug("Testing: %s -> %s", cf, buildpath);
-    let p = run::program_output("rustc", ["--out-dir", buildpath, "--test",
-                                          cf]);
+    let p = run::program_output(rustc_sysroot(),
+                                ["--out-dir", buildpath, "--test", cf]);
     if p.status != 0 {
         error(#fmt["rustc failed: %d\n%s\n%s", p.status, p.err, p.out]);
         ret;
@@ -452,7 +452,8 @@ fn install_one_crate(c: cargo, _path: str, cf: str, _p: pkg) {
     let buildpath = fs::connect(_path, "/build");
     need_dir(buildpath);
     #debug("Installing: %s -> %s", cf, buildpath);
-    let p = run::program_output("rustc", ["--out-dir", buildpath, cf]);
+    let p = run::program_output(rustc_sysroot(),
+                                ["--out-dir", buildpath, cf]);
     if p.status != 0 {
         error(#fmt["rustc failed: %d\n%s\n%s", p.status, p.err, p.out]);
         ret;
@@ -473,6 +474,19 @@ fn install_one_crate(c: cargo, _path: str, cf: str, _p: pkg) {
     }
 }
 
+fn rustc_sysroot() -> str {
+    alt os::get_exe_path() {
+        some(_path) {
+            let path = [_path, "..", "bin", "rustc"];
+            check vec::is_not_empty(path);
+            let rustc = fs::normalize(fs::connect_many(path));
+            #debug("  rustc: %s", rustc);
+            rustc
+        }
+        none { "rustc" }
+    }
+}
+
 fn install_source(c: cargo, path: str) {
     #debug("source: %s", path);
     fs::change_dir(path);