summary refs log tree commit diff
path: root/src
diff options
context:
space:
mode:
authorHaitao Li <lihaitao@gmail.com>2011-12-03 00:51:59 +0800
committerGraydon Hoare <graydon@mozilla.com>2011-12-12 16:15:29 -0800
commit6dbd4c21e9cc0fd3bb337ad2d9f10e206cf3e575 (patch)
treee81b1c77a6b247a0521eca58f71ff629c0cad4e3 /src
parentb4f450a7938ef560168947a28600663389969a02 (diff)
downloadrust-6dbd4c21e9cc0fd3bb337ad2d9f10e206cf3e575.tar.gz
rust-6dbd4c21e9cc0fd3bb337ad2d9f10e206cf3e575.zip
rustc: build versioned library with hash in its name
Also updated build to install versioned libraries and added a few
missing actions for `make clean`.
Diffstat (limited to 'src')
-rw-r--r--src/comp/back/link.rs19
-rw-r--r--src/comp/driver/rustc.rs6
-rw-r--r--src/comp/metadata/creader.rs2
-rw-r--r--src/comp/middle/trans.rs4
4 files changed, 19 insertions, 12 deletions
diff --git a/src/comp/back/link.rs b/src/comp/back/link.rs
index dea4481fa26..36a6daeff81 100644
--- a/src/comp/back/link.rs
+++ b/src/comp/back/link.rs
@@ -551,7 +551,8 @@ fn mangle_internal_name_by_seq(ccx: @crate_ctxt, flav: str) -> str {
 // gcc to link the object file with some libs
 fn link_binary(sess: session::session,
                obj_filename: str,
-               out_filename: str) {
+               out_filename: str,
+               lm: link_meta) {
     // The default library location, we need this to find the runtime.
     // The location of crates will be determined as needed.
     let stage: str = "-L" + sess.filesearch().get_target_lib_path();
@@ -611,14 +612,17 @@ fn link_binary(sess: session::session,
     let used_libs = cstore::get_used_libraries(cstore);
     for l: str in used_libs { gcc_args += ["-l" + l]; }
 
+    let long_libname =
+        std::os::dylib_filename(#fmt("%s-%s-%s",
+                                     lm.name, lm.extras_hash, lm.vers));
+
     if sess.building_library() {
         gcc_args += [lib_cmd];
 
         // On mac we need to tell the linker to let this library
         // be rpathed
         if sess.get_targ_cfg().os == session::os_macos {
-            gcc_args += ["-Wl,-install_name,@rpath/"
-                        + fs::basename(out_filename)];
+            gcc_args += ["-Wl,-install_name,@rpath/" + long_libname];
         }
     } else {
         // FIXME: why do we hardcode -lm?
@@ -651,19 +655,22 @@ fn link_binary(sess: session::session,
         sess.note(prog.err + prog.out);
         sess.abort_if_errors();
     }
-    // Clean up on Darwin
 
+    // Clean up on Darwin
     if sess.get_targ_cfg().os == session::os_macos {
         run::run_program("dsymutil", [out_filename]);
     }
 
-
     // Remove the temporary object file if we aren't saving temps
     if !sess.get_opts().save_temps {
         run::run_program("rm", [obj_filename]);
     }
-}
 
+    if sess.building_library() {
+        let fullname = fs::connect(fs::dirname(out_filename), long_libname);
+        run::run_program("mv", [out_filename, fullname]);
+    }
+}
 //
 // Local Variables:
 // mode: rust
diff --git a/src/comp/driver/rustc.rs b/src/comp/driver/rustc.rs
index 105832735a4..76c51e35da7 100644
--- a/src/comp/driver/rustc.rs
+++ b/src/comp/driver/rustc.rs
@@ -10,7 +10,7 @@ import middle::{trans, resolve, freevars, kind, ty, typeck, fn_usage,
 import syntax::print::{pp, pprust};
 import util::{ppaux, filesearch};
 import back::link;
-import std::{option, str, vec, int, io, getopts, result};
+import std::{fs, option, str, vec, int, io, getopts, result};
 import std::option::{some, none};
 import std::getopts::{optopt, optmulti, optflag, optflagopt, opt_present};
 import back::{x86, x86_64};
@@ -193,7 +193,7 @@ fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str,
 
     let outputs = build_output_filenames(input, output, sess);
 
-    let llmod =
+    let (llmod, link_meta) =
         time(time_passes, "translation",
              bind trans::trans_crate(sess, crate, ty_cx,
                                      outputs.obj_filename, ast_map,
@@ -209,7 +209,7 @@ fn compile_input(sess: session::session, cfg: ast::crate_cfg, input: str,
 
     time(time_passes, "Linking",
          bind link::link_binary(sess, outputs.obj_filename,
-                                outputs.out_filename));
+                                outputs.out_filename, link_meta));
 }
 
 fn pretty_print_input(sess: session::session, cfg: ast::crate_cfg, input: str,
diff --git a/src/comp/metadata/creader.rs b/src/comp/metadata/creader.rs
index cb806efa647..b94110acb31 100644
--- a/src/comp/metadata/creader.rs
+++ b/src/comp/metadata/creader.rs
@@ -157,7 +157,7 @@ fn find_library_crate_aux(sess: session::session,
                           metas: [@ast::meta_item],
                           filesearch: filesearch::filesearch) ->
    option::t<{ident: str, data: @[u8]}> {
-    let prefix: str = nn.prefix + crate_name;
+    let prefix: str = nn.prefix + crate_name + "-";
     let suffix: str = nn.suffix;
 
     ret filesearch::search(filesearch, { |path|
diff --git a/src/comp/middle/trans.rs b/src/comp/middle/trans.rs
index df0de922fa3..fcae4dd45bf 100644
--- a/src/comp/middle/trans.rs
+++ b/src/comp/middle/trans.rs
@@ -6020,7 +6020,7 @@ fn write_abi_version(ccx: @crate_ctxt) {
 fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
                output: str, amap: ast_map::map, mut_map: mut::mut_map,
                copy_map: alias::copy_map, last_uses: last_use::last_uses)
-    -> ModuleRef {
+    -> (ModuleRef, link::link_meta) {
     let sha = std::sha1::mk_sha1();
     let link_meta = link::build_link_meta(sess, *crate, output, sha);
 
@@ -6138,7 +6138,7 @@ fn trans_crate(sess: session::session, crate: @ast::crate, tcx: ty::ctxt,
             log_err #fmt["time: %s took %d ms", timing.ident, timing.time];
         }
     }
-    ret llmod;
+    ret (llmod, link_meta);
 }
 //
 // Local Variables: