Skip to main content

lux_lib/config/
external_deps.rs

1use std::{collections::HashMap, path::PathBuf};
2
3use serde::{Deserialize, Serialize};
4
5/// Used as a fallback when searching for external dependencies if they
6/// cannot be found using pkg-config.
7#[derive(Debug, Clone, Serialize, Deserialize)]
8#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
9pub struct ExternalDependencySearchConfig {
10    /// Patterns for binary files
11    #[serde(default = "default_bin_patterns")]
12    pub(crate) bin_patterns: Vec<String>,
13    /// Patterns for header files
14    #[serde(default = "default_include_patterns")]
15    pub(crate) include_patterns: Vec<String>,
16    /// Patterns for library files
17    #[serde(default = "default_lib_patterns")]
18    pub(crate) lib_patterns: Vec<String>,
19    /// Default binary subdirectory
20    #[serde(default = "default_bin_subdir")]
21    pub(crate) bin_subdir: String,
22    /// Default include subdirectory
23    #[serde(default = "default_include_subdir")]
24    pub(crate) include_subdir: String,
25    /// Default library subdirectory
26    #[serde(default = "default_lib_subdirs")]
27    pub(crate) lib_subdirs: Vec<PathBuf>,
28    /// System-wide search paths
29    #[serde(default = "default_prefixes")]
30    pub(crate) search_prefixes: Vec<PathBuf>,
31    /// Known installation prefixes for specific dependencies.
32    /// These can also be set via environment variables.
33    pub(crate) prefixes: HashMap<String, PathBuf>,
34}
35
36impl Default for ExternalDependencySearchConfig {
37    fn default() -> Self {
38        Self {
39            bin_patterns: default_bin_patterns(),
40            include_patterns: default_include_patterns(),
41            lib_patterns: default_lib_patterns(),
42            bin_subdir: default_bin_subdir(),
43            include_subdir: default_include_subdir(),
44            lib_subdirs: default_lib_subdirs(),
45            search_prefixes: default_prefixes(),
46            prefixes: HashMap::default(),
47        }
48    }
49}
50
51fn default_bin_patterns() -> Vec<String> {
52    vec!["?".into()]
53}
54
55fn default_include_patterns() -> Vec<String> {
56    vec!["?.h".into()]
57}
58
59#[cfg(target_family = "unix")]
60fn default_lib_patterns() -> Vec<String> {
61    #[cfg(target_os = "macos")]
62    {
63        vec!["lib?.dylib".to_string(), "lib?.a".to_string()]
64    }
65
66    #[cfg(not(target_os = "macos"))]
67    {
68        vec!["lib?.so".to_string(), "lib?.a".to_string()]
69    }
70}
71
72#[cfg(target_family = "windows")]
73fn default_lib_patterns() -> Vec<String> {
74    vec!["?.dll".to_string(), "?.lib".to_string()]
75}
76
77#[cfg(target_family = "unix")]
78fn default_prefixes() -> Vec<PathBuf> {
79    use std::path::PathBuf;
80
81    #[cfg(target_os = "macos")]
82    {
83        vec![
84            PathBuf::from("/usr"),
85            PathBuf::from("/usr/local"),
86            PathBuf::from("/opt/local"),
87            PathBuf::from("/opt/homebrew"),
88            PathBuf::from("/opt"),
89        ]
90    }
91
92    #[cfg(not(target_os = "macos"))]
93    {
94        vec![
95            PathBuf::from("/usr"),
96            PathBuf::from("/usr/local"),
97            PathBuf::from("/opt/local"),
98            PathBuf::from("/opt"),
99        ]
100    }
101}
102
103#[cfg(target_family = "windows")]
104fn default_prefixes() -> Vec<PathBuf> {
105    vec![
106        PathBuf::from(r"C:\Program Files"),
107        PathBuf::from(r"C:\Program Files (x86)"),
108    ]
109}
110
111fn default_bin_subdir() -> String {
112    "bin".into()
113}
114
115fn default_include_subdir() -> String {
116    "include".into()
117}
118
119fn default_lib_subdirs() -> Vec<PathBuf> {
120    vec!["lib".into(), "lib64".into()]
121}