Auto merge of #29520 - retep998:staticlib-naming-fiasco, r=alexcrichton
I'm not sure if this was the best way to go about it, but it seems to work. Fixes https://github.com/rust-lang/rust/issues/29508 r? @alexcrichton
This commit is contained in:
commit
34b4e66736
|
@ -388,11 +388,12 @@ impl<'a> Context<'a> {
|
||||||
}
|
}
|
||||||
|
|
||||||
let dypair = self.dylibname();
|
let dypair = self.dylibname();
|
||||||
|
let staticpair = self.staticlibname();
|
||||||
|
|
||||||
// want: crate_name.dir_part() + prefix + crate_name.file_part + "-"
|
// want: crate_name.dir_part() + prefix + crate_name.file_part + "-"
|
||||||
let dylib_prefix = format!("{}{}", dypair.0, self.crate_name);
|
let dylib_prefix = format!("{}{}", dypair.0, self.crate_name);
|
||||||
let rlib_prefix = format!("lib{}", 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 candidates = HashMap::new();
|
||||||
let mut staticlibs = vec!();
|
let mut staticlibs = vec!();
|
||||||
|
@ -425,7 +426,7 @@ impl<'a> Context<'a> {
|
||||||
false)
|
false)
|
||||||
} else {
|
} else {
|
||||||
if file.starts_with(&staticlib_prefix[..]) &&
|
if file.starts_with(&staticlib_prefix[..]) &&
|
||||||
file.ends_with(".a") {
|
file.ends_with(&staticpair.1) {
|
||||||
staticlibs.push(CrateMismatch {
|
staticlibs.push(CrateMismatch {
|
||||||
path: path.to_path_buf(),
|
path: path.to_path_buf(),
|
||||||
got: "static".to_string()
|
got: "static".to_string()
|
||||||
|
@ -644,6 +645,13 @@ impl<'a> Context<'a> {
|
||||||
(t.options.dll_prefix.clone(), t.options.dll_suffix.clone())
|
(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> {
|
fn find_commandline_library(&mut self, locs: &[String]) -> Option<Library> {
|
||||||
// First, filter out all libraries that look suspicious. We only accept
|
// First, filter out all libraries that look suspicious. We only accept
|
||||||
// files which actually exist that have the correct naming scheme for
|
// files which actually exist that have the correct naming scheme for
|
||||||
|
|
|
@ -490,7 +490,10 @@ pub fn filename_for_input(sess: &Session,
|
||||||
suffix))
|
suffix))
|
||||||
}
|
}
|
||||||
config::CrateTypeStaticlib => {
|
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 => {
|
config::CrateTypeExecutable => {
|
||||||
let suffix = &sess.target.target.options.exe_suffix;
|
let suffix = &sess.target.target.options.exe_suffix;
|
||||||
|
|
|
@ -210,7 +210,14 @@ impl<'a> Linker for MsvcLinker<'a> {
|
||||||
fn link_rlib(&mut self, lib: &Path) { self.cmd.arg(lib); }
|
fn link_rlib(&mut self, lib: &Path) { self.cmd.arg(lib); }
|
||||||
fn add_object(&mut self, path: &Path) { self.cmd.arg(path); }
|
fn add_object(&mut self, path: &Path) { self.cmd.arg(path); }
|
||||||
fn args(&mut self, args: &[String]) { self.cmd.args(args); }
|
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 gc_sections(&mut self, _is_dylib: bool) { self.cmd.arg("/OPT:REF,ICF"); }
|
||||||
|
|
||||||
fn link_dylib(&mut self, lib: &str) {
|
fn link_dylib(&mut self, lib: &str) {
|
||||||
|
@ -222,7 +229,7 @@ impl<'a> Linker for MsvcLinker<'a> {
|
||||||
// `foo.lib` file if the dll doesn't actually export any symbols, so we
|
// `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
|
// check to see if the file is there and just omit linking to it if it's
|
||||||
// not present.
|
// not present.
|
||||||
let name = format!("{}.lib", lib);
|
let name = format!("{}.dll.lib", lib);
|
||||||
if fs::metadata(&path.join(&name)).is_ok() {
|
if fs::metadata(&path.join(&name)).is_ok() {
|
||||||
self.cmd.arg(name);
|
self.cmd.arg(name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,7 +7,7 @@ all: $(TMPDIR)/$(call BIN,bar)
|
||||||
|
|
||||||
ifdef IS_MSVC
|
ifdef IS_MSVC
|
||||||
$(TMPDIR)/$(call BIN,bar): $(call DYLIB,foo)
|
$(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
|
else
|
||||||
$(TMPDIR)/$(call BIN,bar): $(call DYLIB,foo)
|
$(TMPDIR)/$(call BIN,bar): $(call DYLIB,foo)
|
||||||
$(CC) bar.c -lfoo -o $(call RUN_BINFILE,bar) -L $(TMPDIR)
|
$(CC) bar.c -lfoo -o $(call RUN_BINFILE,bar) -L $(TMPDIR)
|
||||||
|
|
|
@ -4,11 +4,10 @@
|
||||||
ifneq ($(shell uname),FreeBSD)
|
ifneq ($(shell uname),FreeBSD)
|
||||||
all:
|
all:
|
||||||
$(RUSTC) foo.rs
|
$(RUSTC) foo.rs
|
||||||
cp $(TMPDIR)/libfoo.a $(call NATIVE_STATICLIB,foo2)
|
$(CC) bar.c $(call STATICLIB,foo) $(call OUT_EXE,bar) \
|
||||||
$(CC) bar.c $(call NATIVE_STATICLIB,foo2) $(call OUT_EXE,bar) \
|
|
||||||
$(EXTRACFLAGS) $(EXTRACXXFLAGS)
|
$(EXTRACFLAGS) $(EXTRACXXFLAGS)
|
||||||
$(call RUN,bar)
|
$(call RUN,bar)
|
||||||
rm $(call STATICLIB,foo*)
|
rm $(call STATICLIB,foo)
|
||||||
$(call RUN,bar)
|
$(call RUN,bar)
|
||||||
|
|
||||||
else
|
else
|
||||||
|
|
|
@ -5,7 +5,7 @@ CC := $(CC:-g=)
|
||||||
|
|
||||||
all:
|
all:
|
||||||
$(RUSTC) foo.rs -C lto
|
$(RUSTC) foo.rs -C lto
|
||||||
$(CC) bar.c $(TMPDIR)/libfoo.a \
|
$(CC) bar.c $(call STATICLIB,foo) \
|
||||||
$(call OUT_EXE,bar) \
|
$(call OUT_EXE,bar) \
|
||||||
$(EXTRACFLAGS) $(EXTRACXXFLAGS)
|
$(EXTRACFLAGS) $(EXTRACXXFLAGS)
|
||||||
$(call RUN,bar)
|
$(call RUN,bar)
|
||||||
|
|
|
@ -4,8 +4,8 @@ all:
|
||||||
$(RUSTC) foo.rs --crate-type=rlib,dylib,staticlib
|
$(RUSTC) foo.rs --crate-type=rlib,dylib,staticlib
|
||||||
$(call REMOVE_RLIBS,bar)
|
$(call REMOVE_RLIBS,bar)
|
||||||
$(call REMOVE_DYLIBS,bar)
|
$(call REMOVE_DYLIBS,bar)
|
||||||
rm $(TMPDIR)/libbar.a
|
rm $(call STATICLIB,bar)
|
||||||
rm -f $(TMPDIR)/bar.{exp,lib,pdb}
|
rm -f $(TMPDIR)/bar.{dll.exp,dll.lib,pdb}
|
||||||
# Check that $(TMPDIR) is empty.
|
# Check that $(TMPDIR) is empty.
|
||||||
[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
|
[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
|
||||||
|
|
||||||
|
@ -78,7 +78,7 @@ all:
|
||||||
rm $(TMPDIR)/$(call BIN,foo)
|
rm $(TMPDIR)/$(call BIN,foo)
|
||||||
$(RUSTC) foo.rs --crate-type=dylib --emit=link=$(TMPDIR)/$(call BIN,foo)
|
$(RUSTC) foo.rs --crate-type=dylib --emit=link=$(TMPDIR)/$(call BIN,foo)
|
||||||
rm $(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" ]
|
[ "$$(ls -1 $(TMPDIR) | wc -l)" -eq "0" ]
|
||||||
|
|
||||||
$(RUSTC) foo.rs --crate-type=staticlib -o $(TMPDIR)/foo
|
$(RUSTC) foo.rs --crate-type=staticlib -o $(TMPDIR)/foo
|
||||||
|
@ -133,7 +133,7 @@ all:
|
||||||
rm $(TMPDIR)/bar.ll
|
rm $(TMPDIR)/bar.ll
|
||||||
rm $(TMPDIR)/bar.s
|
rm $(TMPDIR)/bar.s
|
||||||
rm $(TMPDIR)/bar.o
|
rm $(TMPDIR)/bar.o
|
||||||
rm $(TMPDIR)/libbar.a
|
rm $(call STATICLIB,bar)
|
||||||
mv $(TMPDIR)/bar.bc $(TMPDIR)/foo.bc
|
mv $(TMPDIR)/bar.bc $(TMPDIR)/foo.bc
|
||||||
# Don't check that the $(TMPDIR) is empty - we left `foo.bc` for later
|
# Don't check that the $(TMPDIR) is empty - we left `foo.bc` for later
|
||||||
# comparison.
|
# comparison.
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
TO_LINK := $(call DYLIB,bar)
|
TO_LINK := $(call DYLIB,bar)
|
||||||
ifdef IS_MSVC
|
ifdef IS_MSVC
|
||||||
LINK_ARG = $(TO_LINK:dll=lib)
|
LINK_ARG = $(TO_LINK:dll=dll.lib)
|
||||||
else
|
else
|
||||||
LINK_ARG = $(TO_LINK)
|
LINK_ARG = $(TO_LINK)
|
||||||
endif
|
endif
|
||||||
|
|
Loading…
Reference in New Issue