]> git.lizzy.rs Git - rust.git/commitdiff
rustc: build versioned library with hash in its name
authorHaitao Li <lihaitao@gmail.com>
Fri, 2 Dec 2011 16:51:59 +0000 (00:51 +0800)
committerGraydon Hoare <graydon@mozilla.com>
Tue, 13 Dec 2011 00:15:29 +0000 (16:15 -0800)
Also updated build to install versioned libraries and added a few
missing actions for `make clean`.

Makefile.in
mk/clean.mk
mk/host.mk
mk/install.mk
mk/platform.mk
mk/target.mk
src/comp/back/link.rs
src/comp/driver/rustc.rs
src/comp/metadata/creader.rs
src/comp/middle/trans.rs

index 51bc708c36c1067954c7f3dc7e00eee1417d0763..5d98b87e0166d390c23fc9d84c4e1a4ada87b30e 100644 (file)
@@ -108,6 +108,10 @@ CFG_CORELIB :=$(call CFG_LIB_NAME,core)
 CFG_STDLIB :=$(call CFG_LIB_NAME,std)
 CFG_LIBRUSTC :=$(call CFG_LIB_NAME,rustc)
 
+STDLIB_GLOB :=$(call CFG_LIB_GLOB,std)
+CORELIB_GLOB :=$(call CFG_LIB_GLOB,core)
+LIBRUSTC_GLOB :=$(call CFG_LIB_GLOB,rustc)
+
 # version-string calculation
 CFG_GIT_DIR := $(CFG_SRC_DIR).git
 CFG_VERSION = prerelease
index 071b4ae0350a15b3c26637e1ce069190717b58b0..e28bfc92c5e5a0afdb46f45707fb2734827c37b2 100644 (file)
@@ -56,7 +56,12 @@ clean$(1)_H_$(2):
        $(Q)rm -f $$(HBIN$(1)_H_$(2))/fuzzer$(X)
        $(Q)rm -f $$(HBIN$(1)_H_$(2))/cargo$(X)
        $(Q)rm -f $$(HLIB$(1)_H_$(2))/$(CFG_RUNTIME)
+       $(Q)rm -f $$(HLIB$(1)_H_$(2))/$(CFG_CORELIB)
        $(Q)rm -f $$(HLIB$(1)_H_$(2))/$(CFG_STDLIB)
+       $(Q)rm -f $$(HLIB$(1)_H_$(2))/$(CFG_LIBRUSTC)
+       $(Q)rm -f $$(HLIB$(1)_H_$(2))/$(CORELIB_GLOB)
+       $(Q)rm -f $$(HLIB$(1)_H_$(2))/$(STDLIB_GLOB)
+       $(Q)rm -f $$(HLIB$(1)_H_$(2))/$(LIBRUSTC_GLOB)
        $(Q)rm -f $$(HLIB$(1)_H_$(2))/$(CFG_RUSTLLVM)
        $(Q)rm -f $$(HLIB$(1)_H_$(2))/libstd.rlib
 
@@ -72,7 +77,12 @@ clean$(1)_T_$(2)_H_$(3):
        $(Q)rm -f $$(TBIN$(1)_T_$(2)_H_$(3))/rustc$(X)
        $(Q)rm -f $$(TBIN$(1)_T_$(2)_H_$(3))/fuzzer$(X)
        $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_RUNTIME)
+       $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_CORELIB)
        $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_STDLIB)
+       $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_LIBRUSTC)
+       $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/$(CORELIB_GLOB)
+       $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/$(STDLIB_GLOB)
+       $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/$(LIBRUSTC_GLOB)
        $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/$(CFG_RUSTLLVM)
        $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/libstd.rlib
        $(Q)rm -f $$(TLIB$(1)_T_$(2)_H_$(3))/intrinsics.bc
index add7278dee297b5d00ef28c746d62f832d41a838..475fa8085a69818964c1ad2f4176e1761f7b5d21 100644 (file)
@@ -30,6 +30,8 @@ $$(HLIB$(2)_H_$(4))/$$(CFG_LIBRUSTC): \
        $$(HSTDLIB_DEFAULT$(2)_H_$(3))
        @$$(call E, cp: $$@)
        $$(Q)cp $$< $$@
+       $$(Q)cp $$(TLIB$(1)_T_$(4)_H_$(3))/$(LIBRUSTC_GLOB) \
+               $$(HLIB$(2)_H_$(4))
 
 $$(HLIB$(2)_H_$(4))/$$(CFG_RUNTIME): \
        $$(TLIB$(1)_T_$(4)_H_$(3))/$$(CFG_RUNTIME)
@@ -41,6 +43,8 @@ $$(HLIB$(2)_H_$(4))/$$(CFG_CORELIB): \
        $$(HLIB$(2)_H_$(4))/$$(CFG_RUNTIME)
        @$$(call E, cp: $$@)
        $$(Q)cp $$< $$@
+       $$(Q)cp $$(TLIB$(1)_T_$(4)_H_$(3))/$(CORELIB_GLOB) \
+               $$(HLIB$(2)_H_$(4))
 
 $$(HLIB$(2)_H_$(4))/$$(CFG_STDLIB): \
        $$(TLIB$(1)_T_$(4)_H_$(3))/$$(CFG_STDLIB) \
@@ -48,6 +52,8 @@ $$(HLIB$(2)_H_$(4))/$$(CFG_STDLIB): \
        $$(HLIB$(2)_H_$(4))/$$(CFG_RUNTIME)
        @$$(call E, cp: $$@)
        $$(Q)cp $$< $$@
+       $$(Q)cp $$(TLIB$(1)_T_$(4)_H_$(3))/$(STDLIB_GLOB) \
+               $$(HLIB$(2)_H_$(4))
 
 $$(HLIB$(2)_H_$(4))/libcore.rlib: \
        $$(TLIB$(1)_T_$(4)_H_$(3))/libcore.rlib \
index c22a4a3701080c70c6744ecba1b7313171d515d2..e0e32769629cfa71b412ca3cbb2d62726383f623 100644 (file)
@@ -3,11 +3,14 @@
 # mirror of the installation directory structure.
 
 # Installation macro. Call with source directory as arg 1,
-# destination directory as arg 2, and filename as arg 3
+# destination directory as arg 2, and filename/libname-glob as arg 3
 ifdef VERBOSE
  INSTALL = cp $(1)/$(3) $(2)/$(3)
+ INSTALL_LIB = cp `ls -rt1 $(1)/$(3) | tail -1` $(2)/
 else
  INSTALL = $(Q)$(call E, install: $(2)/$(3)) && cp $(1)/$(3) $(2)/$(3)
+ INSTALL_LIB = $(Q)$(call E, install_lib: $(2)/$(3)) &&                    \
+              cp `ls -rt1 $(1)/$(3) | tail -1` $(2)/
 endif
 
 # The stage we install from
@@ -33,8 +36,10 @@ PTL$(1)$(2) = $$(PTR$(1)$(2))/lib
 install-target-$(1)-host-$(2): $$(SREQ$$(ISTAGE)_T_$(1)_H_$(2))
        $$(Q)mkdir -p $$(PTL$(1)$(2))
        $$(Q)$$(call INSTALL,$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(CFG_RUNTIME))
-       $$(Q)$$(call INSTALL,$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(CFG_CORELIB))
-       $$(Q)$$(call INSTALL,$$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(CFG_STDLIB))
+       $$(Q)$$(call INSTALL_LIB, \
+               $$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(CORELIB_GLOB))
+       $$(Q)$$(call INSTALL_LIB, \
+               $$(TL$(1)$(2)),$$(PTL$(1)$(2)),$$(STDLIB_GLOB))
        $$(Q)$$(call INSTALL,$$(TL$(1)$(2)),$$(PTL$(1)$(2)),intrinsics.bc)
        $$(Q)$$(call INSTALL,$$(TL$(1)$(2)),$$(PTL$(1)$(2)),libmorestack.a)
 endef
@@ -62,8 +67,8 @@ install-host: $(SREQ$(ISTAGE)_T_$(CFG_HOST_TRIPLE)_H_$(CFG_HOST_TRIPLE))
        $(Q)mkdir -p $(PREFIX_ROOT)/share/man/man1
        $(Q)$(call INSTALL,$(HB),$(PHB),rustc$(X))
        $(Q)$(call INSTALL,$(HL),$(PHL),$(CFG_RUNTIME))
-       $(Q)$(call INSTALL,$(HL),$(PHL),$(CFG_CORELIB))
-       $(Q)$(call INSTALL,$(HL),$(PHL),$(CFG_STDLIB))
+       $(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(CORELIB_GLOB))
+       $(Q)$(call INSTALL_LIB,$(HL),$(PHL),$(STDLIB_GLOB))
        $(Q)$(call INSTALL,$(HL),$(PHL),$(CFG_RUSTLLVM))
        $(Q)$(call INSTALL,$(S)/man, \
             $(PREFIX_ROOT)/share/man/man1,rustc.1)
index 4a70e545862d6385cd5b5996b0219cda63d78a5c..c4cce8c94388f4087e43a80777dcf09f697bca4f 100644 (file)
@@ -23,6 +23,7 @@ endif
 
 ifneq ($(findstring freebsd,$(CFG_OSTYPE)),)
   CFG_LIB_NAME=lib$(1).so
+  CFG_LIB_GLOB=lib$(1)-*.so
   CFG_GCCISH_CFLAGS += -fPIC -march=i686 -I/usr/local/include
   CFG_GCCISH_LINK_FLAGS += -shared -fPIC -lpthread -lrt
   ifeq ($(CFG_CPUTYPE), x86_64)
@@ -40,6 +41,7 @@ endif
 
 ifneq ($(findstring linux,$(CFG_OSTYPE)),)
   CFG_LIB_NAME=lib$(1).so
+  CFG_LIB_GLOB=lib$(1)-*.so
   CFG_GCCISH_CFLAGS += -fPIC
   CFG_GCCISH_LINK_FLAGS += -shared -fPIC -ldl -lpthread -lrt
   CFG_GCCISH_DEF_FLAG := -Wl,--export-dynamic,--dynamic-list=
@@ -71,6 +73,7 @@ endif
 
 ifneq ($(findstring darwin,$(CFG_OSTYPE)),)
   CFG_LIB_NAME=lib$(1).dylib
+  CFG_LIB_GLOB=lib$(1)-*.dylib
   CFG_UNIXY := 1
   CFG_LDENV := DYLD_LIBRARY_PATH
   CFG_GCCISH_LINK_FLAGS += -dynamiclib -lpthread -framework CoreServices
@@ -156,6 +159,7 @@ ifdef CFG_WINDOWSY
 
   CFG_EXE_SUFFIX := .exe
   CFG_LIB_NAME=$(1).dll
+  CFG_LIB_GLOB=$(1)-*.dll
   CFG_DEF_SUFFIX := .def
   CFG_LDPATH :=$(CFG_LDPATH):$$PATH
   CFG_RUN=PATH="$(CFG_LDPATH):$(1)" $(2)
index 6170aedb610977dbcfbf88089f6cc9bfd7ba02b2..4df1d6dd3928b7870f9bca9a3b4f6dd5ef370d9a 100644 (file)
@@ -26,14 +26,14 @@ $$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_CORELIB): \
                $$(CORELIB_CRATE) $$(CORELIB_INPUTS) \
                $$(TSREQ$(1)_T_$(2)_H_$(3))
        @$$(call E, compile_and_link: $$@)
-       $$(STAGE$(1)_T_$(2)_H_$(3)) --no-core --lib -o $$@ $$<
+       $$(STAGE$(1)_T_$(2)_H_$(3)) --no-core --lib -o $$@ $$< && touch $$@
 
 $$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_STDLIB): \
                $$(STDLIB_CRATE) $$(STDLIB_INPUTS) \
         $$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_CORELIB) \
                $$(TSREQ$(1)_T_$(2)_H_$(3))
        @$$(call E, compile_and_link: $$@)
-       $$(STAGE$(1)_T_$(2)_H_$(3)) --lib -o $$@ $$<
+       $$(STAGE$(1)_T_$(2)_H_$(3)) --lib -o $$@ $$< && touch $$@
 
 $$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_RUNTIME): \
                rt/$(2)/$$(CFG_RUNTIME)
@@ -59,7 +59,7 @@ $$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_LIBRUSTC):          \
                $$(TLIB$(1)_T_$(2)_H_$(3))/$$(CFG_RUSTLLVM)     \
                $$(TSTDLIB_DEFAULT$(1)_T_$(2)_H_$(3))
        @$$(call E, compile_and_link: $$@)
-       $$(STAGE$(1)_T_$(2)_H_$(3))  --lib -o $$@ $$<
+       $$(STAGE$(1)_T_$(2)_H_$(3))  --lib -o $$@ $$< && touch $$@
 
 endef
 
index dea4481fa26da5bb6a446749599e603f462a0b8a..36a6daeff81f4df2b64a73afb538c461a0ef0e89 100644 (file)
@@ -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 rmext(filename: str) -> str {
     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 rmext(filename: str) -> str {
         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
index 105832735a46578ae39424d06e2b4031639212d0..76c51e35da7d5b86aee8413077f6cfe26a20e3ee 100644 (file)
@@ -10,7 +10,7 @@
 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,
index cb806efa6474d804f517f1834c9b78d0987065a1..b94110acb3136c5f3f6b6f0802e6c03a9d6c756a 100644 (file)
@@ -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|
index df0de922fa36c4b7e96b4142be03f4befda5cb54..fcae4dd45bf7bf8a35c81c234847580aff97810a 100644 (file)
@@ -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: