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    #[serde(default)]
34    pub(crate) prefixes: HashMap<String, PathBuf>,
35}
36
37impl Default for ExternalDependencySearchConfig {
38    fn default() -> Self {
39        Self {
40            bin_patterns: default_bin_patterns(),
41            include_patterns: default_include_patterns(),
42            lib_patterns: default_lib_patterns(),
43            bin_subdir: default_bin_subdir(),
44            include_subdir: default_include_subdir(),
45            lib_subdirs: default_lib_subdirs(),
46            search_prefixes: default_prefixes(),
47            prefixes: HashMap::default(),
48        }
49    }
50}
51
52fn default_bin_patterns() -> Vec<String> {
53    vec!["?".into()]
54}
55
56fn default_include_patterns() -> Vec<String> {
57    vec!["?.h".into()]
58}
59
60#[cfg(target_family = "unix")]
61fn default_lib_patterns() -> Vec<String> {
62    #[cfg(target_os = "macos")]
63    {
64        vec!["lib?.dylib".to_string(), "lib?.a".to_string()]
65    }
66
67    #[cfg(not(target_os = "macos"))]
68    {
69        vec!["lib?.so".to_string(), "lib?.a".to_string()]
70    }
71}
72
73#[cfg(target_family = "windows")]
74fn default_lib_patterns() -> Vec<String> {
75    vec!["?.dll".to_string(), "?.lib".to_string()]
76}
77
78#[cfg(target_family = "unix")]
79fn default_prefixes() -> Vec<PathBuf> {
80    use std::path::PathBuf;
81
82    #[cfg(target_os = "macos")]
83    {
84        vec![
85            PathBuf::from("/usr"),
86            PathBuf::from("/usr/local"),
87            PathBuf::from("/opt/local"),
88            PathBuf::from("/opt/homebrew"),
89            PathBuf::from("/opt"),
90        ]
91    }
92
93    #[cfg(not(target_os = "macos"))]
94    {
95        vec![
96            PathBuf::from("/usr"),
97            PathBuf::from("/usr/local"),
98            PathBuf::from("/opt/local"),
99            PathBuf::from("/opt"),
100        ]
101    }
102}
103
104#[cfg(target_family = "windows")]
105fn default_prefixes() -> Vec<PathBuf> {
106    vec![
107        PathBuf::from(r"C:\Program Files"),
108        PathBuf::from(r"C:\Program Files (x86)"),
109    ]
110}
111
112fn default_bin_subdir() -> String {
113    "bin".into()
114}
115
116fn default_include_subdir() -> String {
117    "include".into()
118}
119
120fn default_lib_subdirs() -> Vec<PathBuf> {
121    vec!["lib".into(), "lib64".into()]
122}