Skip to content

Commit

Permalink
Auto merge of #29520 - retep998:staticlib-naming-fiasco, r=alexcrichton
Browse files Browse the repository at this point in the history
I'm not sure if this was the best way to go about it, but it seems to work.

Fixes #29508

r? @alexcrichton
  • Loading branch information
bors committed Jan 21, 2016
2 parents d5ec3ab + 1b0064e commit 34b4e66
Show file tree
Hide file tree
Showing 8 changed files with 32 additions and 15 deletions.
12 changes: 10 additions & 2 deletions src/librustc_metadata/loader.rs
Original file line number Diff line number Diff line change
Expand Up @@ -388,11 +388,12 @@ impl<'a> Context<'a> {
}

let dypair = self.dylibname();
let staticpair = self.staticlibname();

// want: crate_name.dir_part() + prefix + crate_name.file_part + "-"
let dylib_prefix = format!("{}{}", dypair.0, self.crate_name);
let rlib_prefix = format!("lib{}", self.crate_name);
let staticlib_prefix = format!("lib{}", self.crate_name);
let staticlib_prefix = format!("{}{}", staticpair.0, self.crate_name);

let mut candidates = HashMap::new();
let mut staticlibs = vec!();
Expand Down Expand Up @@ -425,7 +426,7 @@ impl<'a> Context<'a> {
false)
} else {
if file.starts_with(&staticlib_prefix[..]) &&
file.ends_with(".a") {
file.ends_with(&staticpair.1) {
staticlibs.push(CrateMismatch {
path: path.to_path_buf(),
got: "static".to_string()
Expand Down Expand Up @@ -644,6 +645,13 @@ impl<'a> Context<'a> {
(t.options.dll_prefix.clone(), t.options.dll_suffix.clone())
}

// Returns the corresponding (prefix, suffix) that files need to have for
// static libraries
fn staticlibname(&self) -> (String, String) {
let t = &self.target;
(t.options.staticlib_prefix.clone(), t.options.staticlib_suffix.clone())
}

fn find_commandline_library(&mut self, locs: &[String]) -> Option<Library> {
// First, filter out all libraries that look suspicious. We only accept
// files which actually exist that have the correct naming scheme for
Expand Down
5 changes: 4 additions & 1 deletion src/librustc_trans/back/link.rs
Original file line number Diff line number Diff line change
Expand Up @@ -490,7 +490,10 @@ pub fn filename_for_input(sess: &Session,
suffix))
}
config::CrateTypeStaticlib => {
outputs.out_directory.join(&format!("lib{}.a", libname))
let (prefix, suffix) = (&sess.target.target.options.staticlib_prefix,
&sess.target.target.options.staticlib_suffix);
outputs.out_directory.join(&format!("{}{}{}", prefix, libname,
suffix))
}
config::CrateTypeExecutable => {
let suffix = &sess.target.target.options.exe_suffix;
Expand Down
11 changes: 9 additions & 2 deletions src/librustc_trans/back/linker.rs
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,14 @@ impl<'a> Linker for MsvcLinker<'a> {
fn link_rlib(&mut self, lib: &Path) { self.cmd.arg(lib); }
fn add_object(&mut self, path: &Path) { self.cmd.arg(path); }
fn args(&mut self, args: &[String]) { self.cmd.args(args); }
fn build_dylib(&mut self, _out_filename: &Path) { self.cmd.arg("/DLL"); }

fn build_dylib(&mut self, out_filename: &Path) {
self.cmd.arg("/DLL");
let mut arg: OsString = "/IMPLIB:".into();
arg.push(out_filename.with_extension("dll.lib"));
self.cmd.arg(arg);
}

fn gc_sections(&mut self, _is_dylib: bool) { self.cmd.arg("/OPT:REF,ICF"); }

fn link_dylib(&mut self, lib: &str) {
Expand All @@ -222,7 +229,7 @@ impl<'a> Linker for MsvcLinker<'a> {
// `foo.lib` file if the dll doesn't actually export any symbols, so we
// check to see if the file is there and just omit linking to it if it's
// not present.
let name = format!("{}.lib", lib);
let name = format!("{}.dll.lib", lib);
if fs::metadata(&path.join(&name)).is_ok() {
self.cmd.arg(name);
}
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-make/c-link-to-rust-dylib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ all: $(TMPDIR)/$(call BIN,bar)

ifdef IS_MSVC
$(TMPDIR)/$(call BIN,bar): $(call DYLIB,foo)
$(CC) bar.c $(TMPDIR)/foo.lib $(call OUT_EXE,bar)
$(CC) bar.c $(TMPDIR)/foo.dll.lib $(call OUT_EXE,bar)
else
$(TMPDIR)/$(call BIN,bar): $(call DYLIB,foo)
$(CC) bar.c -lfoo -o $(call RUN_BINFILE,bar) -L $(TMPDIR)
Expand Down
5 changes: 2 additions & 3 deletions src/test/run-make/c-link-to-rust-staticlib/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,10 @@
ifneq ($(shell uname),FreeBSD)
all:
$(RUSTC) foo.rs
cp $(TMPDIR)/libfoo.a $(call NATIVE_STATICLIB,foo2)
$(CC) bar.c $(call NATIVE_STATICLIB,foo2) $(call OUT_EXE,bar) \
$(CC) bar.c $(call STATICLIB,foo) $(call OUT_EXE,bar) \
$(EXTRACFLAGS) $(EXTRACXXFLAGS)
$(call RUN,bar)
rm $(call STATICLIB,foo*)
rm $(call STATICLIB,foo)
$(call RUN,bar)

else
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-make/lto-smoke-c/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ CC := $(CC:-g=)

all:
$(RUSTC) foo.rs -C lto
$(CC) bar.c $(TMPDIR)/libfoo.a \
$(CC) bar.c $(call STATICLIB,foo) \
$(call OUT_EXE,bar) \
$(EXTRACFLAGS) $(EXTRACXXFLAGS)
$(call RUN,bar)
8 changes: 4 additions & 4 deletions src/test/run-make/output-type-permutations/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,8 +4,8 @@ all:
$(RUSTC) foo.rs --crate-type=rlib,dylib,staticlib
$(call REMOVE_RLIBS,bar)
$(call REMOVE_DYLIBS,bar)
rm $(TMPDIR)/libbar.a
rm -f $(TMPDIR)/bar.{exp,lib,pdb}
rm $(call STATICLIB,bar)
rm -f $(TMPDIR)/bar.{dll.exp,dll.lib,pdb}
# Check that $(TMPDIR) is empty.
[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]

Expand Down Expand Up @@ -78,7 +78,7 @@ all:
rm $(TMPDIR)/$(call BIN,foo)
$(RUSTC) foo.rs --crate-type=dylib --emit=link=$(TMPDIR)/$(call BIN,foo)
rm $(TMPDIR)/$(call BIN,foo)
rm -f $(TMPDIR)/foo.{exp,lib,pdb}
rm -f $(TMPDIR)/foo.{dll.exp,dll.lib,pdb}
[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]

$(RUSTC) foo.rs --crate-type=staticlib -o $(TMPDIR)/foo
Expand Down Expand Up @@ -133,7 +133,7 @@ all:
rm $(TMPDIR)/bar.ll
rm $(TMPDIR)/bar.s
rm $(TMPDIR)/bar.o
rm $(TMPDIR)/libbar.a
rm $(call STATICLIB,bar)
mv $(TMPDIR)/bar.bc $(TMPDIR)/foo.bc
# Don't check that the $(TMPDIR) is empty - we left `foo.bc` for later
# comparison.
Expand Down
2 changes: 1 addition & 1 deletion src/test/run-make/static-dylib-by-default/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@

TO_LINK := $(call DYLIB,bar)
ifdef IS_MSVC
LINK_ARG = $(TO_LINK:dll=lib)
LINK_ARG = $(TO_LINK:dll=dll.lib)
else
LINK_ARG = $(TO_LINK)
endif
Expand Down

0 comments on commit 34b4e66

Please sign in to comment.