1use std::{
6 env,
7 path::{PathBuf, MAIN_SEPARATOR},
8};
9
10use crate::PackageInfo;
11
12pub fn target_triple() -> crate::Result<String> {
22 let arch = if cfg!(target_arch = "x86") {
23 "i686"
24 } else if cfg!(target_arch = "x86_64") {
25 "x86_64"
26 } else if cfg!(target_arch = "arm") {
27 "armv7"
28 } else if cfg!(target_arch = "aarch64") {
29 "aarch64"
30 } else {
31 return Err(crate::Error::Architecture);
32 };
33
34 let os = if cfg!(target_os = "linux") {
35 "unknown-linux"
36 } else if cfg!(target_os = "macos") {
37 "apple-darwin"
38 } else if cfg!(target_os = "windows") {
39 "pc-windows"
40 } else if cfg!(target_os = "freebsd") {
41 "unknown-freebsd"
42 } else {
43 return Err(crate::Error::Os);
44 };
45
46 let os = if cfg!(target_os = "macos") || cfg!(target_os = "freebsd") {
47 String::from(os)
48 } else {
49 let env = if cfg!(target_env = "gnu") {
50 "gnu"
51 } else if cfg!(target_env = "musl") {
52 "musl"
53 } else if cfg!(target_env = "msvc") {
54 "msvc"
55 } else {
56 return Err(crate::Error::Environment);
57 };
58
59 format!("{}-{}", os, env)
60 };
61
62 Ok(format!("{}-{}", arch, os))
63}
64
65pub fn resource_dir(package_info: &PackageInfo) -> crate::Result<PathBuf> {
78 let exe = std::env::current_exe()?;
79 let exe_dir = exe.parent().expect("failed to get exe directory");
80 let curr_dir = exe_dir.display().to_string();
81
82 if curr_dir.ends_with(format!("{S}target{S}debug", S = MAIN_SEPARATOR).as_str())
83 || curr_dir.ends_with(format!("{S}target{S}release", S = MAIN_SEPARATOR).as_str())
84 || cfg!(target_os = "windows")
85 {
86 return Ok(exe_dir.to_path_buf());
88 }
89
90 if cfg!(target_os = "linux") {
91 if curr_dir.ends_with("/data/usr/bin") {
92 Ok(exe_dir.join(format!("../lib/{}", package_info.package_name())))
94 } else if let Ok(appdir) = env::var("APPDIR") {
95 Ok(PathBuf::from(format!(
96 "{}/usr/lib/{}",
97 appdir,
98 package_info.package_name()
99 )))
100 } else {
101 Ok(PathBuf::from(format!(
103 "/usr/lib/{}",
104 package_info.package_name()
105 )))
106 }
107 } else if cfg!(target_os = "macos") {
108 Ok(exe_dir.join("../Resources"))
109 } else {
110 Err(crate::Error::UnsupportedPlatform)
111 }
112}