use clap::{CommandFactory, FromArgMatches};
use rllvm::{
cli::{ClangWrapperArgs, verbose_log_level},
compiler_wrapper::{
CompilerKind, CompilerWrapper, CompilerWrapperBuilder, llvm::ClangWrapperBuilder,
},
config::try_rllvm_config,
error::Error,
};
use tracing_subscriber::FmtSubscriber;
pub fn rllvm_main(name: &str, compiler_kind: CompilerKind) -> Result<(), Error> {
let bin_name = match compiler_kind {
CompilerKind::Clang => "rllvm-cc",
CompilerKind::ClangXX => "rllvm-cxx",
};
let matches = ClangWrapperArgs::command().name(bin_name).get_matches();
let args = ClangWrapperArgs::from_arg_matches(&matches).unwrap_or_else(|err| err.exit());
let log_level = match verbose_log_level(args.common.verbose) {
Some(level) => level,
None => try_rllvm_config()?.log_level(),
};
FmtSubscriber::builder()
.with_max_level(log_level)
.with_writer(std::io::stderr)
.init();
let mut cc_builder = ClangWrapperBuilder::new()
.name(name)
.compiler_kind(compiler_kind);
if let Some(compiler) = args.compiler {
cc_builder = cc_builder.wrapped_compiler(compiler);
}
let mut cc = cc_builder.build()?;
if let Some(code) = cc.parse_args(&args.clang_args)?.run()? {
std::process::exit(code);
}
Ok(())
}
pub fn main() -> Result<(), Error> {
rllvm_main("rllvm", CompilerKind::Clang)
}