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