pub mod archive;
pub mod closure;
pub mod db;
pub mod ldconf;
pub mod path;
pub mod platform;
pub mod prune;
pub use closure::Closure;
pub use db::{Database, Package};
pub use platform::Pin;
pub use prune::{PlatformLine, Policy, Pruned, Trace};
pub const LIB_DIRS: &[&str] = &[
"usr/lib",
"usr/lib64",
"usr/lib32",
"usr/lib/x86_64-linux-gnu",
"usr/lib/aarch64-linux-gnu",
"usr/lib/i386-linux-gnu",
"usr/lib/arm-linux-gnueabihf",
"lib",
"lib64",
"lib32",
"lib/x86_64-linux-gnu",
"lib/aarch64-linux-gnu",
"lib/i386-linux-gnu",
"lib/arm-linux-gnueabihf",
];
pub const LIB_PATHS: &[&str] = &[
"/usr/lib",
"/usr/lib64",
"/usr/lib32",
"/usr/lib/x86_64-linux-gnu",
"/usr/lib/aarch64-linux-gnu",
"/usr/lib/i386-linux-gnu",
"/usr/lib/arm-linux-gnueabihf",
"/lib",
"/lib64",
"/lib32",
"/lib/x86_64-linux-gnu",
"/lib/aarch64-linux-gnu",
"/lib/i386-linux-gnu",
"/lib/arm-linux-gnueabihf",
];
pub fn is_top_level_lib_object(rel: &str) -> bool {
let Some((dir, name)) = rel.rsplit_once('/') else {
return false;
};
LIB_DIRS.contains(&dir) && name.contains(".so")
}
#[cfg(test)]
mod lib_dirs_tests {
use super::is_top_level_lib_object;
#[test]
fn top_level_libraries_in_flat_and_multiarch_dirs() {
assert!(is_top_level_lib_object("usr/lib/libGL.so.1"));
assert!(is_top_level_lib_object("usr/lib64/libEGL.so.1"));
assert!(is_top_level_lib_object(
"usr/lib/x86_64-linux-gnu/libEGL.so.1"
));
assert!(is_top_level_lib_object("lib/aarch64-linux-gnu/libc.so.6"));
}
#[test]
fn nested_or_non_library_files_are_not_top_level() {
assert!(!is_top_level_lib_object("usr/lib/fixture/plugins/a.so"));
assert!(!is_top_level_lib_object("usr/bin/app"));
assert!(!is_top_level_lib_object("usr/share/doc/libfixture/README"));
assert!(!is_top_level_lib_object("libEGL.so.1"));
}
}