musikr: link to library

This commit is contained in:
Alexander Capehart 2025-02-06 14:46:15 -07:00
parent ed0abb661c
commit 534f06d7e1
No known key found for this signature in database
GPG key ID: 37DBE3621FE9AD47
3 changed files with 54 additions and 37 deletions

4
musikr/.gitignore vendored
View file

@ -1 +1,3 @@
/build
/build
taglib/build/
taglib/pkg/

View file

@ -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");
}

View file

@ -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;
}
}