From 36ffeb63f16129f8548d5da232d768201fce701a Mon Sep 17 00:00:00 2001 From: Meng Zhang Date: Tue, 31 Oct 2023 17:58:21 -0700 Subject: [PATCH] refactor: remove useless rust-cxx-cmake-bridge --- Cargo.lock | 4 - Cargo.toml | 1 - crates/rust-cxx-cmake-bridge/Cargo.toml | 8 - crates/rust-cxx-cmake-bridge/src/lib.rs | 267 ------------------------ 4 files changed, 280 deletions(-) delete mode 100644 crates/rust-cxx-cmake-bridge/Cargo.toml delete mode 100644 crates/rust-cxx-cmake-bridge/src/lib.rs diff --git a/Cargo.lock b/Cargo.lock index d7c95dc..d0e8976 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2356,10 +2356,6 @@ dependencies = [ "serde", ] -[[package]] -name = "rust-cxx-cmake-bridge" -version = "0.5.0-dev" - [[package]] name = "rust-embed" version = "6.6.1" diff --git a/Cargo.toml b/Cargo.toml index 8dbdbe6..33506af 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -6,7 +6,6 @@ members = [ "crates/tabby-scheduler", "crates/tabby-download", "crates/tabby-inference", - "crates/rust-cxx-cmake-bridge", "crates/llama-cpp-bindings", "crates/http-api-bindings", ] diff --git a/crates/rust-cxx-cmake-bridge/Cargo.toml b/crates/rust-cxx-cmake-bridge/Cargo.toml deleted file mode 100644 index 388e87f..0000000 --- a/crates/rust-cxx-cmake-bridge/Cargo.toml +++ /dev/null @@ -1,8 +0,0 @@ -[package] -name = "rust-cxx-cmake-bridge" -version = "0.5.0-dev" -edition = "2021" - -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html - -[dependencies] diff --git a/crates/rust-cxx-cmake-bridge/src/lib.rs b/crates/rust-cxx-cmake-bridge/src/lib.rs deleted file mode 100644 index 0883308..0000000 --- a/crates/rust-cxx-cmake-bridge/src/lib.rs +++ /dev/null @@ -1,267 +0,0 @@ -use std::{io::Write, path::PathBuf}; - -// ## lib_name: "protobufd" -// ## dir: "..../api_circuits/target/debug/build/lib-circuits-wrapper-49025516ce40925e/out/build/_deps/protobuf_fetch-build" -// rustc-link-search=native=..../api_circuits/target/debug/build/lib-circuits-wrapper-49025516ce40925e/out/build/_deps/protobuf_fetch-build -// rustc-link-lib=protobufd -// ## lib_name: "libyosys" -// ## dir: "..../api_circuits/target/debug/build/lib-circuits-wrapper-49025516ce40925e/out/build/_deps/yosys_fetch-build" -// rustc-link-search=native=..../api_circuits/target/debug/build/lib-circuits-wrapper-49025516ce40925e/out/build/_deps/yosys_fetch-build -// rustc-link-lib=libyosys -// ## lib_name: "xxhash" -// ## dir: "..../api_circuits/target/debug/build/lib-circuits-wrapper-49025516ce40925e/out/build/_deps/xxhash-build" -// rustc-link-search=native=..../api_circuits/target/debug/build/lib-circuits-wrapper-49025516ce40925e/out/build/_deps/xxhash-build -// rustc-link-lib=xxhash -fn parse_lib_path_dir_and_name(static_lib_str: &str) -> (PathBuf, String, bool, bool, bool) { - let static_lib_path = std::path::Path::new(static_lib_str); - - // NOTE: file_stem only split eg "libprotobufd.so.3.19.4.0" -> "libprotobufd.so.3.19.4" - // but that is NOT what we want (ie "libprotobufd") - // TODO use "file_prefix" https://github.com/rust-lang/rust/issues/86319 - let liblib_name = static_lib_path.my_file_prefix().unwrap(); - let liblib_name_str: String = liblib_name.to_str().unwrap().into(); - let lib_name_str = liblib_name_str - .strip_prefix("lib") - .unwrap_or(&liblib_name_str); - - // basically: - // - input = /.../target/debug/build/lib-circuits-wrapper-49025516ce40925e/out/build/_deps/glog-build/libglogd.so.0.6.0 - // - get the extension: a (or "so.3.19.4" or "so" etc) - // NOTE: extension DOES NOT work(same issue than file_stem) - // eg ".../libglogd.so.0.6.0".extension() == "0" (ie the part after the last dot) - // and we NEED "so" (ie the part after the FIRST dot) - let file_with_ext = static_lib_path.file_name().unwrap(); - let full_ext = file_with_ext - .to_str() - .unwrap() - .trim_start_matches(&liblib_name_str); - let is_static = full_ext.starts_with(".a"); - - let dir = static_lib_path.parent().unwrap(); - - // COULD probably have a more foolproof system by using the IMPORTED property in CMake - // and writing that to a different file(or the same one with a prefix/suffix?) - // NOTE: be sure that the prefix does not conflict with the Dockerfile WORKDIR /usr/src/app - let is_system = dir.starts_with("/usr/lib/"); - - let is_framework = static_lib_str.ends_with(".framework"); - - ( - dir.to_path_buf(), - lib_name_str.to_string(), - is_static, - is_system, - is_framework, - ) -} - -// Parse the content of "cmake_generated_rust_wrapper_libs" which SHOULD have -// been generated by our CMake function. -// It is expected to contain a list of space separated libraries eg: -// "/full/path/build/liblib1.so /full/path/build/liblib2.a /usr/lib/x86_64-linux-gnu/libpng16.so.16.37.0" -// etc -fn read_cmake_generated_to_output( - cmake_generated_rust_wrapper_libs_str: &str, - output: &mut impl Write, -) { - // Previous version was globing all .a and .so in the build dir but it only worked for SHARED dependencies. - // That is b/c when linking STATIC libs order matters! So we must get a proper list from CMake. - for static_lib_str in cmake_generated_rust_wrapper_libs_str - .split(&[' ', '\n'][..]) - .filter(|&x| !x.is_empty()) - { - let (dir, lib_name_str, is_static, is_system, is_framework) = - parse_lib_path_dir_and_name(static_lib_str); - // WARNING: we MUST add to the linker path: - // - NON system libs (obviously) wether SHARED or STATIC - // - system STATIC libs eg /usr/lib/x86_64-linux-gnu/libboost_filesystem.a else - // "error: could not find native static library `boost_filesystem`, perhaps an -L flag is missing?" - if (!is_system && !is_framework) || is_static { - writeln!(output, "cargo:rustc-link-search=native={}", dir.display()).unwrap(); - } - - writeln!( - output, - "cargo:rustc-link-lib={}={}", - if is_framework { - "framework" - } else if is_static { - "static" - } else { - "dylib" - }, - lib_name_str - ) - .unwrap(); - } -} - -pub fn read_cmake_generated(cmake_generated_rust_wrapper_libs_str: &str) { - read_cmake_generated_to_output( - cmake_generated_rust_wrapper_libs_str, - &mut std::io::stdout(), - ) -} - -//////////////////////////////////////////////////////////////////////////////// -/// TEMP -/// Implement "file_prefix" -/// copy pasted from https://github.com/rust-lang/rust/issues/86319 -use std::ffi::OsStr; - -trait HasMyFilePrefix { - fn my_file_prefix(&self) -> Option<&OsStr>; -} - -impl HasMyFilePrefix for std::path::Path { - fn my_file_prefix(&self) -> Option<&OsStr> { - self.file_name() - .map(split_file_at_dot) - .map(|(before, _after)| before) - } -} - -fn split_file_at_dot(file: &OsStr) -> (&OsStr, Option<&OsStr>) { - let slice = os_str_as_u8_slice(file); - if slice == b".." { - return (file, None); - } - - // The unsafety here stems from converting between &OsStr and &[u8] - // and back. This is safe to do because (1) we only look at ASCII - // contents of the encoding and (2) new &OsStr values are produced - // only from ASCII-bounded slices of existing &OsStr values. - let i = match slice[1..].iter().position(|b| *b == b'.') { - Some(i) => i + 1, - None => return (file, None), - }; - let before = &slice[..i]; - let after = &slice[i + 1..]; - unsafe { (u8_slice_as_os_str(before), Some(u8_slice_as_os_str(after))) } -} - -fn os_str_as_u8_slice(s: &OsStr) -> &[u8] { - unsafe { &*(s as *const OsStr as *const [u8]) } -} -unsafe fn u8_slice_as_os_str(s: &[u8]) -> &OsStr { - // SAFETY: see the comment of `os_str_as_u8_slice` - { - &*(s as *const [u8] as *const OsStr) - } -} - -//////////////////////////////////////////////////////////////////////////////// - -#[cfg(test)] -mod tests { - use crate::{parse_lib_path_dir_and_name, read_cmake_generated_to_output}; - - #[test] - fn parse_local_lib_static_ok() { - let (dir, lib_name_str, is_static, is_system, is_framework) = - parse_lib_path_dir_and_name("/some/path/liblibstatic.a"); - assert_eq!(dir.as_os_str(), "/some/path"); - assert_eq!(lib_name_str, "libstatic"); - assert!(is_static); - assert!(!is_system); - assert!(!is_framework); - } - - #[test] - fn parse_local_lib_shared_ok() { - let (dir, lib_name_str, is_static, is_system, is_framework) = - parse_lib_path_dir_and_name("/some/path/liblibshared.so"); - assert_eq!(dir.as_os_str(), "/some/path"); - assert_eq!(lib_name_str, "libshared"); - assert!(!is_static); - assert!(!is_system); - assert!(!is_framework); - } - - #[test] - fn parse_local_lib_shared_with_soversion_ok() { - let (dir, lib_name_str, is_static, is_system, is_framework) = - parse_lib_path_dir_and_name("/some/path/liblibshared.so.1.2.3"); - assert_eq!(dir.as_os_str(), "/some/path"); - assert_eq!(lib_name_str, "libshared"); - assert!(!is_static); - assert!(!is_system); - assert!(!is_framework); - } - - #[test] - fn parse_system_lib_static_ok() { - let (dir, lib_name_str, is_static, is_system, is_framework) = - parse_lib_path_dir_and_name("/usr/lib/libsystem1.a"); - assert_eq!(dir.as_os_str(), "/usr/lib"); - assert_eq!(lib_name_str, "system1"); - assert!(is_static); - assert!(is_system); - assert!(!is_framework); - } - - #[test] - fn parse_system_lib_shared_ok() { - let (dir, lib_name_str, is_static, is_system, is_framework) = - parse_lib_path_dir_and_name("/usr/lib/libsystem2.so"); - assert_eq!(dir.as_os_str(), "/usr/lib"); - assert_eq!(lib_name_str, "system2"); - assert!(!is_static); - assert!(is_system); - assert!(!is_framework); - } - - #[test] - fn parse_framework_ok() { - let (dir, lib_name_str, is_static, is_system, is_framework) = - parse_lib_path_dir_and_name("/AAA/BBB.framework"); - assert_eq!(dir.as_os_str(), "/AAA"); - assert_eq!(lib_name_str, "BBB"); - assert!(!is_static); - assert!(!is_system); - assert!(is_framework); - } - - #[test] - fn test_read_cmake_generated_to_output() { - let input = "/some/libA.a /some/libB.so"; - let mut stdout = Vec::new(); - read_cmake_generated_to_output(input, &mut stdout); - - assert_eq!( - std::str::from_utf8(&stdout).unwrap(), - "cargo:rustc-link-search=native=/some\n\ - cargo:rustc-link-lib=static=A\n\ - cargo:rustc-link-search=native=/some\n\ - cargo:rustc-link-lib=dylib=B\n" - ); - } - - // no need to touch "rustc-link-search" to link with eg "/usr/lib/x86_64-linux-gnu/libpng16.so.16.37.0" - // simply "cargo:rustc-link-lib=dylib=png16.so" is OK - #[test] - fn test_read_cmake_generated_to_output_system_shared_no_rustc_link_search() { - let input = "/usr/lib/x86_64-linux-gnu/libpng16.so.16.37.0"; - let mut stdout = Vec::new(); - read_cmake_generated_to_output(input, &mut stdout); - - assert_eq!( - std::str::from_utf8(&stdout).unwrap(), - "cargo:rustc-link-lib=dylib=png16\n" - ); - } - - // BUT system STATIC libs require "rustc-link-search"?? - #[test] - fn test_read_cmake_generated_to_output_system_static_rustc_link_search() { - let input = "/usr/lib/x86_64-linux-gnu/libpng16.a"; - let mut stdout = Vec::new(); - read_cmake_generated_to_output(input, &mut stdout); - - assert_eq!( - std::str::from_utf8(&stdout).unwrap(), - "cargo:rustc-link-search=native=/usr/lib/x86_64-linux-gnu\n\ - cargo:rustc-link-lib=static=png16\n" - ); - } -}