Skip to content

Commit

Permalink
Use .link_lib_modifier() from latest cc version
Browse files Browse the repository at this point in the history
rust-lang/cc-rs#671 has now been merged and
released, so a247218 is now unncessary.
  • Loading branch information
Wilfred committed Dec 31, 2022
1 parent 23ef083 commit 7e560ec
Show file tree
Hide file tree
Showing 3 changed files with 16 additions and 56 deletions.
4 changes: 2 additions & 2 deletions Cargo.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

2 changes: 1 addition & 1 deletion Cargo.toml
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,7 @@ term_size = "0.3.2"
pretty_assertions = "1.2.1"

[build-dependencies]
cc = "1.0.73"
cc = "1.0.78"
rayon = "1.5.2"
version_check = "0.9.4"

Expand Down
66 changes: 13 additions & 53 deletions build.rs
Original file line number Diff line number Diff line change
Expand Up @@ -16,59 +16,13 @@ struct TreeSitterParser {
extra_files: Vec<&'static str>,
}

/// Emit linking flags for this library, but specify `+whole-archive`.
///
/// This should be possible in the cc crate directly after
/// https://github.com/rust-lang/cc-rs/pull/671
fn emit_whole_archive_link_flags(build: &mut cc::Build, lib_name: &str, is_cpp: bool) {
if rustc::is_max_version("1.60.0").unwrap_or(false) {
// whole-archive was only stabilised in 1.61, and we don't
// need it in earlier versions.
return;
}

build.cargo_metadata(false);

println!("cargo:rustc-link-lib=static:+whole-archive={}", lib_name);
println!(
"cargo:rustc-link-search=native={}",
std::env::var("OUT_DIR").expect("did not set OUT_DIR")
);

if is_cpp {
let cpp_stdlib = if let Ok(stdlib) = std::env::var("CXXSTDLIB") {
if stdlib.is_empty() {
None
} else {
Some(stdlib)
}
} else {
let target = std::env::var("TARGET").expect("TARGET environment should be set");

// Equivalent to https://github.com/rust-lang/cc-rs/blob/53fb72c87e5769a299f1886ead831901b9c775d6/src/lib.rs#L2528
if target.contains("msvc") {
None
} else if target.contains("apple") {
Some("c++".to_string())
} else if target.contains("freebsd") {
Some("c++".to_string())
} else if target.contains("openbsd") {
Some("c++".to_string())
} else if target.contains("android") {
Some("c++_shared".to_string())
} else {
Some("stdc++".to_string())
}
};

if let Some(cpp_stdlib) = cpp_stdlib {
println!("cargo:rustc-link-lib={}", cpp_stdlib);
}
}
}

impl TreeSitterParser {
fn build(&self) {
// In rustc 1.61+, we need to specify +whole-archive.
// See https://github.com/rust-lang/rust/blob/1.61.0/RELEASES.md#compatibility-notes
// and https://github.com/Wilfred/difftastic/issues/339.
let rustc_supports_whole_archive = !rustc::is_max_version("1.60.0").unwrap_or(false);

let dir = PathBuf::from(&self.src_dir);

let mut c_files = vec!["parser.c"];
Expand Down Expand Up @@ -110,7 +64,10 @@ impl TreeSitterParser {
cpp_build.file(dir.join(file));
}

emit_whole_archive_link_flags(&mut cpp_build, &format!("{}-cpp", self.name), true);
if rustc_supports_whole_archive {
cpp_build.link_lib_modifier("+whole-archive");
}

cpp_build.compile(&format!("{}-cpp", self.name));
}

Expand All @@ -123,7 +80,10 @@ impl TreeSitterParser {
build.file(dir.join(file));
}

emit_whole_archive_link_flags(&mut build, self.name, false);
if rustc_supports_whole_archive {
build.link_lib_modifier("+whole-archive");
}

build.compile(self.name);
}
}
Expand Down

0 comments on commit 7e560ec

Please sign in to comment.