From 5d99ad803b49e9a765e37f3108930d02e6150a4f Mon Sep 17 00:00:00 2001 From: Lattice 0 Date: Wed, 22 Jun 2022 21:35:39 +0000 Subject: [PATCH 1/5] adds proper dynamic linking --- build.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/build.rs b/build.rs index 876684c..8139161 100644 --- a/build.rs +++ b/build.rs @@ -287,8 +287,23 @@ fn dynamic_linking(env_vars: &EnvVars) { (ffmpeg_dll_name, ffmpeg_dll_path) }; - println!("cargo:rustc-link-lib=dylib={}", ffmpeg_dll_name); println!("cargo:rustc-link-search=native={}", ffmpeg_dll_dir); + for file in std::fs::read_dir(ffmpeg_dll_path).unwrap() { + let mut file_name = file.unwrap().file_name().into_string().unwrap(); + if file_name.contains(".so") + || file_name.contains(".dylib") + || file_name.contains(".dll") + { + file_name = file_name.replace("lib", ""); + file_name = file_name.replace(".so", ""); + file_name = file_name.replace(".dylib", ""); + file_name = file_name.replace(".dll", ""); + println!( + "cargo:rustc-link-lib=dylib={}", + file_name + ); + } + } if let Some(ffmpeg_binding_path) = env_vars.ffmpeg_binding_path.as_ref() { use_prebuilt_binding(ffmpeg_binding_path, output_binding_path); From 3b07184e7960ec41ac6b799f8319f3bc116074fe Mon Sep 17 00:00:00 2001 From: Lattice 0 Date: Wed, 22 Jun 2022 22:35:59 +0000 Subject: [PATCH 2/5] multi architecture build --- build.rs | 47 ++++++++++++++++++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 11 deletions(-) diff --git a/build.rs b/build.rs index 8139161..16d1a3e 100644 --- a/build.rs +++ b/build.rs @@ -170,6 +170,7 @@ pub struct EnvVars { out_dir: Option, ffmpeg_include_dir: Option, ffmpeg_dll_path: Option, + ffmpeg_multi_arch_build: Option, ffmpeg_pkg_config_path: Option, ffmpeg_libs_dir: Option, ffmpeg_binding_path: Option, @@ -192,6 +193,9 @@ impl EnvVars { ffmpeg_pkg_config_path: env::var("FFMPEG_PKG_CONFIG_PATH").ok().map(remove_verbatim), ffmpeg_libs_dir: env::var("FFMPEG_LIBS_DIR").ok().map(remove_verbatim), ffmpeg_binding_path: env::var("FFMPEG_BINDING_PATH").ok().map(remove_verbatim), + ffmpeg_multi_arch_build: env::var("FFMPEG_MULTI_ARCH_BUILD") + .ok() + .map(remove_verbatim), } } } @@ -287,21 +291,42 @@ fn dynamic_linking(env_vars: &EnvVars) { (ffmpeg_dll_name, ffmpeg_dll_path) }; - println!("cargo:rustc-link-search=native={}", ffmpeg_dll_dir); - for file in std::fs::read_dir(ffmpeg_dll_path).unwrap() { - let mut file_name = file.unwrap().file_name().into_string().unwrap(); - if file_name.contains(".so") - || file_name.contains(".dylib") - || file_name.contains(".dll") - { + let lib_name_filter = |mut file_name: String| -> Option { + if file_name.contains(".so") || file_name.contains(".dylib") || file_name.contains(".dll") { file_name = file_name.replace("lib", ""); file_name = file_name.replace(".so", ""); file_name = file_name.replace(".dylib", ""); file_name = file_name.replace(".dll", ""); - println!( - "cargo:rustc-link-lib=dylib={}", - file_name - ); + Some(file_name) + } else { + None + } + }; + println!("cargo:rustc-link-search=native={}", ffmpeg_dll_dir); + if env_vars.ffmpeg_multi_arch_build.as_ref().is_none() { + for file in std::fs::read_dir(ffmpeg_dll_path).unwrap() { + let file_name = file.unwrap().file_name().into_string().unwrap(); + let file_name = lib_name_filter(file_name); + if let Some(f) = file_name { + println!("cargo:rustc-link-lib=dylib={}", f); + } + } + } else { + let base_path = env::var("FFMPEG_LIBS_DIR").ok().unwrap(); + let target_os = env::var("CARGO_CFG_TARGET_OS").ok().unwrap(); + let target_arch = env::var("CARGO_CFG_TARGET_ARCH") + .ok() + .unwrap() + .replace("arm", "armeabi-v7a") + .replace("aarch64", "arm64-v8a"); + let per_arch_path = format!("{}/{}/{}", base_path, target_os, target_arch); + println!("gonna try {}", per_arch_path); + for file in std::fs::read_dir(per_arch_path).unwrap() { + let file_name = file.unwrap().file_name().into_string().unwrap(); + let file_name = lib_name_filter(file_name); + if let Some(f) = file_name { + println!("cargo:rustc-link-lib=dylib={}", f); + } } } From a09688965e2d6aa9eb6296485184cd61a7846e45 Mon Sep 17 00:00:00 2001 From: Lattice 0 Date: Wed, 22 Jun 2022 23:48:37 +0000 Subject: [PATCH 3/5] fix wrong -L path --- build.rs | 24 ++++-------------------- 1 file changed, 4 insertions(+), 20 deletions(-) diff --git a/build.rs b/build.rs index 16d1a3e..7fb0190 100644 --- a/build.rs +++ b/build.rs @@ -271,26 +271,9 @@ mod windows { fn dynamic_linking(env_vars: &EnvVars) { let ffmpeg_dll_path = env_vars.ffmpeg_dll_path.as_ref().unwrap(); - + let ffmpeg_libs_dir = env_vars.ffmpeg_libs_dir.as_ref().unwrap(); let output_binding_path = &env_vars.out_dir.as_ref().unwrap().join("binding.rs"); - // Extract dll name and the dir the dll is in. - let (ffmpeg_dll_name, ffmpeg_dll_dir) = { - let mut ffmpeg_dll_path = PathBuf::from(ffmpeg_dll_path); - // Without extension. - let ffmpeg_dll_filename = ffmpeg_dll_path.file_stem().unwrap(); - let ffmpeg_dll_name = if cfg!(target_os = "windows") { - ffmpeg_dll_filename - } else { - ffmpeg_dll_filename.trim_start_matches("lib") - } - .to_string(); - // Remove file name. - ffmpeg_dll_path.pop(); - let ffmpeg_dll_path = ffmpeg_dll_path.to_string(); - (ffmpeg_dll_name, ffmpeg_dll_path) - }; - let lib_name_filter = |mut file_name: String| -> Option { if file_name.contains(".so") || file_name.contains(".dylib") || file_name.contains(".dll") { file_name = file_name.replace("lib", ""); @@ -302,7 +285,6 @@ fn dynamic_linking(env_vars: &EnvVars) { None } }; - println!("cargo:rustc-link-search=native={}", ffmpeg_dll_dir); if env_vars.ffmpeg_multi_arch_build.as_ref().is_none() { for file in std::fs::read_dir(ffmpeg_dll_path).unwrap() { let file_name = file.unwrap().file_name().into_string().unwrap(); @@ -320,7 +302,9 @@ fn dynamic_linking(env_vars: &EnvVars) { .replace("arm", "armeabi-v7a") .replace("aarch64", "arm64-v8a"); let per_arch_path = format!("{}/{}/{}", base_path, target_os, target_arch); - println!("gonna try {}", per_arch_path); + + println!("cargo:rustc-link-search=native={}", per_arch_path); + for file in std::fs::read_dir(per_arch_path).unwrap() { let file_name = file.unwrap().file_name().into_string().unwrap(); let file_name = lib_name_filter(file_name); From a3e327dafbf25acc03e83d3fa44a0b0756e74954 Mon Sep 17 00:00:00 2001 From: Lattice 0 Date: Thu, 23 Jun 2022 01:11:39 +0000 Subject: [PATCH 4/5] cleanup --- build.rs | 1 - 1 file changed, 1 deletion(-) diff --git a/build.rs b/build.rs index 7fb0190..dabc88a 100644 --- a/build.rs +++ b/build.rs @@ -271,7 +271,6 @@ mod windows { fn dynamic_linking(env_vars: &EnvVars) { let ffmpeg_dll_path = env_vars.ffmpeg_dll_path.as_ref().unwrap(); - let ffmpeg_libs_dir = env_vars.ffmpeg_libs_dir.as_ref().unwrap(); let output_binding_path = &env_vars.out_dir.as_ref().unwrap().join("binding.rs"); let lib_name_filter = |mut file_name: String| -> Option { From 121bd184242f92a79c241a7fb1fda86bd5654e14 Mon Sep 17 00:00:00 2001 From: Lattice 0 Date: Thu, 23 Jun 2022 23:51:18 +0000 Subject: [PATCH 5/5] regex --- Cargo.toml | 1 + build.rs | 6 +++--- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 19006b0..d6717eb 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -28,6 +28,7 @@ libc = "0.2" bindgen = "0.60" camino = "1.0.9" once_cell = "1.12" +regex = "1.5" [target.'cfg(not(windows))'.build-dependencies] pkg-config = "0.3" diff --git a/build.rs b/build.rs index dabc88a..2a22a86 100644 --- a/build.rs +++ b/build.rs @@ -270,11 +270,12 @@ mod windows { } fn dynamic_linking(env_vars: &EnvVars) { + let re = regex::Regex::new(r"\w*.(so|dylib|dll)$").unwrap(); let ffmpeg_dll_path = env_vars.ffmpeg_dll_path.as_ref().unwrap(); let output_binding_path = &env_vars.out_dir.as_ref().unwrap().join("binding.rs"); let lib_name_filter = |mut file_name: String| -> Option { - if file_name.contains(".so") || file_name.contains(".dylib") || file_name.contains(".dll") { + if re.is_match(file_name.as_str()) { file_name = file_name.replace("lib", ""); file_name = file_name.replace(".so", ""); file_name = file_name.replace(".dylib", ""); @@ -300,10 +301,9 @@ fn dynamic_linking(env_vars: &EnvVars) { .unwrap() .replace("arm", "armeabi-v7a") .replace("aarch64", "arm64-v8a"); - let per_arch_path = format!("{}/{}/{}", base_path, target_os, target_arch); + let per_arch_path = format!("{}/{}/{}/lib", base_path, target_os, target_arch); println!("cargo:rustc-link-search=native={}", per_arch_path); - for file in std::fs::read_dir(per_arch_path).unwrap() { let file_name = file.unwrap().file_name().into_string().unwrap(); let file_name = lib_name_filter(file_name);