Auto merge of #85554 - 12101111:fix-dedup-native-libs, r=petrochenkov

native lib: defer the duplicate check after relevant_lib check.

https://github.com/rust-lang/rust/pull/84794 break code using conditional-compilation with `#[link]` attributes.

```rust
#[cfg(target_env = "musl")]
cfg_if::cfg_if! {
    if #[cfg(any(target_feature = "crt-static", feature = "llvm-libunwind"))] {
        #[link(name = "unwind", kind = "static", modifiers = "-bundle")]
        extern "C" {}
    } else {
        #[link(name = "unwind", cfg(feature = "system-llvm-libunwind"))]
        #[link(name = "gcc_s", cfg(not(feature = "system-llvm-libunwind")))]
        extern "C" {}
    }
}

```
This commit is contained in:
bors 2021-05-23 19:42:19 +00:00
commit f64503eb55
6 changed files with 44 additions and 6 deletions

View File

@ -1805,13 +1805,14 @@ fn add_local_native_libraries(
let search_path = archive_search_paths(sess);
let mut last = (NativeLibKind::Unspecified, None);
for lib in relevant_libs {
// Skip if this library is the same as the last.
last = if (lib.kind, lib.name) == last { continue } else { (lib.kind, lib.name) };
let name = match lib.name {
Some(l) => l,
None => continue,
};
// Skip if this library is the same as the last.
last = if (lib.kind, lib.name) == last { continue } else { (lib.kind, lib.name) };
let verbatim = lib.verbatim.unwrap_or(false);
match lib.kind {
NativeLibKind::Dylib { as_needed } => {
@ -2144,9 +2145,6 @@ fn add_upstream_native_libraries(
let mut last = (NativeLibKind::Unspecified, None);
for &(cnum, _) in crates {
for lib in codegen_results.crate_info.native_libraries[&cnum].iter() {
// Skip if this library is the same as the last.
last = if (lib.kind, lib.name) == last { continue } else { (lib.kind, lib.name) };
let name = match lib.name {
Some(l) => l,
None => continue,
@ -2154,6 +2152,10 @@ fn add_upstream_native_libraries(
if !relevant_lib(sess, &lib) {
continue;
}
// Skip if this library is the same as the last.
last = if (lib.kind, lib.name) == last { continue } else { (lib.kind, lib.name) };
let verbatim = lib.verbatim.unwrap_or(false);
match lib.kind {
NativeLibKind::Dylib { as_needed } => {

View File

@ -0,0 +1,12 @@
# ignore-msvc
-include ../tools.mk
all:
$(RUSTC) depa.rs
$(RUSTC) depb.rs
$(RUSTC) depc.rs
$(RUSTC) empty.rs --cfg bar 2>&1 | $(CGREP) '"-ltesta" "-ltestb" "-ltesta"'
$(RUSTC) empty.rs 2>&1 | $(CGREP) '"-ltesta"'
$(RUSTC) empty.rs 2>&1 | $(CGREP) -v '"-ltestb"'
$(RUSTC) empty.rs 2>&1 | $(CGREP) -v '"-ltesta" "-ltesta"'

View File

@ -0,0 +1,7 @@
#![crate_type = "rlib"]
#[link(name = "testa")]
extern "C" {}
#[link(name = "testa")]
extern "C" {}

View File

@ -0,0 +1,8 @@
#![feature(link_cfg)]
#![crate_type = "rlib"]
#[link(name = "testb", cfg(foo))]
extern "C" {}
#[link(name = "testb", cfg(bar))]
extern "C" {}

View File

@ -0,0 +1,4 @@
#![crate_type = "rlib"]
#[link(name = "testa")]
extern "C" {}

View File

@ -0,0 +1,5 @@
extern crate depa;
extern crate depb;
extern crate depc;
fn main() {}