Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Change name when outputting staticlibs on Windows #29520

Merged
merged 2 commits into from
Jan 21, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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();
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Can you add a comment here explaining why this flag is passed?

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