rustc: codegen: Build import library for all windows targets
So far it is assumed that using a DLL as a -l parameter argument is ok, but the assumption doesn't hold when compiling the native code with llvm. In which case, an import library is required, so let's build one This also requires the cargo counterpart to add the import library in the stamp files, at least when compiling libstd. Otherwise, the files don't get uplifted
This commit is contained in:
parent
eedf6ce4ef
commit
5af318bd56
3 changed files with 24 additions and 3 deletions
|
|
@ -1126,6 +1126,7 @@ pub fn run_cargo(builder: &Builder<'_>,
|
|||
// Skip files like executables
|
||||
if !filename.ends_with(".rlib") &&
|
||||
!filename.ends_with(".lib") &&
|
||||
!filename.ends_with(".a") &&
|
||||
!is_dylib(&filename) &&
|
||||
!(is_check && filename.ends_with(".rmeta")) {
|
||||
continue;
|
||||
|
|
|
|||
|
|
@ -368,6 +368,26 @@ impl<'a> Linker for GccLinker<'a> {
|
|||
}
|
||||
} else {
|
||||
self.cmd.arg("-shared");
|
||||
if self.sess.target.target.options.is_like_windows {
|
||||
// The output filename already contains `dll_suffix` so
|
||||
// the resulting import library will have a name in the
|
||||
// form of libfoo.dll.a
|
||||
let implib_name = out_filename
|
||||
.file_name()
|
||||
.and_then(|file| file.to_str())
|
||||
.map(|file| format!("{}{}{}",
|
||||
self.sess.target.target.options.staticlib_prefix,
|
||||
file,
|
||||
self.sess.target.target.options.staticlib_suffix));
|
||||
if let Some(implib_name) = implib_name {
|
||||
let implib = out_filename
|
||||
.parent()
|
||||
.map(|dir| dir.join(&implib_name));
|
||||
if let Some(implib) = implib {
|
||||
self.linker_arg(&format!("--out-implib,{}", (*implib).to_str().unwrap()));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -5,7 +5,7 @@ all:
|
|||
$(call REMOVE_RLIBS,bar)
|
||||
$(call REMOVE_DYLIBS,bar)
|
||||
rm $(call STATICLIB,bar)
|
||||
rm -f $(TMPDIR)/bar.{dll.exp,dll.lib,pdb}
|
||||
rm -f $(TMPDIR)/{lib,}bar.{dll.exp,dll.lib,pdb,dll.a}
|
||||
# Check that $(TMPDIR) is empty.
|
||||
[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
|
||||
|
||||
|
|
@ -78,8 +78,8 @@ 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.{dll.exp,dll.lib,pdb}
|
||||
[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
|
||||
rm -f $(TMPDIR)/{lib,}foo.{dll.exp,dll.lib,pdb,dll.a,exe.lib}
|
||||
[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ] || (ls -1 $(TMPDIR) && exit 1)
|
||||
|
||||
$(RUSTC) foo.rs --crate-type=staticlib -o $(TMPDIR)/foo
|
||||
rm $(TMPDIR)/foo
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue