From 534f06d7e130c761519e54d3a2520d81a42e506e Mon Sep 17 00:00:00 2001 From: Alexander Capehart Date: Thu, 6 Feb 2025 14:46:15 -0700 Subject: [PATCH] musikr: link to library --- musikr/.gitignore | 4 +- musikr/src/main/jni/build.rs | 82 +++++++++++++++++++--------------- musikr/src/main/jni/src/lib.rs | 5 ++- 3 files changed, 54 insertions(+), 37 deletions(-) diff --git a/musikr/.gitignore b/musikr/.gitignore index 42afabfd2..17ff261a6 100644 --- a/musikr/.gitignore +++ b/musikr/.gitignore @@ -1 +1,3 @@ -/build \ No newline at end of file +/build +taglib/build/ +taglib/pkg/ \ No newline at end of file diff --git a/musikr/src/main/jni/build.rs b/musikr/src/main/jni/build.rs index 2ae4500b9..8ff16d904 100644 --- a/musikr/src/main/jni/build.rs +++ b/musikr/src/main/jni/build.rs @@ -5,26 +5,18 @@ use cxx_build; fn main() { let working_dir = env::current_dir().expect("Failed to get current working directory"); - - // New: Extract ndk path from CLANG_PATH. - let clang_path = env::var("CLANG_PATH").expect("CLANG_PATH env var not set"); - let toolchains_marker = "/toolchains"; - let ndk_path = if let Some(pos) = clang_path.find(toolchains_marker) { - &clang_path[..pos] - } else { - panic!("CLANG_PATH does not contain '{}'", toolchains_marker); - }; - + let target = env::var("TARGET").expect("TARGET env var not set"); let working_dir = Path::new(&working_dir); - // Define directories. + // Define directories let taglib_src_dir = working_dir.join("taglib"); let taglib_build_dir = taglib_src_dir.join("build"); let taglib_pkg_dir = taglib_src_dir.join("pkg"); - let ndk_toolchain = working_dir.join("android.toolchain.cmake"); - // Define architectures. - let target = env::var("TARGET").expect("TARGET env var not set"); + // Determine if building for Android + let is_android = target.contains("android"); + + // Get architecture let arch = if target.contains("x86_64") { "x86_64" } else if target.contains("i686") { @@ -40,24 +32,42 @@ fn main() { let arch_build_dir = taglib_build_dir.join(arch); let arch_pkg_dir = taglib_pkg_dir.join(arch); - // Configure step. + // Prepare cmake command + let mut cmake_args = vec![ + "-B".to_string(), + arch_build_dir.to_str().unwrap().to_string(), + "-DBUILD_SHARED_LIBS=OFF".to_string(), + "-DVISIBILITY_HIDDEN=ON".to_string(), + "-DBUILD_TESTING=OFF".to_string(), + "-DBUILD_EXAMPLES=OFF".to_string(), + "-DBUILD_BINDINGS=OFF".to_string(), + "-DWITH_ZLIB=OFF".to_string(), + "-DCMAKE_BUILD_TYPE=Release".to_string(), + "-DCMAKE_CXX_FLAGS=-fPIC".to_string(), + ]; + + // Add Android-specific arguments if building for Android + if is_android { + let clang_path = env::var("CLANG_PATH").expect("CLANG_PATH env var not set"); + let toolchains_marker = "/toolchains"; + let ndk_path = if let Some(pos) = clang_path.find(toolchains_marker) { + &clang_path[..pos] + } else { + panic!("CLANG_PATH does not contain '{}'", toolchains_marker); + }; + + let ndk_toolchain = working_dir.join("android.toolchain.cmake"); + + cmake_args.extend(vec![ + format!("-DANDROID_NDK_PATH={}", ndk_path), + format!("-DCMAKE_TOOLCHAIN_FILE={}", ndk_toolchain.to_str().unwrap()), + format!("-DANDROID_ABI={}", arch), + ]); + } + + // Configure step let status = Command::new("cmake") - .arg("-B") - .arg(arch_build_dir.to_str().unwrap()) - .arg(format!("-DANDROID_NDK_PATH={}", ndk_path)) - .arg(format!( - "-DCMAKE_TOOLCHAIN_FILE={}", - ndk_toolchain.to_str().unwrap() - )) - .arg(format!("-DANDROID_ABI={}", arch)) - .arg("-DBUILD_SHARED_LIBS=OFF") - .arg("-DVISIBILITY_HIDDEN=ON") - .arg("-DBUILD_TESTING=OFF") - .arg("-DBUILD_EXAMPLES=OFF") - .arg("-DBUILD_BINDINGS=OFF") - .arg("-DWITH_ZLIB=OFF") - .arg("-DCMAKE_BUILD_TYPE=Release") - .arg("-DCMAKE_CXX_FLAGS=-fPIC") + .args(&cmake_args) .current_dir(&taglib_src_dir) .status() .expect("Failed to run cmake configure"); @@ -65,7 +75,7 @@ fn main() { panic!("cmake configure failed for arch {}", arch); } - // Build step. + // Build step let status = Command::new("cmake") .arg("--build") .arg(arch_build_dir.to_str().unwrap()) @@ -78,7 +88,7 @@ fn main() { panic!("cmake build failed for arch {}", arch); } - // Install step. + // Install step let status = Command::new("cmake") .arg("--install") .arg(arch_build_dir.to_str().unwrap()) @@ -93,9 +103,11 @@ fn main() { panic!("cmake install failed for arch {}", arch); } + println!("cargo:rustc-link-search=native={}/lib", arch_pkg_dir.display()); + println!("cargo:rustc-link-lib=static=tag"); + cxx_build::bridge("src/lib.rs") - .include(format!["taglib/pkg/{}/include", arch]) // path to Taglib includes + .include(format!["taglib/pkg/{}/include", arch]) .flag_if_supported("-std=c++14") .compile("taglib_cxx_bindings"); - // println!("cargo:rerun-if-changed=src/lib.rs"); } diff --git a/musikr/src/main/jni/src/lib.rs b/musikr/src/main/jni/src/lib.rs index 67b6a6e90..147a0a6f2 100644 --- a/musikr/src/main/jni/src/lib.rs +++ b/musikr/src/main/jni/src/lib.rs @@ -6,7 +6,10 @@ use jni::JNIEnv; mod ffi { unsafe extern "C++" { include!("taglib/taglib.h"); - // Add the C++ APIs you need to call. + + type FileRef; + + type File; } }