mod compiler_driver;
pub(crate) mod detect;
mod gnu_ld;
mod msvc_link;
mod types;
#[cfg(test)]
mod tests;
pub use detect::{is_link_invocation, is_linker};
pub use types::{CacheableLink, LinkerFamily, ParsedLinkerInvocation};
use compiler_driver::parse_compiler_driver_link;
use detect::{detect_family, is_compiler_driver};
use gnu_ld::parse_gnu_ld;
use msvc_link::parse_msvc_link;
#[must_use]
pub fn parse_linker_invocation(tool: &str, args: Vec<String>) -> ParsedLinkerInvocation {
if let Some(family) = detect_family(tool) {
return match family {
LinkerFamily::MsvcLink => parse_msvc_link(tool, args),
LinkerFamily::Ld | LinkerFamily::Lld => parse_gnu_ld(tool, family, args),
LinkerFamily::CompilerDriver => parse_compiler_driver_link(tool, args),
};
}
if is_compiler_driver(tool) {
return parse_compiler_driver_link(tool, args);
}
ParsedLinkerInvocation::NonCacheable {
reason: format!("not a recognized linker: {tool}"),
}
}