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
$(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
$(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
$$(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)
$$(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) \
$$(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 \
# 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
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
$(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)
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)
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=
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
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)
$$(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)
$$(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
// 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();
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?
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
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};
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,
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,
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|
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);
log_err #fmt["time: %s took %d ms", timing.ident, timing.time];
}
}
- ret llmod;
+ ret (llmod, link_meta);
}
//
// Local Variables: