about summary refs log tree commit diff
path: root/src/comp/driver
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-06-20 17:36:15 -0400
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-06-20 17:44:12 -0400
commit3d8a5cb9e67d0e38d2062bd7685aa5514305dfc6 (patch)
treeca77815fd66229bc0c64669c8deded58b01f4613 /src/comp/driver
parenta2dcd08cc273bcc880fc9687bffc98796fa1f3c4 (diff)
downloadrust-3d8a5cb9e67d0e38d2062bd7685aa5514305dfc6.tar.gz
rust-3d8a5cb9e67d0e38d2062bd7685aa5514305dfc6.zip
Remember the library files we used in rustc and pass them to the "linker".
This avoid the hardcoded -lstd, allows programs to use other crates and avoids
any differences that may exist in the rustc and ld search logic.
Diffstat (limited to 'src/comp/driver')
-rw-r--r--src/comp/driver/rustc.rs7
-rw-r--r--src/comp/driver/session.rs14
2 files changed, 19 insertions, 2 deletions
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs
index 4783c71cfc7..0acf1dfac87 100644
--- a/src/comp/driver/rustc.rs
+++ b/src/comp/driver/rustc.rs
@@ -271,7 +271,7 @@ fn build_session(@session::options sopts) -> session::session {
     auto crate_cache = common::new_int_hash[session::crate_metadata]();
     auto target_crate_num = 0;
     auto sess =
-        session::session(target_crate_num, target_cfg, sopts, crate_cache,
+        session::session(target_crate_num, target_cfg, sopts, crate_cache, [],
                          front::codemap::new_codemap(), 0u);
     ret sess;
 }
@@ -417,10 +417,13 @@ fn main(vec[str] args) {
                 gcc_args = common_args;
             }
         }
+
+        gcc_args += sess.get_used_libraries();
+
         if (sopts.shared) {
             gcc_args += [shared_cmd];
         } else {
-            gcc_args += ["-Lrustllvm", "-lrustllvm", "-lstd", "-lm", main];
+            gcc_args += ["-Lrustllvm", "-lrustllvm", "-lm", main];
         }
         // We run 'gcc' here
 
diff --git a/src/comp/driver/session.rs b/src/comp/driver/session.rs
index 14b8213ce3c..695cf7e5606 100644
--- a/src/comp/driver/session.rs
+++ b/src/comp/driver/session.rs
@@ -66,6 +66,7 @@ obj session(ast::crate_num cnum,
             @config targ_cfg,
             @options opts,
             map::hashmap[int, crate_metadata] crates,
+            mutable vec[str] used_libraries,
             codemap::codemap cm,
             mutable uint err_count) {
     fn get_targ_cfg() -> @config { ret targ_cfg; }
@@ -122,6 +123,19 @@ obj session(ast::crate_num cnum,
         crates.insert(num, metadata);
     }
     fn has_external_crate(int num) -> bool { ret crates.contains_key(num); }
+    fn add_used_library(&str lib) {
+        // A program has a small number of libraries, so a vector is probably a
+        // good data structure in here.
+        for (str l in used_libraries) {
+            if (l == lib) {
+                ret;
+            }
+        }
+        used_libraries += [lib];
+    }
+    fn get_used_libraries() -> vec[str] {
+       ret used_libraries;
+    }
     fn get_codemap() -> codemap::codemap { ret cm; }
     fn lookup_pos(uint pos) -> codemap::loc {
         ret codemap::lookup_pos(cm, pos);