From 19e97f5c5db9b47558c7bdc2249c228254b81a1e Mon Sep 17 00:00:00 2001
From: Young-il Choi <duddlf.choi@samsung.com>
Date: Fri, 6 Dec 2013 15:44:27 +0900
Subject: [PATCH 1/4] librustc: ar call fix to support android cross compile on
 mac

---
 src/librustc/back/archive.rs | 10 +++++++++-
 1 file changed, 9 insertions(+), 1 deletion(-)

diff --git a/src/librustc/back/archive.rs b/src/librustc/back/archive.rs
index 07457b1db27..e7535d8199d 100644
--- a/src/librustc/back/archive.rs
+++ b/src/librustc/back/archive.rs
@@ -37,7 +37,15 @@ pub struct ArchiveRO {
 
 fn run_ar(sess: Session, args: &str, cwd: Option<&Path>,
         paths: &[&Path]) -> ProcessOutput {
-    let ar = sess.opts.ar.clone().unwrap_or_else(|| ~"ar");
+    let ar = if sess.opts.target_triple == ~"arm-linux-androideabi" {
+        match sess.opts.android_cross_path {
+            Some(ref path) => *path + "/bin/" + "arm-linux-androideabi-ar",
+            None => ~"arm-linux-androideabi-ar"
+        }
+    } else {
+        sess.opts.ar.clone().unwrap_or_else(|| ~"ar")
+    };
+
     let mut args = ~[args.to_owned()];
     let mut paths = paths.iter().map(|p| p.as_str().unwrap().to_owned());
     args.extend(&mut paths);

From c8c99429d2d40e70824dae90305acae88a3d917d Mon Sep 17 00:00:00 2001
From: Young-il Choi <duddlf.choi@samsung.com>
Date: Fri, 27 Dec 2013 17:29:53 +0900
Subject: [PATCH 2/4] librustc: move target dependent logic to back::link

---
 src/librustc/back/archive.rs | 10 ++--------
 src/librustc/back/link.rs    | 16 ++++++++++++++++
 2 files changed, 18 insertions(+), 8 deletions(-)

diff --git a/src/librustc/back/archive.rs b/src/librustc/back/archive.rs
index e7535d8199d..cc96bea9fa1 100644
--- a/src/librustc/back/archive.rs
+++ b/src/librustc/back/archive.rs
@@ -10,6 +10,7 @@
 
 //! A helper class for dealing with static archives
 
+use back::link::{get_ar_prog};
 use driver::session::Session;
 use metadata::filesearch;
 use lib::llvm::{ArchiveRef, llvm};
@@ -37,14 +38,7 @@ pub struct ArchiveRO {
 
 fn run_ar(sess: Session, args: &str, cwd: Option<&Path>,
         paths: &[&Path]) -> ProcessOutput {
-    let ar = if sess.opts.target_triple == ~"arm-linux-androideabi" {
-        match sess.opts.android_cross_path {
-            Some(ref path) => *path + "/bin/" + "arm-linux-androideabi-ar",
-            None => ~"arm-linux-androideabi-ar"
-        }
-    } else {
-        sess.opts.ar.clone().unwrap_or_else(|| ~"ar")
-    };
+    let ar = get_ar_prog(sess);
 
     let mut args = ~[args.to_owned()];
     let mut paths = paths.iter().map(|p| p.as_str().unwrap().to_owned());
diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs
index a63d0041d0c..a0364101d3d 100644
--- a/src/librustc/back/link.rs
+++ b/src/librustc/back/link.rs
@@ -736,6 +736,22 @@ pub fn get_cc_prog(sess: Session) -> ~str {
     }
 }
 
+pub fn get_ar_prog(sess: Session) -> ~str {
+    match sess.targ_cfg.os {
+        abi::OsAndroid => match sess.opts.android_cross_path {
+            Some(ref path) => format!("{}/bin/arm-linux-androideabi-ar", *path),
+            None => {
+                sess.fatal("need Android NDK path for linking \
+                            (--android-cross-path)")
+            }
+        },
+        _ => match sess.opts.ar {
+            Some(ref ar) => format!("{}", *ar),
+            None => ~"ar"
+        },
+    }
+}
+
 /// Perform the linkage portion of the compilation phase. This will generate all
 /// of the requested outputs for this compilation session.
 pub fn link_binary(sess: Session,

From e6490cbdb01dfa8687d29c42ac3e7342ff2bafaf Mon Sep 17 00:00:00 2001
From: Young-il Choi <duddlf.choi@samsung.com>
Date: Thu, 2 Jan 2014 15:43:47 +0900
Subject: [PATCH 3/4] librustc: add get_system_tools for target specific
 environment

---
 src/librustc/back/link.rs | 41 +++++++++++++++++++++++----------------
 1 file changed, 24 insertions(+), 17 deletions(-)

diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs
index a0364101d3d..414978df1db 100644
--- a/src/librustc/back/link.rs
+++ b/src/librustc/back/link.rs
@@ -724,32 +724,39 @@ pub fn get_cc_prog(sess: Session) -> ~str {
     // instead of hard-coded gcc.
     // For win32, there is no cc command, so we add a condition to make it use gcc.
     match sess.targ_cfg.os {
-        abi::OsAndroid => match sess.opts.android_cross_path {
-            Some(ref path) => format!("{}/bin/arm-linux-androideabi-gcc", *path),
-            None => {
-                sess.fatal("need Android NDK path for linking \
-                            (--android-cross-path)")
-            }
-        },
-        abi::OsWin32 => ~"gcc",
-        _ => ~"cc",
+        abi::OsWin32 => return ~"gcc",
+        _ => {},
     }
+
+    get_system_tool(sess, "cc")
 }
 
 pub fn get_ar_prog(sess: Session) -> ~str {
+    match sess.opts.ar {
+        Some(ref ar) => return ar.to_owned(),
+        None => {}
+    }
+
+    get_system_tool(sess, "ar")
+}
+
+fn get_system_tool(sess: Session, tool: &str) -> ~str {
     match sess.targ_cfg.os {
         abi::OsAndroid => match sess.opts.android_cross_path {
-            Some(ref path) => format!("{}/bin/arm-linux-androideabi-ar", *path),
+            Some(ref path) => {
+                let tool_str = match tool {
+                    "cc" => "gcc",
+                    _ => tool
+                };
+                format!("{}/bin/arm-linux-androideabi-{}", *path, tool_str)
+            }
             None => {
-                sess.fatal("need Android NDK path for linking \
-                            (--android-cross-path)")
+                sess.fatal(format!("need Android NDK path for the '{}' tool \
+                                    (--android-cross-path)", tool))
             }
         },
-        _ => match sess.opts.ar {
-            Some(ref ar) => format!("{}", *ar),
-            None => ~"ar"
-        },
-    }
+        _ => tool.to_owned(),
+    } 
 }
 
 /// Perform the linkage portion of the compilation phase. This will generate all

From 635002a3503b1020433f729dbb5b37e30a691813 Mon Sep 17 00:00:00 2001
From: Young-il Choi <duddlf.choi@samsung.com>
Date: Mon, 6 Jan 2014 13:06:06 +0900
Subject: [PATCH 4/4] librustc: tidy cleanup

---
 src/librustc/back/link.rs | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs
index 414978df1db..a73c3cf6b5c 100644
--- a/src/librustc/back/link.rs
+++ b/src/librustc/back/link.rs
@@ -756,7 +756,7 @@ fn get_system_tool(sess: Session, tool: &str) -> ~str {
             }
         },
         _ => tool.to_owned(),
-    } 
+    }
 }
 
 /// Perform the linkage portion of the compilation phase. This will generate all