use std::path::PathBuf;
use crate::Error;
#[must_use]
pub fn find_ort_library() -> Option<PathBuf> {
if let Ok(path) = std::env::var("ORT_DYLIB_PATH") {
let path = PathBuf::from(path);
if path.exists() {
return Some(path);
}
}
let exe_dir = std::env::current_exe().ok()?.parent()?.to_path_buf();
let cwd = std::env::current_dir().ok();
#[cfg(target_os = "linux")]
{
if let Some(path) = find_linux_lib(&exe_dir) {
return Some(path);
}
if let Some(ref cwd) = cwd
&& let Some(path) = find_linux_lib(cwd)
{
return Some(path);
}
}
#[cfg(target_os = "windows")]
{
let bundled = exe_dir.join("onnxruntime.dll");
if bundled.exists() {
return Some(bundled);
}
if let Some(ref cwd) = cwd {
let dev = cwd.join("onnxruntime.dll");
if dev.exists() {
return Some(dev);
}
}
}
#[cfg(target_os = "macos")]
{
let bundled = exe_dir.join("lib").join("libonnxruntime.dylib");
if bundled.exists() {
return Some(bundled);
}
if let Some(ref cwd) = cwd {
let dev = cwd.join("lib").join("libonnxruntime.dylib");
if dev.exists() {
return Some(dev);
}
}
}
let _ = cwd;
None
}
#[cfg(target_os = "linux")]
fn find_linux_lib(base_dir: &std::path::Path) -> Option<PathBuf> {
let lib_dir = base_dir.join("lib");
let bundled = lib_dir.join("libonnxruntime.so");
if bundled.exists() {
return Some(bundled);
}
if let Ok(entries) = std::fs::read_dir(&lib_dir) {
for entry in entries.flatten() {
let name = entry.file_name();
let name_str = name.to_string_lossy();
if name_str.starts_with("libonnxruntime.so") {
return Some(entry.path());
}
}
}
None
}
pub fn init_runtime() -> Result<(), Error> {
if let Some(lib_path) = find_ort_library() {
ort::init_from(lib_path.display().to_string())
.commit()
.map_err(|e| Error::RuntimeInit(e.to_string()))?;
}
Ok(())
}
#[cfg(test)]
mod tests {
#![allow(clippy::unwrap_used)]
#![allow(clippy::disallowed_methods)]
#![allow(unsafe_code)]
use super::*;
use crate::skip_if_no_onnx;
use std::env;
#[test]
fn test_find_ort_library_returns_option() {
let _ = find_ort_library();
}
#[test]
fn test_find_ort_library_with_env_var() {
let original = env::var("ORT_DYLIB_PATH").ok();
unsafe {
env::set_var("ORT_DYLIB_PATH", "/nonexistent/path/libonnxruntime.so");
}
let result = find_ort_library();
let _ = result;
unsafe {
if let Some(val) = original {
env::set_var("ORT_DYLIB_PATH", val);
} else {
env::remove_var("ORT_DYLIB_PATH");
}
}
}
#[test]
fn test_find_ort_library_env_var_precedence() {
let original = env::var("ORT_DYLIB_PATH").ok();
if let Some(ref path) = original {
let path_buf = PathBuf::from(path);
if path_buf.exists() {
unsafe {
env::set_var("ORT_DYLIB_PATH", path);
}
let result = find_ort_library();
assert!(result.is_some());
assert_eq!(result.unwrap(), path_buf);
}
}
unsafe {
if let Some(val) = original {
env::set_var("ORT_DYLIB_PATH", val);
} else {
env::remove_var("ORT_DYLIB_PATH");
}
}
}
#[test]
#[cfg(target_os = "linux")]
fn test_find_linux_lib_nonexistent_dir() {
let fake_dir = PathBuf::from("/nonexistent/directory/that/does/not/exist");
let result = find_linux_lib(&fake_dir);
assert!(result.is_none());
}
#[test]
#[cfg(target_os = "linux")]
fn test_find_linux_lib_empty_dir() {
let tmp_dir = env::temp_dir();
let result = find_linux_lib(&tmp_dir);
let _ = result;
}
#[test]
fn test_init_runtime_doesnt_panic() {
skip_if_no_onnx!();
let result = init_runtime();
let _ = result;
}
#[test]
fn test_init_runtime_multiple_calls() {
skip_if_no_onnx!();
let _ = init_runtime();
let _ = init_runtime();
let _ = init_runtime();
}
#[cfg(target_os = "linux")]
#[test]
fn test_find_linux_lib_with_current_dir() {
let cwd = env::current_dir().unwrap();
let result = find_linux_lib(&cwd);
let expected = cwd.join("lib").join("libonnxruntime.so");
if expected.exists() {
assert_eq!(result, Some(expected));
}
}
#[test]
fn test_find_ort_library_consistent_results() {
let result1 = find_ort_library();
let result2 = find_ort_library();
assert_eq!(result1, result2);
}
}