You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
rust-zstd-sys/0001-unconditionally-use-bi...

262 lines
8.8 KiB

From 94271fbfcdafac911bfa9ec7bdfee7c33f6423c4 Mon Sep 17 00:00:00 2001
From: Fabio Valentini <decathorpe@gmail.com>
Date: Tue, 1 Aug 2023 15:13:34 +0200
Subject: [PATCH] unconditionally use bindgen and pkg-config to link against
system libzstd
---
build.rs | 210 +------------------------------------------------------
1 file changed, 3 insertions(+), 207 deletions(-)
diff --git a/build.rs b/build.rs
index a77a10e..e748b4b 100644
--- a/build.rs
+++ b/build.rs
@@ -1,8 +1,6 @@
-use std::ffi::OsStr;
-use std::path::{Path, PathBuf};
-use std::{env, fmt, fs};
+use std::path::PathBuf;
+use std::{env, fmt};
-#[cfg(feature = "bindgen")]
fn generate_bindings(defs: Vec<&str>, headerpaths: Vec<PathBuf>) {
let bindings = bindgen::Builder::default().header("zstd.h");
#[cfg(feature = "zdict_builder")]
@@ -35,9 +33,6 @@ fn generate_bindings(defs: Vec<&str>, headerpaths: Vec<PathBuf>) {
.expect("Could not write bindings");
}
-#[cfg(not(feature = "bindgen"))]
-fn generate_bindings(_: Vec<&str>, _: Vec<PathBuf>) {}
-
fn pkg_config() -> (Vec<&'static str>, Vec<PathBuf>) {
let library = pkg_config::Config::new()
.statik(true)
@@ -47,31 +42,6 @@ fn pkg_config() -> (Vec<&'static str>, Vec<PathBuf>) {
(vec!["PKG_CONFIG"], library.include_paths)
}
-#[cfg(not(feature = "legacy"))]
-fn set_legacy(_config: &mut cc::Build) {}
-
-#[cfg(feature = "legacy")]
-fn set_legacy(config: &mut cc::Build) {
- config.define("ZSTD_LEGACY_SUPPORT", Some("1"));
- config.include("zstd/lib/legacy");
-}
-
-#[cfg(feature = "zstdmt")]
-fn set_pthread(config: &mut cc::Build) {
- config.flag("-pthread");
-}
-
-#[cfg(not(feature = "zstdmt"))]
-fn set_pthread(_config: &mut cc::Build) {}
-
-#[cfg(feature = "zstdmt")]
-fn enable_threading(config: &mut cc::Build) {
- config.define("ZSTD_MULTITHREAD", Some(""));
-}
-
-#[cfg(not(feature = "zstdmt"))]
-fn enable_threading(_config: &mut cc::Build) {}
-
/// This function would find the first flag in `flags` that is supported
/// and add that to `config`.
#[allow(dead_code)]
@@ -85,156 +55,6 @@ fn flag_if_supported_with_fallbacks(config: &mut cc::Build, flags: &[&str]) {
}
}
-fn compile_zstd() {
- let mut config = cc::Build::new();
-
- // Search the following directories for C files to add to the compilation.
- for dir in &[
- "zstd/lib/common",
- "zstd/lib/compress",
- "zstd/lib/decompress",
- #[cfg(feature = "zdict_builder")]
- "zstd/lib/dictBuilder",
- #[cfg(feature = "legacy")]
- "zstd/lib/legacy",
- ] {
- let mut entries: Vec<_> = fs::read_dir(dir)
- .unwrap()
- .map(Result::unwrap)
- .filter_map(|entry| {
- let filename = entry.file_name();
-
- if Path::new(&filename).extension() == Some(OsStr::new("c"))
- // Skip xxhash*.c files: since we are using the "PRIVATE API"
- // mode, it will be inlined in the headers.
- && !filename.to_string_lossy().contains("xxhash")
- {
- Some(entry.path())
- } else {
- None
- }
- })
- .collect();
- entries.sort();
-
- config.files(entries);
- }
-
- // Either include ASM files, or disable ASM entirely.
- // Also disable it on windows, apparently it doesn't do well with these .S files at the moment.
- if cfg!(feature = "no_asm") || std::env::var("CARGO_CFG_WINDOWS").is_ok() {
- config.define("ZSTD_DISABLE_ASM", Some(""));
- } else {
- config.file("zstd/lib/decompress/huf_decompress_amd64.S");
- }
-
- // List out the WASM targets that need wasm-shim.
- // Note that Emscripten already provides its own C standard library so
- // wasm32-unknown-emscripten should not be included here.
- // See: https://github.com/gyscos/zstd-rs/pull/209
- let need_wasm_shim = env::var("TARGET").map_or(false, |target| {
- target == "wasm32-unknown-unknown" || target == "wasm32-wasi"
- });
-
- if need_wasm_shim {
- cargo_print(&"rerun-if-changed=wasm-shim/stdlib.h");
- cargo_print(&"rerun-if-changed=wasm-shim/string.h");
-
- config.include("wasm-shim/");
- config.define("XXH_STATIC_ASSERT", Some("0"));
- }
-
- // Some extra parameters
- config.include("zstd/lib/");
- config.include("zstd/lib/common");
- config.warnings(false);
-
- config.define("ZSTD_LIB_DEPRECATED", Some("0"));
-
- config
- .flag_if_supported("-ffunction-sections")
- .flag_if_supported("-fdata-sections")
- .flag_if_supported("-fmerge-all-constants");
-
- if cfg!(feature = "fat-lto") {
- config.flag_if_supported("-flto");
- } else if cfg!(feature = "thin-lto") {
- flag_if_supported_with_fallbacks(
- &mut config,
- &["-flto=thin", "-flto"],
- );
- }
-
- #[cfg(feature = "thin")]
- {
- // Here we try to build a lib as thin/small as possible.
- // We cannot use ZSTD_LIB_MINIFY since it is only
- // used in Makefile to define other options.
-
- config
- .define("HUF_FORCE_DECOMPRESS_X1", Some("1"))
- .define("ZSTD_FORCE_DECOMPRESS_SEQUENCES_SHORT", Some("1"))
- .define("ZSTD_NO_INLINE", Some("1"))
- // removes the error messages that are
- // otherwise returned by ZSTD_getErrorName
- .define("ZSTD_STRIP_ERROR_STRINGS", Some("1"));
-
- // Disable use of BMI2 instructions since it involves runtime checking
- // of the feature and fallback if no BMI2 instruction is detected.
- config.define("DYNAMIC_BMI2", Some("0"));
-
- // Disable support for all legacy formats
- #[cfg(not(feature = "legacy"))]
- config.define("ZSTD_LEGACY_SUPPORT", Some("0"));
-
- config.opt_level_str("z");
- }
-
- // Hide symbols from resulting library,
- // so we can be used with another zstd-linking lib.
- // See https://github.com/gyscos/zstd-rs/issues/58
- config.flag("-fvisibility=hidden");
- config.define("XXH_PRIVATE_API", Some(""));
- config.define("ZSTDLIB_VISIBILITY", Some(""));
- #[cfg(feature = "zdict_builder")]
- config.define("ZDICTLIB_VISIBILITY", Some(""));
- config.define("ZSTDERRORLIB_VISIBILITY", Some(""));
-
- // https://github.com/facebook/zstd/blob/d69d08ed6c83563b57d98132e1e3f2487880781e/lib/common/debug.h#L60
- /* recommended values for DEBUGLEVEL :
- * 0 : release mode, no debug, all run-time checks disabled
- * 1 : enables assert() only, no display
- * 2 : reserved, for currently active debug path
- * 3 : events once per object lifetime (CCtx, CDict, etc.)
- * 4 : events once per frame
- * 5 : events once per block
- * 6 : events once per sequence (verbose)
- * 7+: events at every position (*very* verbose)
- */
- #[cfg(feature = "debug")]
- if !is_wasm {
- config.define("DEBUGLEVEL", Some("5"));
- }
-
- set_pthread(&mut config);
- set_legacy(&mut config);
- enable_threading(&mut config);
-
- // Compile!
- config.compile("libzstd.a");
-
- let src = env::current_dir().unwrap().join("zstd").join("lib");
- let dst = PathBuf::from(env::var_os("OUT_DIR").unwrap());
- let include = dst.join("include");
- fs::create_dir_all(&include).unwrap();
- fs::copy(src.join("zstd.h"), include.join("zstd.h")).unwrap();
- fs::copy(src.join("zstd_errors.h"), include.join("zstd_errors.h"))
- .unwrap();
- #[cfg(feature = "zdict_builder")]
- fs::copy(src.join("zdict.h"), include.join("zdict.h")).unwrap();
- cargo_print(&format_args!("root={}", dst.display()));
-}
-
/// Print a line for cargo.
///
/// If non-cargo is set, do not print anything.
@@ -247,32 +67,8 @@ fn cargo_print(content: &dyn fmt::Display) {
fn main() {
cargo_print(&"rerun-if-env-changed=ZSTD_SYS_USE_PKG_CONFIG");
- let target_arch =
- std::env::var("CARGO_CFG_TARGET_ARCH").unwrap_or_default();
- let target_os = std::env::var("CARGO_CFG_TARGET_OS").unwrap_or_default();
-
- if target_arch == "wasm32" || target_os == "hermit" {
- cargo_print(&"rustc-cfg=feature=\"std\"");
- }
-
// println!("cargo:rustc-link-lib=zstd");
- let (defs, headerpaths) = if cfg!(feature = "pkg-config")
- || env::var_os("ZSTD_SYS_USE_PKG_CONFIG").is_some()
- {
- pkg_config()
- } else {
- if !Path::new("zstd/lib").exists() {
- panic!("Folder 'zstd/lib' does not exists. Maybe you forgot to clone the 'zstd' submodule?");
- }
-
- let manifest_dir = PathBuf::from(
- env::var_os("CARGO_MANIFEST_DIR")
- .expect("Manifest dir is always set by cargo"),
- );
-
- compile_zstd();
- (vec![], vec![manifest_dir.join("zstd/lib")])
- };
+ let (defs, headerpaths) = pkg_config();
let includes: Vec<_> = headerpaths
.iter()
--
2.41.0