From 832f7b758f28d36030df27c888ef9248ba584859 Mon Sep 17 00:00:00 2001 From: Luqman Aden Date: Thu, 2 May 2013 14:12:47 -0700 Subject: [PATCH] librustc: Add argument to allow choosing "linker" --- src/librustc/back/link.rs | 28 ++++++++++++++++++---------- src/librustc/driver/driver.rs | 4 +++- src/librustc/driver/session.rs | 4 +++- 3 files changed, 24 insertions(+), 12 deletions(-) diff --git a/src/librustc/back/link.rs b/src/librustc/back/link.rs index 87e08a73fcb..de6469e8180 100644 --- a/src/librustc/back/link.rs +++ b/src/librustc/back/link.rs @@ -752,18 +752,26 @@ pub fn link_binary(sess: Session, // instead of hard-coded gcc. // For win32, there is no cc command, // so we add a condition to make it use gcc. - let cc_prog: ~str = if sess.targ_cfg.os == session::os_android { - match &sess.opts.android_cross_path { - &Some(copy path) => { - fmt!("%s/bin/arm-linux-androideabi-gcc", path) - } - &None => { - sess.fatal(~"need Android NDK path for linking \ - (--android-cross-path)") + let cc_prog: ~str = match sess.opts.linker { + Some(copy linker) => linker, + None => { + if sess.targ_cfg.os == session::os_android { + match &sess.opts.android_cross_path { + &Some(copy path) => { + fmt!("%s/bin/arm-linux-androideabi-gcc", path) + } + &None => { + sess.fatal(~"need Android NDK path for linking \ + (--android-cross-path)") + } + } + } else if sess.targ_cfg.os == session::os_win32 { + ~"gcc" + } else { + ~"cc" } } - } else if sess.targ_cfg.os == session::os_win32 { ~"gcc" } - else { ~"cc" }; + }; // The invocations of cc share some flags across platforms diff --git a/src/librustc/driver/driver.rs b/src/librustc/driver/driver.rs index 5e5d0640d80..02940ea9905 100644 --- a/src/librustc/driver/driver.rs +++ b/src/librustc/driver/driver.rs @@ -650,7 +650,7 @@ pub fn build_session_options(binary: @~str, }; let addl_lib_search_paths = getopts::opt_strs(matches, ~"L").map(|s| Path(*s)); - + let linker = getopts::opt_maybe_str(matches, ~"linker"); let linker_args = getopts::opt_strs(matches, ~"link-args").flat_map( |a| { let mut args = ~[]; for str::each_split_char(*a, ' ') |arg| { @@ -676,6 +676,7 @@ pub fn build_session_options(binary: @~str, jit: jit, output_type: output_type, addl_lib_search_paths: addl_lib_search_paths, + linker: linker, linker_args: linker_args, maybe_sysroot: sysroot_opt, target_triple: target, @@ -760,6 +761,7 @@ pub fn optgroups() -> ~[getopts::groups::OptGroup] { optmulti("L", "", "Add a directory to the library search path", "PATH"), optflag("", "lib", "Compile a library crate"), + optopt("", "linker", "Program to use for linking instead of the default.", "LINKER"), optmulti("", "link-args", "FLAGS is a space-separated list of flags passed to the linker", "FLAGS"), optflag("", "ls", "List the symbols defined by a library crate"), diff --git a/src/librustc/driver/session.rs b/src/librustc/driver/session.rs index 237b03bc20f..29cb5a71f31 100644 --- a/src/librustc/driver/session.rs +++ b/src/librustc/driver/session.rs @@ -124,6 +124,7 @@ pub struct options { jit: bool, output_type: back::link::output_type, addl_lib_search_paths: ~[Path], + linker: Option<~str>, linker_args: ~[~str], maybe_sysroot: Option, target_triple: ~str, @@ -302,7 +303,8 @@ pub fn basic_options() -> @options { jit: false, output_type: link::output_type_exe, addl_lib_search_paths: ~[], - linker_args:~[], + linker: None, + linker_args: ~[], maybe_sysroot: None, target_triple: host_triple(), target_feature: ~"",