musikr: link to library
This commit is contained in:
parent
ed0abb661c
commit
534f06d7e1
3 changed files with 54 additions and 37 deletions
4
musikr/.gitignore
vendored
4
musikr/.gitignore
vendored
|
@ -1 +1,3 @@
|
||||||
/build
|
/build
|
||||||
|
taglib/build/
|
||||||
|
taglib/pkg/
|
|
@ -5,26 +5,18 @@ use cxx_build;
|
||||||
|
|
||||||
fn main() {
|
fn main() {
|
||||||
let working_dir = env::current_dir().expect("Failed to get current working directory");
|
let working_dir = env::current_dir().expect("Failed to get current working directory");
|
||||||
|
let target = env::var("TARGET").expect("TARGET env var not set");
|
||||||
// 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 working_dir = Path::new(&working_dir);
|
let working_dir = Path::new(&working_dir);
|
||||||
|
|
||||||
// Define directories.
|
// Define directories
|
||||||
let taglib_src_dir = working_dir.join("taglib");
|
let taglib_src_dir = working_dir.join("taglib");
|
||||||
let taglib_build_dir = taglib_src_dir.join("build");
|
let taglib_build_dir = taglib_src_dir.join("build");
|
||||||
let taglib_pkg_dir = taglib_src_dir.join("pkg");
|
let taglib_pkg_dir = taglib_src_dir.join("pkg");
|
||||||
let ndk_toolchain = working_dir.join("android.toolchain.cmake");
|
|
||||||
|
|
||||||
// Define architectures.
|
// Determine if building for Android
|
||||||
let target = env::var("TARGET").expect("TARGET env var not set");
|
let is_android = target.contains("android");
|
||||||
|
|
||||||
|
// Get architecture
|
||||||
let arch = if target.contains("x86_64") {
|
let arch = if target.contains("x86_64") {
|
||||||
"x86_64"
|
"x86_64"
|
||||||
} else if target.contains("i686") {
|
} else if target.contains("i686") {
|
||||||
|
@ -40,24 +32,42 @@ fn main() {
|
||||||
let arch_build_dir = taglib_build_dir.join(arch);
|
let arch_build_dir = taglib_build_dir.join(arch);
|
||||||
let arch_pkg_dir = taglib_pkg_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")
|
let status = Command::new("cmake")
|
||||||
.arg("-B")
|
.args(&cmake_args)
|
||||||
.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")
|
|
||||||
.current_dir(&taglib_src_dir)
|
.current_dir(&taglib_src_dir)
|
||||||
.status()
|
.status()
|
||||||
.expect("Failed to run cmake configure");
|
.expect("Failed to run cmake configure");
|
||||||
|
@ -65,7 +75,7 @@ fn main() {
|
||||||
panic!("cmake configure failed for arch {}", arch);
|
panic!("cmake configure failed for arch {}", arch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Build step.
|
// Build step
|
||||||
let status = Command::new("cmake")
|
let status = Command::new("cmake")
|
||||||
.arg("--build")
|
.arg("--build")
|
||||||
.arg(arch_build_dir.to_str().unwrap())
|
.arg(arch_build_dir.to_str().unwrap())
|
||||||
|
@ -78,7 +88,7 @@ fn main() {
|
||||||
panic!("cmake build failed for arch {}", arch);
|
panic!("cmake build failed for arch {}", arch);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Install step.
|
// Install step
|
||||||
let status = Command::new("cmake")
|
let status = Command::new("cmake")
|
||||||
.arg("--install")
|
.arg("--install")
|
||||||
.arg(arch_build_dir.to_str().unwrap())
|
.arg(arch_build_dir.to_str().unwrap())
|
||||||
|
@ -93,9 +103,11 @@ fn main() {
|
||||||
panic!("cmake install failed for arch {}", arch);
|
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")
|
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")
|
.flag_if_supported("-std=c++14")
|
||||||
.compile("taglib_cxx_bindings");
|
.compile("taglib_cxx_bindings");
|
||||||
// println!("cargo:rerun-if-changed=src/lib.rs");
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -6,7 +6,10 @@ use jni::JNIEnv;
|
||||||
mod ffi {
|
mod ffi {
|
||||||
unsafe extern "C++" {
|
unsafe extern "C++" {
|
||||||
include!("taglib/taglib.h");
|
include!("taglib/taglib.h");
|
||||||
// Add the C++ APIs you need to call.
|
|
||||||
|
type FileRef;
|
||||||
|
|
||||||
|
type File;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue