about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2014-07-19 22:40:39 -0700
committerAlex Crichton <alex@alexcrichton.com>2014-07-21 09:54:27 -0700
commitec0f1cb709cb59e160083cb95f99aa8fc851a9b8 (patch)
treef311ac17cb2814651af83bdcfa6f96241840381f
parentc88bf10c37d32f18774cfa3ef480eb77df294565 (diff)
downloadrust-ec0f1cb709cb59e160083cb95f99aa8fc851a9b8.tar.gz
rust-ec0f1cb709cb59e160083cb95f99aa8fc851a9b8.zip
rustc: Allow the crate linked to as 'std' to be customized
This adds the alt_std_name field to the Session's Options type.
I'm using this in an external tool to control which libraries
a crate links to.
-rw-r--r--src/librustc/driver/config.rs3
-rw-r--r--src/librustc/front/std_inject.rs9
2 files changed, 11 insertions, 1 deletions
diff --git a/src/librustc/driver/config.rs b/src/librustc/driver/config.rs
index 4752997a3fc..890093a10ec 100644
--- a/src/librustc/driver/config.rs
+++ b/src/librustc/driver/config.rs
@@ -97,6 +97,7 @@ pub struct Options {
     pub color: ColorConfig,
     pub externs: HashMap<String, Vec<String>>,
     pub crate_name: Option<String>,
+    pub alt_std_name: Option<String>
 }
 
 /// Some reasonable defaults
@@ -124,6 +125,7 @@ pub fn basic_options() -> Options {
         color: Auto,
         externs: HashMap::new(),
         crate_name: None,
+        alt_std_name: None,
     }
 }
 
@@ -787,6 +789,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options {
         color: color,
         externs: externs,
         crate_name: crate_name,
+        alt_std_name: None
     }
 }
 
diff --git a/src/librustc/front/std_inject.rs b/src/librustc/front/std_inject.rs
index 351c9a6b771..940112325fd 100644
--- a/src/librustc/front/std_inject.rs
+++ b/src/librustc/front/std_inject.rs
@@ -60,9 +60,16 @@ struct StandardLibraryInjector<'a> {
 
 impl<'a> fold::Folder for StandardLibraryInjector<'a> {
     fn fold_crate(&mut self, mut krate: ast::Crate) -> ast::Crate {
+
+        // The name to use in `extern crate std = "name";`
+        let actual_crate_name = match self.sess.opts.alt_std_name {
+            Some(ref s) => token::intern_and_get_ident(s.as_slice()),
+            None => token::intern_and_get_ident("std"),
+        };
+
         let mut vis = vec!(ast::ViewItem {
             node: ast::ViewItemExternCrate(token::str_to_ident("std"),
-                                           None,
+                                           Some((actual_crate_name, ast::CookedStr)),
                                            ast::DUMMY_NODE_ID),
             attrs: vec!(
                 attr::mk_attr_outer(attr::mk_attr_id(), attr::mk_list_item(